with one click
adr-compliance-check
ADR 合规检查 — 开发完成后对照 ADR 检查清单验证实现是否符合架构决策
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
ADR 合规检查 — 开发完成后对照 ADR 检查清单验证实现是否符合架构决策
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | adr-compliance-check |
| description | ADR 合规检查 — 开发完成后对照 ADR 检查清单验证实现是否符合架构决策 |
| when_to_use | PTX-EMU 项目中完成以下任务后: - 实现了新的 ADR 中描述的功能 - 修改了 SIMT Stack、Barrier、CFG、Thread PC 等核心组件 - 添加了新的指令处理器或修改了指令执行流程 - 代码审查前验证实现是否符合 ADR 触发场景: - "检查是否符合 ADR" - "合规检查", "compliance check" - "ADR 清单", "ADR checklist" - "实现是否符合架构决策" |
| skills_required | [] |
ADR(Architecture Decision Records)是 PTX-EMU 项目的架构决策记录。开发完成后,应对照相关 ADR 的合规检查清单验证实现是否符合架构决策。
# 验证 SIMT Stack 实现的关键文件
ls -la src/ptxsim/core/simt_stack.cpp
ls -la include/ptxsim/simt_stack.h
grep -n "check_reconvergence" src/ptxsim/core/warp_context.cpp
grep -n "pc != current_inst_pc" src/ptxsim/core/warp_context.cpp
| 检查项 | 验证方法 | 文件位置 |
|---|---|---|
| 分支指令执行时正确 push SIMT 栈 | grep -n "simt_stack.push" src/ptxsim/core/warp_context.cpp | warp_context.cpp |
| reconvergence 时正确 pop SIMT 栈 | grep -n "check_reconvergence|pop" src/ptxsim/core/simt_stack.cpp | simt_stack.cpp |
| check_reconvergence 跳过退出线程 | 查看 is_exited 检查逻辑 | simt_stack.cpp:is_converged() |
| 栈深度不超过 MAX_DEPTH | grep -n "MAX_DEPTH|overflow" include/ptxsim/simt_stack.h | simt_stack.h |
| barrier 后使用 while 循环处理所有收敛条目 | grep -n "while.*check_reconvergence" src/ptxsim/core/sm_context.cpp | sm_context.cpp |
| check_reconvergence 返回 bool | grep -n "bool.*check_reconvergence" include/ptxsim/warp_context.h | warp_context.h |
| handle_branch 中使用 PC 过滤 | grep -n "pc != current_inst_pc" src/ptxsim/core/warp_context.cpp | warp_context.cpp:20 |
| 检查项 | 验证方法 | 文件位置 |
|---|---|---|
| 分支指令的 reconvergence_pc 来自 CFG | grep -n "reconvergence_pc|postDominator" src/ptx_parser/cfg_builder.cpp | cfg_builder.cpp |
| 不硬编码 reconvergence 规则 | grep -n "i + 1|fallback" src/ptxsim/instructions/barrier.cpp | barrier.cpp |
| CFG 分析在 kernel 加载时执行一次 | grep -n "computePostDominators|CFGBuilder" src/ptx_parser/ptx_visitor.cpp | ptx_visitor.cpp |
| Fallback 到 i+1 时在日志中说明原因 | grep -n "FALLBACK|PTX_DEBUG_EMU" src/ptxsim/instructions/barrier.cpp | barrier.cpp |
| 检查项 | 验证方法 | 文件位置 |
|---|---|---|
| barrier 阻塞线程设置 pc_overridden_ | grep -n "set_pc_overridden.*true" src/ptxsim/instructions/barrier.cpp | barrier.cpp:198 |
| barrier 完成后不重置 exec_mask/active_mask | 检查 barrier.cpp 是否有 exec_mask = 或 active_mask = 赋值 | barrier.cpp |
| barrier 后调用 check_reconvergence | grep -n "check_reconvergence" src/ptxsim/core/sm_context.cpp | sm_context.cpp |
| Wbar 使用 is_initialized + memory_fence_verification_enabled | grep -n "is_initialized|memory_fence_verification" include/ptxsim/wbar.h | wbar.h |
| 检查项 | 验证方法 | 文件位置 |
|---|---|---|
| PC 从 warp_state.threads[lane].pc 读取 | grep -n "get_pc|warp_state.threads.*pc" src/ptxsim/core/warp_context.cpp | warp_context.cpp |
| 不使用 ThreadContext::pc 作为权威源 | 检查是否有 context->pc 赋值 | thread_context.cpp |
分支指令执行时正确 push SIMT 栈
// 在 handle_branch() 的 is_divergent 分支中
simt_stack.push(entry); // entry 包含 branch_pc, reconvergence_pc, active_mask, return_mask
reconvergence 时正确 pop SIMT 栈
// check_reconvergence() 应在 SIMTStack::check_reconvergence() 后 pop
bool WarpContext::check_reconvergence() {
if (simt_stack.empty()) return false;
size_t depth_before = simt_stack.depth();
simt_stack.check_reconvergence(warp_state.threads);
if (simt_stack.depth() < depth_before) {
// An entry was popped
return true;
}
return false;
}
check_reconvergence 跳过退出线程
// SIMTStack::is_converged() 中
if (threads[i].is_exited || !threads[i].is_active) {
continue; // 跳过退出/非活跃线程
}
栈深度不超过 MAX_DEPTH
// simt_stack.push() 中
if (entries_.size() >= MAX_DEPTH) {
throw ExecutionStateException("SIMT stack overflow");
}
barrier 后使用 while 循环处理所有收敛条目
// sm_context.cpp 中
while (next_warp->check_reconvergence()) {
// Keep popping until no more convergent entries
}
check_reconvergence 返回 bool 表示是否有条目被 pop
// 返回 true 表示有条目被 pop,可继续循环
// 返回 false 表示无条目被 pop,循环结束
handle_branch 中使用 PC 过滤防止 stale PC 影响分支决策
// warp_context.cpp handle_branch()
for (int i = 0; i < 32; i++) {
if (!warp_state.threads[i].is_active) continue;
if (warp_state.threads[i].pc != current_inst_pc) continue; // PC 过滤
// ...
}
分支指令的 reconvergence_pc 来自 CFG post-dominator
不硬编码 reconvergence 规则(bar.warp.sync 除外)
bar.warp.sync 总是使用 i+1(warp barrier 后立即收敛)CFG 分析在 kernel 加载时执行一次
单元测试覆盖嵌套分支、循环内分支等复杂场景
Fallback 到 i+1 时在日志中说明原因
PTX_DEBUG_EMU("CFG[PC=%d]: S_BAR FALLBACK - new_reconvergence_pc=%d (no post-dominator, likely in loop)", i, i + 1);
S_BAR 和 S_BAR_WARP_SYNC 都正确处理 reconvergence_pc
barrier 指令正确初始化 participation_mask
所有参与线程都调用 arrive()
barrier 完成后验证 is_complete()
if (wbar.is_complete()) {
// 释放所有线程
}
barrier 后线程恢复到正确的 reconvergence_pc
force_set_pc(reconvergence_pc) 设置当前线程set_thread_pc(i, reconvergence_pc) 设置其他线程Debug 模式下 memory fence 验证启用
#ifdef PTX_DEBUG
wbar.verify_memory_fence();
#endif
barrier 阻塞线程设置 pc_overridden_ 保护 PC
// barrier.cpp
set_pc_overridden(true); // 阻止 next_pc 被覆盖
warp_state.threads[lane_id].is_blocked = true;
barrier 完成后不重置 exec_mask/active_mask
barrier 后调用 check_reconvergence 检查 SIMT 栈收敛
// sm_context.cpp
while (next_warp->check_reconvergence()) {
// 处理所有收敛条目
}
PC 从 warp_state.threads[lane].pc 读取(单一权威源)
context->get_pc() 内部调用 warp_state.threads[lane_id].pcset_thread_pc() 同时设置 pc 和 next_pc
warp_state.threads[lane_id].pc = pc;
warp_state.threads[lane_id].next_pc = pc;
不使用 ThreadContext::pc 作为权威源
根据修改的组件确定相关 ADR:
| 组件 | 相关 ADR |
|---|---|
| SIMT Stack / handle_branch | ADR-0006 |
| CFG / Post-Dominator | ADR-0007 |
| Barrier / Wbar | ADR-0008 |
| PC 管理 | ADR-0002, ADR-0003 |
# 1. 读取相关 ADR 的合规检查清单
cat docs/adr/0006-simt-stack-management.md | grep -A 20 "合规检查"
# 2. 对照检查代码实现
# 3. 标记检查项为完成或问题
## ADR 合规检查报告
### ADR-0006: SIMT Stack 管理
- [x] 分支指令执行时正确 push SIMT 栈
- [x] reconvergence 时正确 pop SIMT 栈
- [ ] 问题:MAX_DEPTH 检查未实现 ← 需要修复
### ADR-0008: Barrier 语义
- [x] barrier 阻塞线程设置 pc_overridden_
- [ ] 问题:未调用 check_reconvergence ← 需要修复
加载 skill:
ptx-lessons-learned来源: 2026-06-18 commitf033312实战经验沉淀 目的: 把 ADR 合规检查从"是否符合设计决策"扩展到"是否违反已知的失败模式"
在完成标准 ADR 合规检查清单后,必须额外 cross-check 以下 lessons-learned 失败模式(确保实现没有违反):
触发条件: 涉及 ThreadContext / WarpState / set_state / sync_to_warp_state 的改动
检查命令:
# 列出修改的代码中所有 set_state 调用
grep -n "set_state" <modified-files>
# 列出所有消费该 state 的位置
grep -rn "state == BAR_SYNC\|state == RUN\|state == EXIT\|is_at_barrier" src/ptxsim/
# 比对:每个 set_state 必须有对应的消费者,没有遗漏
判定标准:
set_state(X) 但找不到消费者 → 可能翻译不完整关联 invariant: src/ptxsim/core/AGENTS.md DUAL STATE MECHANISM 章节
触发条件: 涉及互斥量、lock_guard、新的 mutex_ 字段
检查命令:
# 列出所有锁点
grep -n "lock_guard\|unique_lock\|lock()\|unlock()" <modified-files>
# 检查是否有"持锁方法调用其他持锁方法"的模式
# - 同一 mutex 上的多个 lock_guard 在不同方法中
# - 一个方法内 lock 后调用同锁的另一方法
判定标准:
std::recursive_mutex(明确标注)关联修复模式: lessons-learned.md §3
触发条件: 涉及 barrier 释放、release_warp_barrier、release_cta_barrier、active_mask 修改
检查命令:
# 列出所有 set_active_mask 调用
grep -rn "set_active_mask" src/ptxsim/
# 验证是否使用 OR 语义(而非 overwrite)
grep -B2 "set_active_mask" src/ptxsim/barrier/ | grep "get_active_mask() |"
判定标准:
set_active_mask(arrived_mask) 而非 OR → BUG-POSTBARRIER-TWOHALVES 回归set_active_mask(get_active_mask() | arrived_mask)(caller 层 OR)set_active_mask(0u)(overwrite 是合法的,这里只查 barrier 路径)关联 invariant: src/ptxsim/core/AGENTS.md BUG-POSTBARRIER-TWOHALVES 章节
触发条件: 涉及 release_warp_barrier / release_cta_barrier
检查命令:
# 验证 release 后设置 state = RUN
grep -A5 "release_warp_barrier\|release_cta_barrier" src/ptxsim/barrier/barrier_module.cpp | grep "set_state"
# 验证 is_blocked 被显式清除
grep -A10 "release_warp_barrier\|release_cta_barrier" src/ptxsim/barrier/barrier_module.cpp | grep "is_blocked"
判定标准:
sync_to_warp_state() 的 guard 会阻止 is_blocked 被清除关联 invariant: src/ptxsim/core/AGENTS.md DUAL STATE MECHANISM 章节
触发条件: 涉及 Wbar 引用、bar.warp.sync 路径、warp_state.wbars[] 字段
检查命令:
# 列出所有 Wbar 引用
grep -rn "Wbar\b\|wbar\.\|warp_state.wbars\[" src/ include/ | grep -v "deprecated"
# 检查是否被标记为 deprecated
grep "deprecated" include/ptxsim/wbar.h
判定标准:
Wbar 而非 BarrierModule → 违反废弃决策BarrierModule / WarpBarrier / CTABarrier// TODO: migrate to BarrierModule关联决策: docs/adr/0008-barrier-semantics.md §"2026-06-18 Postmortem"(Phase 5 推迟决策)
ADR 合规报告应包含 Lessons-Learned Cross-Check 章节:
## Lessons-Learned Cross-Check
- [ ] A. 跨模块状态翻译完整性
- [ ] B. 递归锁死锁风险
- [ ] C. set_active_mask 全局语义(barrier 路径)
- [ ] D. Barrier 释放后状态恢复
- [ ] E. Wbar 废弃状态(如涉及)
<每个项的检查结果 + 证据>
如果任何项 ❌,必须在报告中标出,并在 commit 中修复(参考 lessons-learned.md 对应章节的修复模式)。
ptx-lessons-learned: 提供所有 cross-check 项的源state-modification-audit: 增强 cross-check A 和 D 的检查(当怀疑状态被意外修改时)regression-bisect: 增强 cross-check A 的诊断(当 set_state 漏掉导致测试回归时)PTX-EMU 项目经验沉淀 — 跨模块状态翻译、递归锁、分 Phase commit、基线 worktree、qualifier 类型判断等具体失败模式与可复用 checklist。来自 2026-06 barrier module 迁移 + 2026-07 cute_rmsnorm float 类型判断实战
Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.
Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.
Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.
PTX-EMU 专用调试技能 - 自动化调试配置选择和场景化调试方法
三模式 PTX 测试生成框架 — 从任意 CUDA 程序自动生成 PTX/IR/执行三种测试模式