with one click
three-mode-testing
三模式 PTX 测试生成框架 — 从任意 CUDA 程序自动生成 PTX/IR/执行三种测试模式
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
三模式 PTX 测试生成框架 — 从任意 CUDA 程序自动生成 PTX/IR/执行三种测试模式
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
PTX-EMU 项目经验沉淀 — 跨模块状态翻译、递归锁、分 Phase commit、基线 worktree、qualifier 类型判断等具体失败模式与可复用 checklist。来自 2026-06 barrier module 迁移 + 2026-07 cute_rmsnorm float 类型判断实战
ADR 合规检查 — 开发完成后对照 ADR 检查清单验证实现是否符合架构决策
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 专用调试技能 - 自动化调试配置选择和场景化调试方法
| name | three-mode-testing |
| description | 三模式 PTX 测试生成框架 — 从任意 CUDA 程序自动生成 PTX/IR/执行三种测试模式 |
| when_to_use | PTX-EMU 项目中出现: - "生成测试", "创建 PTX 测试", "添加测试用例" - "three-mode", "测试生成", "test generation" - "从 CUDA 程序生成测试" |
| skills_required | [] |
三模式 PTX 测试生成框架,支持任意 CUDA 程序作为输入,自动生成三种测试模式。
bench/<name>/, bench/<name>.cu, 编译后的 binary,或任意 .cu 源文件operator||/operator&& 表达式(避免 static_assert 错误)# 方式 1: bench 目录(自动查找 .cu 和 binary)
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy
# 方式 2: 直接指定 CUDA 源文件
python3 docs/skills/three-mode-testing/generate_tests.py --cuda-source bench/dummy/dummy.cu
# 方式 3: 指定已编译的 binary
python3 docs/skills/three-mode-testing/generate_tests.py --binary build/bin/dummy
# 方式 4: 指定预提取的 PTX 文件
python3 docs/skills/three-mode-testing/generate_tests.py --ptx tests/three_mode_testing/ptx/dummy.ptx
# 1. 编译你的 benchmark
cmake --build build --target dummy
# 2. 生成三模式测试
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy
# 3. 构建
cmake --build build --target test_dummy_mode1 test_dummy_mode2 test_dummy_mode3
# 4. 运行
ctest -R "^test_dummy_mode" -V
python3 docs/skills/three-mode-testing/generate_tests.py \
--cuda-source /path/to/my_kernel.cu \
--test-name my_kernel
python3 docs/skills/three-mode-testing/generate_tests.py \
--binary build/bin/my_kernel \
--test-name my_kernel
# 重新生成所有模式(智能合并,不重复添加)
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --force
# 只更新特定模式
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --mode 2
注意: sync_cmake() 使用 word boundary 检测已存在的测试,不会重复添加。
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Mode 1 | cuobjdump 动态提取 PTX | 集成测试、CI/CD |
| Mode 2 | 预提取 PTX 文件 | 回归测试、版本控制 |
| Mode 3a | StatementContext BEFORE CFG | 单元测试,无 reconvergence_pc |
| Mode 3b | StatementContext AFTER CFG | 单元测试,reconvergence_pc 已填充 |
| Mode 3c | 运行 standalone binary(popen) | 端到端 FAIL 复现测试 |
| Mode 4 | PTXIR binary serialize/deserialize | 快速加载测试(~5ms vs ~200ms) |
Mode 3C 不依赖内部 PtxContext/GPUContext 类型(因为 ptx_parser.h 和 ptx_types.h 之间存在 X-macro 冲突)。
而是通过 popen() 直接运行已编译的 standalone binary,检测其输出中的 FAIL 标记。
=== Result: FAIL === 标记=== Result: PASS ===,测试代码需要相应更新PTX_LOG_LEVEL=error 减少噪音)# 1. 编译你的 CUDA 程序
cmake --build build --target dummy
# 2. 生成五模式测试(自动发现源码和 binary)
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy
# 3. 构建并运行
cmake --build build --target test_dummy_mode1 test_dummy_mode2 test_dummy_mode3a test_dummy_mode3b
ctest -R dummy -V
# 只生成特定模式
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --mode 3
# 强制覆盖已有文件
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --force
# 预览(不生成文件)
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --dry-run
# 指定测试名称(默认从输入自动推断)
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy --test-name my_test
生成器自动分析 PTX 内容,检测:
.entry 内核入口bar.sync / bar.warp.sync 屏障指令ld.shared / st.shared 共享内存操作bra)Mode 3 使用 test_helpers.hpp 中的辅助函数构造 StatementContext:
| 函数 | PTX 指令 |
|---|---|
make_bar_warp_sync(mask, reconv_pc) | bar.warp.sync |
make_bar_sync(bar_id) | bar.sync |
make_ld_shared(dst, var, offset) | ld.shared |
make_st_shared(var, offset, src) | st.shared |
make_mov(dst, src) | mov |
make_mov_imm(dst, imm) | mov 立即数 |
make_add(dst, src1, src2) | add |
make_mul(dst, src1, src2) | mul |
make_setp_lt(pred, src1, src2) | setp.lt |
make_bra(target) | 无条件分支 |
make_bra_pred(target, pred, neg) | 条件分支 |
make_label(name) | 标签 |
make_nop() | nop |
make_exit() | exit |
| 函数 | 说明 |
|---|---|
setup_warp(warp, threads, 32) | 创建含 32 lane 的 warp |
reset_warp(warp) | 重置所有线程状态 |
| 函数 | 说明 |
|---|---|
count_active_lanes(warp) | 统计活跃 lane 数 |
count_at_pc(warp, pc) | 统计特定 PC 处 lane 数 |
check_mask(warp, expected) | 断言 mask 匹配 |
get_active_mask(warp) | 获取当前 active mask |
| 函数 | 说明 |
|---|---|
allocate_shared(n) | 分配 n 个 uint32_t |
write_shared(base, offset, val) | 写入值 |
read_shared(base, offset) | 读取值 |
重要: 生成器自动修复 Catch2 的 operator||/operator&& 限制:
// 错误写法(会导致 static_assert 失败)
CHECK(ptx_contains(ptx, "bar.sync") || ptx_contains(ptx, "bar.warp.sync"));
// 正确写法(生成器自动包裹)
CHECK((ptx_contains(ptx, "bar.sync") || ptx_contains(ptx, "bar.warp.sync")));
发现 bug
↓
Mode 1: 复现(cuobjdump 提取)
↓
Mode 2: 隔离(固定 PTX 文件)
↓
Mode 3: 定位(StatementContext 单元测试)
↓
修复代码
↓
Mode 2: 回归测试
↓
Mode 1: 端到端验证
tests/three_mode_testing/
├── CMakeLists.txt # 自动更新
├── test_helpers.hpp # 共享辅助函数 (StatementContext 构建)
├── test_<name>_mode1.cpp # Mode 1 测试
├── test_<name>_mode2.cpp # Mode 2 测试
├── test_<name>_mode3.cpp # Mode 3 测试
├── ptx/ # 预提取 PTX
│ └── <name>.ptx
└── golden/ # 期望值
└── <name>.expected
使用正则表达式前缀:
ctest -R "^test_dummy_mode" -V # ✓ 正确
ctest -R "test_dummy_mode" -V # ✗ 可能不匹配
确保从项目根目录运行:
cd /workspace/project/PTX-EMU
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark dummy
先编译 benchmark:
cmake --build build --target dummy
sync_cmake() 使用 word boundary 检测,不会重复添加。如果手动修改导致混乱,可重置 CMakeLists.txt 并重新生成。
# 编译
cmake --build build --target RAY
# 生成测试
python3 docs/skills/three-mode-testing/generate_tests.py --benchmark RAY
# 构建运行
cmake --build build --target test_RAY_mode1 test_RAY_mode2 test_RAY_mode3
ctest -R RAY -V
# 直接指定源文件
python3 docs/skills/three-mode-testing/generate_tests.py \
--cuda-source /path/to/my_kernel.cu \
--test-name my_kernel
# 生成 mode2(使用预提取 PTX)
python3 docs/skills/three-mode-testing/generate_tests.py \
--ptx tests/three_mode_testing/ptx/my_kernel.ptx \
--test-name my_kernel \
--mode 2