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. 03比较 RTL 参数与吞吐量目标

安装

复制下面的命令,在终端中运行。

$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 或任何递归删除操作
  • 删除本次会话中由你创建之外的任何文件
  • 未先读取现有源文件就覆盖它们
  • 执行 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 / ramulatorBank 数量、行缓冲策略、调度优化带宽/能耗

工作流

阶段 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
    布尔/枚举标志枚举源代码中找到的所有选项
    连续值(学习率、阈值)对数尺度扫描:取 5 个点,覆盖默认值上下 2 个数量级
    整数计数(线程、核心)线性取值:从 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. 扩展边界——搜索过程中,如果最优结果位于某个范围的最小值或最大值,则自动沿该方向扩展一步(并记录扩展情况)。

  3. 阅读项目,了解:

    • 如何运行程序
    • 结果输出位置(标准输出、日志文件、报告)
    • 如何从输出中解析目标指标
    • 当前/基准配置(如有)
  4. 创建工作目录:在项目根目录下创建 dse_results/

    • dse_results/dse_log.csv — 每个设计点占一行
    • 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):使用坐标下降法 — 每次优化一个参数,其他参数保持当前最佳值
  • 二元/分类参数:枚举有希望的组合
  • 连续参数:在最佳邻近点之间进行二分搜索或黄金分割搜索
  • 多目标:跟踪 Pareto 前沿,沿前沿进行探索

每次迭代:

  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 可用,还要生成汇总图:

  • 收敛曲线(指标与迭代次数)
  • 参数敏感度柱状图
  • Pareto 前沿散点图(如果是多目标)

状态恢复

如果上下文窗口在运行过程中被压缩,循环会根据 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 § 让失败的尝试重新开始,而不只是打补丁)。恢复扫描前,重新验证指标的可比性:使用新解析器重新解析 dse_results/outputs/iter_N/ 中某个已完成迭代的原始输出,并确认解析结果与 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"

评论

支持 Markdown