ワンクリックで
shmem-ops-code-gen
根据 design.md 生成基于 SHMEM 的算子代码、CMake、README 和目录结构。关键词:基于SHMEM代码生成、算子实现、code-gen、kernel、CMake。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
根据 design.md 生成基于 SHMEM 的算子代码、CMake、README 和目录结构。关键词:基于SHMEM代码生成、算子实现、code-gen、kernel、CMake。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
基于 SHMEM 的算子实现与设计一致性走读,生成 review-report.md。关键词:基于SHMEM代码走读、code review、design review、一致性检查、走读。
编译、运行和调试基于 SHMEM 的算子。关键词:基于SHMEM编译调试、compile、debug、build、运行、失败定位。
执行基于 SHMEM 的算子正确性契约验证并生成报告。关键词:基于SHMEM正确性验证、correctness、测试执行、精度验证。
基于 SHMEM 设计通信算子与通算融合算子,将需求转化为 design.md。关键词:基于SHMEM算子设计、算子设计、设计文档、design、Canonical DSL、capability mapping。
基于 SHMEM 的通信算子与通算融合算子端到端开发编排器,串联需求→设计→代码→编译→验证→性能全流程。关键词:基于SHMEM算子开发、端到端开发、算子开发、编排、工作流、通信算子、通算融合。
基于 SHMEM 的算子性能采集、baseline 对比、瓶颈分析和性能报告生成。关键词:基于SHMEM性能评估、性能采集、performance、baseline、bandwidth、性能报告。
| name | shmem-ops-code-gen |
| description | 根据 design.md 生成基于 SHMEM 的算子代码、CMake、README 和目录结构。关键词:基于SHMEM代码生成、算子实现、code-gen、kernel、CMake。 |
Skill类型:代码生成型(读取设计文档,输出可编译代码)
中文写作要求:README.md 等交付文档必须使用中文撰写。仅 API 名称、代码片段、命令行示例等技术术语保留英文原文。
消费通过质量门禁的 design.md,生成 SHMEM 通信算子或通算融合算子的完整代码。不做需求设计(回 shmem-ops-design),不做正确性验证(交给 shmem-ops-correctness-eval),不做性能优化(交给 shmem-ops-performance-optim)。
| 文件 | 用途 |
|---|---|
| references/internal-api-boundary.md | 禁止 aclshmemi_*、deprecated barrier、quiet 误用 |
| references/api.md | SHMEM API 选择参考 |
| references/code-patterns.md | Host/Device 代码组织、RMA 模式、chunk/tail |
| references/atomic-add-pattern.md | SetAtomicAdd<T>() 累加:安全顺序、边界、风险。实现 reduce/累加时必读 |
| references/code-style.md | C/C++ 代码规范 |
| references/readme-spec.md | README.md 格式规范 |
| ../shmem-ops-compile-debug/references/custom-ops-entrypoints.md | custom-ops 编译/运行/matrix/Torch 入口命令;README 运行入口 MUST 以此为准 |
| ../shmem-ops-compile-debug/references/shmem-repo-docs-index.md | 仓内 docs/(只读)、install/shmem/include/、examples 参考 |
| ../shmem-ops-dev/references/shmem-repo-resolution.md | 定位 SHMEM_REPO(读仓内文件前) |
读 ${SHMEM_REPO}/docs/ 只读;MUST 先定位 SHMEM_REPO(shmem-repo-resolution),NEVER 向 docs/ 追加或修改内容。
模板(分文件承载,按生成步骤按需读取,NEVER 一次读完全部模板):
| 文件 | 阅读时机 | 内容 |
|---|---|---|
| templates/communication/GUIDE.md | 步骤 2 选模板时 | 索引、路径映射、约束 |
| templates/communication/templates-cmake-main.md | 步骤 4 子步骤 1 | CMakeLists.txt、main.cpp |
| templates/communication/templates-kernel.md | 步骤 4 子步骤 2–4 | *_kernel.h、*_kernel.cpp |
| templates/communication/templates-scripts.md | 步骤 4 子步骤 5(若需补齐 scripts) | gen_data.py、check_result.py、scripts/run.sh |
| templates/fused-compute/GUIDE.md | op_kind=fused_compute_comm 时步骤 2–4 | 通算融合(CMake + AIC/AIV kernel + main.cpp + scripts) |
必要时先定位 SHMEM_REPO,再查阅仓内文档与头文件(见 shmem-repo-docs-index、shmem-repo-resolution):${SHMEM_REPO}/docs/、${SHMEM_REPO}/install/shmem/include/、${SHMEM_REPO}/examples/。真实代码与文档优先于记忆。
开始生成前必须验证 design.md:
yaml 代码块source.user_confirmations 记录了确认的 op_name 和 dtypesschedule 的 core_partition/tiling/phases 足够具体cann_env 和 build_modeperformance.baseline 不为空或 "none"(必须为具体 baseline 来源——HCCL/aclnn/metric_only,且附 baseline_search 搜索记录)门禁失败时停止,要求先用 shmem-ops-design 修订。
门禁检查是阻断条件,不是建议。执行方式:
shmem-ops-design 补齐schedule / correctness / performance section,直接判定 FAIL步骤 1 提取设计契约
步骤 2 选择模板和参考 example
步骤 3 制定实现计划
步骤 4 渐进式代码生成
步骤 5 调用 shmem-ops-compile-debug 编译验证
从 design.md 提取:
| 内容 | DSL 字段 |
|---|---|
| 算子身份 | meta.op_name、op_kind、target SoC、scope |
| 接口 | inputs/outputs、dtype、shape、visibility |
| 语义 | local_compute、communication、finalize |
| 拓扑 | team、peer_model、addressing |
| 内存 | buffers、symmetric_layout、signal/state |
| 调度 | phases、tile/chunk/tail、core_partition、overlap |
| 正确性 | oracle、tolerance、invariants、case_matrix |
| 性能 | metric、baseline、target_cases |
op_kind 或语义 | 模板目录 |
|---|---|
transport / collective / compute / 纯 put/get/exchange | templates/communication |
fused_compute_comm(Matmul/GEMM + 跨 PE 通信,AIC/AIV CoC) | templates/fused-compute |
compute:单 PE 或 Device 内本地计算、无跨 PE 通信语义时仍用templates/communication(通常仅 Host + 空/轻量 kernel);禁止因存在local_compute字段就路由到 fused-compute。fused_compute_comm:必须同时含 Cube matmul(CATLASS BlockMmad)与 SHMEM 跨 PE 通信(CommBlockEpilogue),见 core-allocation.md §4。
选定模板后,仅读取当前生成步骤对应的模板文件(见上表)。纯通信按 templates/communication/GUIDE.md 分步读取子模板;通算融合从 templates/fused-compute/GUIDE.md 按章节标题提取 fenced code block,写入目标路径,替换 <op_name>/<OpName>/<OP_NAME> 占位符。
参考 example 选择:
${SHMEM_REPO}/examples/allgather、sdma、rdma_demo(先定位 SHMEM_REPO)${SHMEM_REPO}/examples/matmul_allreduce、matmul_reduce_scatter${SHMEM_REPO}/examples/kv_shuffle、dispatch_gmm_combine选定后记录路径和复用理由。
编码前写出:
custom-ops/<op_name>/,非 examples/)main.cpp 与 Host helper 模块的职责边界independent_project 默认)与编译命令(custom-ops-entrypoints.md §1 编译)模板分支(MUST):
meta.op_kind == fused_compute_comm → 只读 templates/fused-compute/GUIDE.md,按章节标题提取代码块;NEVER 读 templates/communication/templates-*.mdtransport / collective / compute → 只读 communication 子模板(下表)按"最小正确路径 → 完整正确性 → 性能路径"顺序。每子步骤只读当前分支对应模板文件:
templates-cmake-main.md;fusion:fused-compute GUIDE 对应章节)templates-kernel.md;fusion:fused-compute GUIDE):src/<op_name>_kernel.htemplates-scripts.md;fusion:fused-compute GUIDE;若 Phase 2 已生成则跳过)性能打点代码(Phase 3 跳过):模板中的
--perf模式(templates-cmake-main.mdperf 代码段)、SHMEMI_PROF_START/END宏(templates-kernel.mdperf 代码段)、scripts/perf.shMUST 在 Phase 3 跳过。这些代码段仅当 Phase 6 dev 显式调用 code-gen 添加性能打点时写入。Phase 3 生成的是纯 correctness 代码(perf_times 默认 0,无 SHMEMI_PROF)。
.cpp/.h(如 op_host_plan.cpp)aclshmem_* 或 aclshmemx_* 接口block_dim=1 仅临时调试用;首版 correctness 必须落地 design 的并发main.cpp 的 --perf 模式必须输出双指标延迟和带宽(严格按照 shmem-ops-performance-eval/references/timing-and-metrics-standard.md 执行):
| 指标 | 说明 | 公式 |
|---|---|---|
e2e_us | 端到端延迟:做法 A 下 ≈kernel_us(搬运在 kernel 内);做法 B 下含 aclrtMemcpy + barrier + kernel | 做法 A:kernel launch 前到 stream sync 后;做法 B:aclrtMemcpy 前到 stream sync 后 |
kernel_us | kernel 执行时间 | kernel launch 前到 stream sync 后 |
algo_bandwidth_GBps | 算法带宽(基于 e2e_us,参考) | logical_payload_bytes / (e2e_us * 1e-6) / 1e9 |
e2e_bus_bandwidth_GBps | 总线带宽(e2e 参考) | algo_bandwidth * bus_factor(bus_factor 见 timing-and-metrics-standard.md §4.3) |
kernel_bus_bandwidth_GBps | 达标主指标(kernel 口径) | logical_payload_bytes / (kernel_us * 1e-6) / 1e9 * bus_factor |
bandwidth_utilization_pct | 带宽利用率(基于 kernel_bus_bandwidth_GBps) | kernel_bus_bandwidth_GBps / peak_bandwidth * 100(peak_bandwidth 按通信模式确定,见下文) |
bus_factor 按算子语义确定(不区分拓扑,NCCL 惯例的通信量标准化系数):AllReduce: 2*(n-1)/n,ReduceScatter/AllGather: (n-1)/n,AllToAll/Shuffle: (n-1)/n,Broadcast/P2P: 1。
peak_bandwidth 按通信模式确定(参考 hardware-architecture.md §2.6):
perf 循环结构要求:
// MTE put_nbi src=local GM, no Host-side memcpy needed);做法 B 下 e2e_us MUST > kernel_us,差值等于 kernel 外搬运时间。禁止为制造 e2e > kernel 假象而在做法 A 路径上加无意义的 kernel 外搬运;禁止在性能循环前预做搬运使 e2e 口径缩水注意:algo_bandwidth 不乘 2,统一按 input size 计算(NCCL algBw 惯例)。logical_payload_bytes 必须在输出中注明口径(单 PE 还是全局)。Phase 6 达标与 Round 对比 MUST 用 [PERF] 行的 kernel_bus_bandwidth_GBps,不得用 e2e 带宽。
如果算子包含 SHMEMI_PROF_START/END 打点,--perf 模式还应调用 aclshmemx_get_prof(nullptr, true) 输出 Device 帧数据。
shmem-ops-compile-debug,传入 compile contract,由 compile-debug 执行构建并诊断失败shmem-ops-testcase-gen 修正默认根路径:custom-ops/<op_name>/(独立工程)。in-tree 时为 examples/<op_name>/。
最终交付目录结构 MUST 严格遵循以下布局(以下以 <op_root>/ 表示算子根目录):
op_name/
├── CMakeLists.txt
├── README.md
├── docs/
│ ├── design.md # shmem-ops-design
│ ├── review-report.md # shmem-ops-code-review
│ ├── correctness_report.md # shmem-ops-correctness-eval
│ ├── performance_report.md # shmem-ops-performance-eval / shmem-ops-performance-optim
│ └── case_matrix_report.md # shmem-ops-testcase-gen
├── src/
│ ├── main.cpp
│ ├── op_name_kernel.cpp
│ ├── op_name_kernel.h
│ ├── op_host_plan.cpp (可选)
│ └── op_host_plan.h (可选)
├── scripts/
│ ├── gen_data.py
│ ├── check_result.py
│ ├── run.sh
│ ├── run_case_matrix.py
│ ├── perf.sh # Phase 6;实现见 perf-workflow.md
│ └── perf_compare.sh # 有 baseline 时;或统一用 perf-workflow §1 阶段 C
└── baseline/ # 有 baseline 时 MUST 存在
├── CMakeLists.txt # 独立的 baseline 编译 target(add_subdirectory)
├── src/
│ └── op_name_baseline.cpp # HCCL/aclnn baseline 源码
└── scripts/
└── run_baseline.sh # baseline 运行脚本,输出 [BASELINE_PERF]
docs/ 承载所有阶段产出的 .md、src/ 含全部算子 .cpp/.h、scripts/ 含全部测试脚本;baseline/ 含全部 baseline 源码和编译配置(Phase 6 由 dev 调用 code-gen 按需生成,Phase 3 不检查此项;metric_only 或 performance_required: false 时标记 N/A)link_libraries()(见 code-style.md §10.1)schedule 一致atomic-add-pattern.md §12 决策优先级表选择累加方式;reduce-scatter/allreduce RS 阶段 MUST 使用 SetAtomicAdd<T>()(MTE 批量)+ mte_get_nbi(优先级 1),禁止以串行 UB 累加(优先级 4/5)作为交付路径logical_payload_bytes = elements × sizeof(dtype)(单 PE 语义数据量);(2) algo_bandwidth_GBps = logical_payload / (e2e_us × 1e-6) / 1e9(基于 e2e_us,不乘2);(3) bus_factor 从 timing-and-metrics-standard.md §4.3 唯一参照表取值;禁止使用 n_pes-1 或其他错误值;(4) e2e_bus_bandwidth_GBps = algo_bandwidth × bus_factor(e2e 口径,仅参考);(5) kernel_bus_bandwidth_GBps = logical_payload / (kernel_us × 1e-6) / 1e9 × bus_factor(kernel 口径,达标主指标);(6) bandwidth_utilization_pct = kernel_bus_bandwidth_GBps / peak_bandwidth × 100。perf 输出 MUST 包含 e2e_us、kernel_us、algo_bandwidth_GBps、e2e_bus_bandwidth_GBps、kernel_bus_bandwidth_GBps、bandwidth_utilization_pct;algo_bandwidth 禁止基于 kernel_us 计算;禁止不同字段输出相同值或同名字段表示不同口径.cpp、.h、.py、.sh 文件 MUST 包含 CANN Open Software License 头(见 code-style.md §7.2);交付不可省略aclshmem_* / aclshmemx_* 数据面接口;禁止 DataCopy 直接写远端地址aclshmem_put_nbi、aclshmem_get_nbi、aclshmem_signal_wait_until、aclrtMalloc 等)。禁止静默忽略返回值(见 code-style.md §1.4)aclshmem_barrier_all()、aclshmem_finalize() 等返回 void 的同步 API MUST 检查:所有 PE 对称调用(无分支遗漏)、barrier 后无 data race、finalize 前数据已可见。禁止检查不存在的返回值aclshmem_* / aclshmemx_* 开头)。若使用了 aclshmemi_* 内部接口:(1) 有公开等价 API 时 MUST 改为公开 API;(2) 无公开等价 API 时 MUST 在 Capability Mapping / gap analysis 中登记,写明无替代方案和风险评估(见 internal-api-boundary.md)ACL_CHECK / ACL_CHECK_WITH_RET / CHECK_SHMEM 等宏进行错误检查,禁止裸写 if (status != ACL_ERROR_NONE) 模式(见 code-style.md §1.1 / §1.2)/home/<user>/...),MUST 使用环境变量或相对路径(见 code-style.md §10.1)aclshmem_barrier_all() 或 aclshmem_barrier(team);禁止无理由使用 aclshmemx_barrier_all_vec() 替代(仅对齐既有 legacy example 时可保留,见 code-style.md §6.2)aclshmem_malloc 调用顺序和大小完全一致(见 code-review-checklist.md §内存与Buffer)main.cpp 中;复杂 Host 逻辑 MUST 拆到独立 .cpp/.h(见 code-style.md §5.2)int *ptr、UNUSED_PARAM 标记、UB/event 命名常量、资源释放顺序、注释解释"为什么"、命名风格一致性、main.cpp 边界等(详见 code-style.md §12)P0 全部 PASS 且 P1 全部 PASS → 进入 Phase 4;否则 MUST 修复后重新检查。
以下需求 仅当 meta.performance_required: true 且 dev 在 Phase 6 显式调用 code-gen 添加性能打点时才生效。Phase 3 不检查、不生成。
SHMEMI_PROF_START(frame_id) / SHMEMI_PROF_END(frame_id),至少 5 个独立 frame_id 覆盖 copy_in / remote_put_get / signal_or_barrier_wait / local_compute / finalize(见 timing-and-metrics-standard.md §7)aclshmemx_get_prof(nullptr, true) 导出 Device frame 数据(见 timing-and-metrics-standard.md §7)--perf flag + warmup + timing loop + [PERF] 输出逻辑(见 templates-cmake-main.md perf 代码段)scripts/perf.sh MUST 存在且可执行(实现见 perf-workflow.md)SetAtomicAdd<T>() + mte_get_nbi 批量并行模式(见 atomic-add-pattern.md §5.1 / §12 优先级1)timing-and-metrics-standard.md §4.3 唯一参照表取值,如 AllReduce 为 2*(n-1)/n,禁止用 n-1)if (status != ACL_ERROR_NONE) 而不使用 ACL_CHECK / CHECK_SHMEM 宏algo_bandwidth_GBps 基于 kernel_us 计算(应基于 e2e_us)aclshmemx_get_prof(nullptr, true)aclshmemx_barrier_all_vec() 替代 aclshmem_barrier_all()(void)cast 替代 UNUSED_PARAM(x)aclshmem_barrier_all() / aclshmem_finalize() 不对称调用(某 PE 跳过 barrier/finalize,导致死锁或资源泄漏)aclshmemi_* 内部接口(除非无公开等价 API 且已在 gap analysis 中登记).md 文档散放在算子根目录(必须归入 docs/).cpp/.h 源文件散放在算子根目录(必须归入 src/)src/ 下或算子根目录(必须归入 baseline/src/,编译 target 必须在 baseline/CMakeLists.txt)examples/(默认 custom-ops/<op_name>/)