mcpField
D
dse-loop

dse-loop

github.com/wanshuiyin開発18.2k498 回インストール4 日前に更新
リポジトリ

dse-loop について

dse-loop は、コンピューターアーキテクチャや EDA の設計空間を自律的に探索するスキルです。プログラムを反復実行し、機械判定可能な指標を分析・記録して、目標または停止条件に達するまで探索します。

主な機能

  1. 01パラメーターの反復探索
  2. 02不足する範囲の推定
  3. 03制約と指標の追跡
  4. 04実行記録と状態保存
  5. 05最終レポートの作成

活用シーン

  1. 01シミュレーションのキャッシュやパイプライン設定の調整
  2. 02面積とタイミングを満たす合成設定の探索
  3. 03RTL パラメーターとスループット目標の比較

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill dse-loop

インストール後、Claude Code で/dse-loopを入力して読み込まれたか確認します。

詳細

DSE Loop:自律型設計空間探索

🔁 このスキルを /loop / CronCreate でラップしないでください。 目標を達成するか、タイムアウトになるまで、内部ですでにループします。判定結果を伴うレビュー/監査スキルとは異なり、このスキルの停止ゲートは客観的で機械的に検証可能な指標(Type-A)であるため、同じモデルによる自己終了は安全です。ラップしてはいけない理由は、判定フェンスではなくスケジューラーの重複です。詳しくは shared-references/external-cadence.md を参照してください。

設計空間を自律的に探索します。実行 → 分析 → 次のパラメーターを選択、を目標の達成またはタイムアウトまで繰り返します。コンピューターアーキテクチャやEDAの問題向けに設計されています。

コンテキスト:$ARGUMENTS

安全ルール — 最初に読むこと

以下の操作は絶対に行わないでください。

  • sudo を使った操作
  • rm -rf、rm -r、または再帰的な削除
  • このセッションで自分が作成していないファイルの rm
  • 既存のソースファイルを先に読まずに上書きすること
  • git push、git reset --hard、または破壊的なGit操作
  • 自分が起動していないプロセスの終了

いずれかが必要な手順がある場合は、作業を停止してユーザーに報告してください。

定数($ARGUMENTS で上書きできます)

定数デフォルト説明
TIMEOUT2h合計の実時間予算です。この時間が経過したら探索を停止します。
MAX_ITERATIONS50評価する設計点数の上限です。
PATIENCE10改善が連続してこの回数だけ見られなかった場合、早期に停止します。
OBJECTIVEminimize対象指標を minimize または maximize します。

インラインで上書きします:/dse-loop "task desc — timeout: 4h, max_iterations: 100, patience: 15"

典型的なユースケース

問題プログラムパラメーター目的
マイクロアーキテクチャのDSEgem5シミュレーションキャッシュサイズ、連想度、パイプライン幅、ROBサイズ、分岐予測器IPCの最大化、または面積×遅延の最小化
合成の調整yosys/DCスクリプト最適化パス、目標周波数、処理レベルタイミング収束時の面積の最小化
RTLのパラメーター化verilatorシミュレーションデータ幅、FIFOの深さ、パイプライン段数、バッファーサイズ最小面積でスループット目標を達成
コンパイラーフラグgcc/llvmビルド+ベンチマーク-Oレベル、アンロール係数、ベクトル化、スケジューリング実行時間またはコードサイズの最小化
配置配線openroad/innovus使用率、アスペクト比、レイヤー設定配線長/タイミングの最小化
フォーマル検証abc/sbyバウンド深度、エンジン、プロパティごとのタイムアウト時間予算内でカバレッジを最大化
メモリーサブシステムcacti / ramulatorバンク数、ロウバッファーポリシー、スケジューリング帯域幅/エネルギーの最適化

ワークフロー

フェーズ 0:タスクの解析と準備
  1. $ARGUMENTS を解析して、以下を抽出します。

    • プログラム:実行するもの(コマンド、スクリプト、または Makefile ターゲット)
    • パラメーター空間:調整するノブとその範囲/選択肢(不完全な場合があります。手順 2 を参照してください)
    • 目的指標:最適化するもの(および出力からの抽出方法)
    • 制約条件:違反してはならないハードリミット(例:タイミングを満たすこと)
    • タイムアウト:実時間の予算
    • 成功基準:どの時点で結果が「十分に良い」と判断し、早期終了するか
  2. 不足しているパラメーター範囲を推定します。ユーザーがパラメーター名を指定していても、範囲/選択肢を指定していない場合は、探索を始める前に必ず推定してください。

    a. ソースコードを読む — コードベース内でパラメーター名を検索します。

    • argparse/click の定義、設定ファイル、Makefile 変数、モジュールパラメーター、#define、parameter(SystemVerilog)、localparam などを確認します。
    • デフォルト値、型、有効値の手がかりとなるコメントを抽出します。

    b. ドメイン知識を適用して、妥当な範囲を設定します。

    パラメーターの種類推定方法
    キャッシュ/メモリサイズ2 の累乗。通常は 1KB~16MB
    連想度2 の累乗:1、2、4、8、16
    パイプライン幅/発行幅小さな整数:1、2、4、8
    バッファー/キュー/FIFO の深さ2 の累乗:4、8、16、32、64
    クロック周期/周波数プロセスノードに基づき、デフォルト値の ±50% を試します
    境界深度(BMC/形式検証)等比数列:5、10、20、50、100
    タイムアウト値等比数列:10s、30s、60s、120s、300s
    ブール値/列挙型フラグソースで見つかったすべての選択肢を列挙します
    連続値(学習率、しきい値)対数スケールでスイープします。デフォルト値を中心に 2 桁の範囲をカバーする 5 点
    整数カウント(スレッド数、コア数)1 からハードウェアの最大数まで線形に設定します

    c. まずは控えめに開始します。パラメーターごとに 3~5 個の値から始めます。最良の結果が境界値になった場合は、後から範囲を広げます。

    d. 推定した範囲を記録します。推定したパラメーター空間を dse_results/inferred_params.md に書き込み、ユーザーが確認できるようにします。

    # 推定されたパラメーター空間
    
    | パラメーター | ソース | デフォルト | 推定範囲 | 推定理由 |
    |-----------|--------|---------|---------------|-----------|
    | CACHE_SIZE | config.py:42 | 32768 | [8192, 16384, 32768, 65536, 131072] | 2 の累乗、デフォルト値の ±2 倍 |
    | ASSOC | config.py:43 | 4 | [1, 2, 4, 8] | 標準的な連想度 |
    | BMC_DEPTH | run_bmc.py:15 | 10 | [5, 10, 20, 50] | 等比数列、一般的な BMC の深度 |
    

    e. 境界の拡張 — 探索中に最良の結果が範囲の最小値または最大値になった場合、その方向に 1 ステップ分、自動的に範囲を広げます(拡張内容を記録してください)。

  3. プロジェクトを読み、以下を確認します。

    • プログラムの実行方法
    • 結果の出力先(stdout、ログファイル、レポート)
    • 出力から目的指標を解析する方法
    • 現在/ベースラインの設定(ある場合)
  4. 作業ディレクトリを作成します。プロジェクトのルートに dse_results/ を作成します。

    • dse_results/dse_log.csv — 設計点ごとに 1 行
    • dse_results/DSE_REPORT.md — 最終レポート
    • dse_results/DSE_STATE.json — 復旧用の状態
    • dse_results/inferred_params.md — 推定したパラメーター空間(範囲が指定されていない場合)
    • dse_results/configs/ — 各実行の設定ファイル
    • dse_results/outputs/ — 各実行の生出力
  5. パラメーター抽出スクリプト(dse_results/parse_result.py など)を作成します。このスクリプトは、実行時の出力を受け取り、目的指標を数値として返します。まずベースライン実行でテストしてください。

  6. ベースラインを実行します(イテレーション 0)。デフォルト/現在のパラメーターでプログラムを実行し、ベースライン指標を記録します。これを超えることが目標です。

フェーズ 1:初期探索

目標:まず広く調べて、どのパラメーターが最も重要かをすばやく把握します。

戦略:ラテン超方格サンプリング、または主要なパラメーターを対象とした体系的な探索を行います。

  1. パラメーター範囲を幅広くカバーする、多様な設計点を 5~10 個選びます
  2. 実行します(独立している場合は並列で、バックグラウンドプロセスまたは順次で実行します)
  3. すべての結果を dse_log.csv に記録します:
    iteration,param1,param2,...,metric,constraint_met,timestamp,notes
    0,default,default,...,baseline_val,yes,2026-03-13T10:00:00,baseline
    1,val1a,val2a,...,result1,yes,2026-03-13T10:05:00,initial sweep
    ...
    
  4. 分析します:目的関数に最も大きく影響するパラメーターはどれでしょうか?
  5. 最も感度の高いパラメーターに探索範囲を絞ります
フェーズ 2:方向性を定めた探索

目標:十分な情報に基づいて選択し、最適値に収束させます。

戦略:適応的に、問題に適した手法を選びます。

  • パラメーターが少ない場合(≤3):フェーズ 1 で最良だった領域を中心に、細かいグリッド探索を行います
  • パラメーターが多い場合(>3):座標降下法を使います。現在の最良値で他のパラメーターを固定し、パラメーターを 1 つずつ最適化します
  • バイナリ/カテゴリーパラメーター:有望な組み合わせを列挙します
  • 連続パラメーター:最良の隣接点の間で二分探索または黄金分割探索を行います
  • 多目的最適化:パレートフロンティアを追跡し、その前線に沿って探索します

各反復で:

  1. これまでの結果に基づいて、次の設計点を選択します:

    • 傾向を確認します。どの方向に進めると指標が改善するでしょうか?
    • すでに評価済みの構成を再実行しないようにします
    • 探索(未評価の領域)と活用(現在の最良値の近傍)のバランスを取ります
  2. パラメーターを変更します:設定ファイル、コマンドライン引数、またはソース内の定数を編集します

  3. プログラムを実行します:実行して出力を取得します

  4. 結果を解析します:目的指標を抽出し、制約を確認します

  5. dse_log.csv に記録します:新しい行を追加します

  6. 停止条件を確認します:

    • タイムアウトに達しましたか? → 停止します
    • 最大反復回数に達しましたか? → 停止します
    • 忍耐回数を使い切りましたか(N 回の反復で改善なし)? → 停止します
    • 成功基準を満たしましたか(指標が「十分良好」ですか)? → 停止します
    • 制約違反のパターンが検出されましたか? → 探索範囲を調整します
  7. DSE_STATE.json を更新します:

    {
      "iteration": 15,
      "status": "in_progress",
      "best_metric": 1.23,
      "best_params": {"cache_size": 32768, "assoc": 4, "pipeline_width": 2},
      "total_iterations": 15,
      "start_time": "2026-03-13T10:00:00",
      "timeout": "2h",
      "patience_counter": 3
    }
    
  8. 次のステップを決定します → ステップ 1 に戻ります

フェーズ 3:調整(時間に余裕がある場合)

探索が収束し、まだ時間に余裕がある場合:

  1. 局所的な摂動:最良点の各パラメーターについて、±1 ステップを試します
  2. 感度分析:指標を悪化させずに緩和できるパラメーターはどれでしょうか?
  3. 制約境界:制約がほぼ上限に達している場合は、実行可能領域に近い点を探索します
フェーズ 4:レポート

dse_results/DSE_REPORT.md を作成します:

# Design Space Exploration Report

**Task**: [description]
**Date**: [start] → [end]
**Total iterations**: N
**Wall-clock time**: X hours Y minutes

## Objective
- **Metric**: [what was optimized]
- **Direction**: minimize / maximize
- **Baseline**: [value]
- **Best found**: [value] ([improvement]% better than baseline)

## Best Configuration
| Parameter | Baseline | Best |
|-----------|----------|------|
| param1    | default  | best_val |
| param2    | default  | best_val |
| ...       | ...      | ... |

## Search Trajectory
| Iteration | param1 | param2 | ... | Metric | Notes |
|-----------|--------|--------|-----|--------|-------|
| 0 (baseline) | ... | ... | ... | ... | baseline |
| 1 | ... | ... | ... | ... | initial sweep |
| ... | ... | ... | ... | ... | ... |
| N (best) | ... | ... | ... | ... | ★ best |

## Parameter Sensitivity
- **param1**: [high/medium/low impact] — [brief explanation]
- **param2**: [high/medium/low impact] — [brief explanation]

## Pareto Frontier (if multi-objective)
[Table or description of non-dominated points]

## Stopping Reason
[timeout / max_iterations / patience / success_criteria_met]

## Recommendations
- [actionable insights from the exploration]
- [which parameters matter most]
- [suggested follow-up explorations]

matplotlib が利用可能な場合は、要約プロットも生成します:

  • 収束曲線(指標と反復回数)
  • パラメーター感度の棒グラフ
  • パレートフロンティアの散布図(多目的最適化の場合)

状態の復元

実行中にコンテキストウィンドウが圧縮された場合、ループは DSE_STATE.json と dse_log.csv から状態を復元します:

  1. DSE_STATE.json を読み込み、現在の反復回数、最良パラメーター、忍耐カウンターを確認します
  2. dse_log.csv を読み込み、全履歴を確認します
  3. 次の反復から再開します

重要なルール

  • 自律的に作業してください。反復ごとにユーザーに許可を求めないでください
  • すべての実行を記録してください。失敗した実行、制約違反、エラーも例外ではありません。ログが唯一の信頼できる情報源です。
  • 同一の設定で再実行しないでください。各実行の前に dse_log.csv を確認してください
  • タイムアウトを守ってください。新しい反復を開始する前に経過時間を確認してください。次の実行がタイムアウトを超える可能性が高い場合は、停止して報告してください。
  • メトリクスをプログラムで解析してください。目視でログを確認するのではなく、解析スクリプトを作成してください
  • 生の出力を保持してください。各実行の完全な出力を dse_results/outputs/iter_N/ に保存してください
  • 制約違反は改善ではありません。制約に違反する設計点は、メトリクスに関係なく、決して「最良」ではありません
  • 実行がクラッシュした場合は、エラーを記録し、その点をスキップして次に進んでください
  • 異なる設定で同じクラッシュが3回繰り返された場合は、ハーネスコード自体に問題があると考えられます。実行/解析スクリプトを仕様に基づいて一から実装し直してください (別のパッチへ移るピア操作です。削除するのはスクリプトのみとし、dse_log.csv/ dse_results/ は削除しないでください。shared-references/external-cadence.md § Let a broken attempt restart, not just patch を参照)。スイープを再開する前に、メトリクスの比較可能性を再検証してください。新しいパーサーで dse_results/outputs/iter_N/ の完了済み反復の生出力を1つ再解析し、dse_log.csv のその行と一致することを確認してください。一致しない場合は、パーサーを修正するか、影響を受けるすべての行を再解析してその旨を記録してください。同じログに異なる解析方式を混在させてはいけません。一から実装し直しても同じようにクラッシュする場合は、停止して報告してください。その場合、仕様または環境に問題があり、人間による対応が必要です

実行例

# Minimal — just name the parameters, let the agent figure out ranges
/dse-loop "Run gem5 mcf benchmark. Tune: L1D_SIZE, L2_SIZE, ROB_ENTRIES. Objective: maximize IPC. Timeout: 3h"

# Partial — some ranges given, some not
/dse-loop "Run make synth. Tune: CLOCK_PERIOD [5ns, 4ns, 3ns, 2ns], FLATTEN, ABC_SCRIPT. Objective: minimize area at timing closure. Timeout: 1h"

# Fully specified — explicit ranges for everything
/dse-loop "Simulate processor with FIFO_DEPTH [4,8,16,32], ISSUE_WIDTH [1,2,4], PREFETCH [on,off]. Run: make sim. Objective: max throughput/area. Timeout: 2h"

# Real-world: PDAG-SFA formal verification tuning
/dse-loop "Run python run_bmc.py. Tune: BMC_DEPTH, ENGINE, TIMEOUT_PER_PROP. Objective: maximize properties proved. Timeout: 2h"

コメント