dse-loop について
dse-loop は、コンピューターアーキテクチャや EDA の設計空間を自律的に探索するスキルです。プログラムを反復実行し、機械判定可能な指標を分析・記録して、目標または停止条件に達するまで探索します。
主な機能
- 01パラメーターの反復探索
- 02不足する範囲の推定
- 03制約と指標の追跡
- 04実行記録と状態保存
- 05最終レポートの作成
活用シーン
- 01シミュレーションのキャッシュやパイプライン設定の調整
- 02面積とタイミングを満たす合成設定の探索
- 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 で上書きできます)
| 定数 | デフォルト | 説明 |
|---|---|---|
TIMEOUT | 2h | 合計の実時間予算です。この時間が経過したら探索を停止します。 |
MAX_ITERATIONS | 50 | 評価する設計点数の上限です。 |
PATIENCE | 10 | 改善が連続してこの回数だけ見られなかった場合、早期に停止します。 |
OBJECTIVE | minimize | 対象指標を minimize または maximize します。 |
インラインで上書きします:/dse-loop "task desc — timeout: 4h, max_iterations: 100, patience: 15"
典型的なユースケース
| 問題 | プログラム | パラメーター | 目的 |
|---|---|---|---|
| マイクロアーキテクチャのDSE | gem5シミュレーション | キャッシュサイズ、連想度、パイプライン幅、ROBサイズ、分岐予測器 | IPCの最大化、または面積×遅延の最小化 |
| 合成の調整 | yosys/DCスクリプト | 最適化パス、目標周波数、処理レベル | タイミング収束時の面積の最小化 |
| RTLのパラメーター化 | verilatorシミュレーション | データ幅、FIFOの深さ、パイプライン段数、バッファーサイズ | 最小面積でスループット目標を達成 |
| コンパイラーフラグ | gcc/llvmビルド+ベンチマーク | -Oレベル、アンロール係数、ベクトル化、スケジューリング | 実行時間またはコードサイズの最小化 |
| 配置配線 | openroad/innovus | 使用率、アスペクト比、レイヤー設定 | 配線長/タイミングの最小化 |
| フォーマル検証 | abc/sby | バウンド深度、エンジン、プロパティごとのタイムアウト | 時間予算内でカバレッジを最大化 |
| メモリーサブシステム | cacti / ramulator | バンク数、ロウバッファーポリシー、スケジューリング | 帯域幅/エネルギーの最適化 |
ワークフロー
フェーズ 0:タスクの解析と準備
-
$ARGUMENTS を解析して、以下を抽出します。
- プログラム:実行するもの(コマンド、スクリプト、または Makefile ターゲット)
- パラメーター空間:調整するノブとその範囲/選択肢(不完全な場合があります。手順 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 ステップ分、自動的に範囲を広げます(拡張内容を記録してください)。
- argparse/click の定義、設定ファイル、Makefile 変数、モジュールパラメーター、
-
プロジェクトを読み、以下を確認します。
- プログラムの実行方法
- 結果の出力先(stdout、ログファイル、レポート)
- 出力から目的指標を解析する方法
- 現在/ベースラインの設定(ある場合)
-
作業ディレクトリを作成します。プロジェクトのルートに
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/— 各実行の生出力
-
パラメーター抽出スクリプト(
dse_results/parse_result.pyなど)を作成します。このスクリプトは、実行時の出力を受け取り、目的指標を数値として返します。まずベースライン実行でテストしてください。 -
ベースラインを実行します(イテレーション 0)。デフォルト/現在のパラメーターでプログラムを実行し、ベースライン指標を記録します。これを超えることが目標です。
フェーズ 1:初期探索
目標:まず広く調べて、どのパラメーターが最も重要かをすばやく把握します。
戦略:ラテン超方格サンプリング、または主要なパラメーターを対象とした体系的な探索を行います。
- パラメーター範囲を幅広くカバーする、多様な設計点を 5~10 個選びます
- 実行します(独立している場合は並列で、バックグラウンドプロセスまたは順次で実行します)
- すべての結果を
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 ... - 分析します:目的関数に最も大きく影響するパラメーターはどれでしょうか?
- 最も感度の高いパラメーターに探索範囲を絞ります
フェーズ 2:方向性を定めた探索
目標:十分な情報に基づいて選択し、最適値に収束させます。
戦略:適応的に、問題に適した手法を選びます。
- パラメーターが少ない場合(≤3):フェーズ 1 で最良だった領域を中心に、細かいグリッド探索を行います
- パラメーターが多い場合(>3):座標降下法を使います。現在の最良値で他のパラメーターを固定し、パラメーターを 1 つずつ最適化します
- バイナリ/カテゴリーパラメーター:有望な組み合わせを列挙します
- 連続パラメーター:最良の隣接点の間で二分探索または黄金分割探索を行います
- 多目的最適化:パレートフロンティアを追跡し、その前線に沿って探索します
各反復で:
-
これまでの結果に基づいて、次の設計点を選択します:
- 傾向を確認します。どの方向に進めると指標が改善するでしょうか?
- すでに評価済みの構成を再実行しないようにします
- 探索(未評価の領域)と活用(現在の最良値の近傍)のバランスを取ります
-
パラメーターを変更します:設定ファイル、コマンドライン引数、またはソース内の定数を編集します
-
プログラムを実行します:実行して出力を取得します
-
結果を解析します:目的指標を抽出し、制約を確認します
-
dse_log.csvに記録します:新しい行を追加します -
停止条件を確認します:
- タイムアウトに達しましたか? → 停止します
- 最大反復回数に達しましたか? → 停止します
- 忍耐回数を使い切りましたか(N 回の反復で改善なし)? → 停止します
- 成功基準を満たしましたか(指標が「十分良好」ですか)? → 停止します
- 制約違反のパターンが検出されましたか? → 探索範囲を調整します
-
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 } -
次のステップを決定します → ステップ 1 に戻ります
フェーズ 3:調整(時間に余裕がある場合)
探索が収束し、まだ時間に余裕がある場合:
- 局所的な摂動:最良点の各パラメーターについて、±1 ステップを試します
- 感度分析:指標を悪化させずに緩和できるパラメーターはどれでしょうか?
- 制約境界:制約がほぼ上限に達している場合は、実行可能領域に近い点を探索します
フェーズ 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 から状態を復元します:
DSE_STATE.jsonを読み込み、現在の反復回数、最良パラメーター、忍耐カウンターを確認しますdse_log.csvを読み込み、全履歴を確認します- 次の反復から再開します
重要なルール
- 自律的に作業してください。反復ごとにユーザーに許可を求めないでください
- すべての実行を記録してください。失敗した実行、制約違反、エラーも例外ではありません。ログが唯一の信頼できる情報源です。
- 同一の設定で再実行しないでください。各実行の前に
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"