cann-workbench 0.0.0-stage → 0.0.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +183 -2
  2. package/THIRD_PARTY_NOTICES.md +85 -0
  3. package/cordis.patch.yml +3 -0
  4. package/doctor/LICENSE +202 -0
  5. package/doctor/NOTICE +12 -0
  6. package/doctor/README.md +18 -0
  7. package/lib/client.js +94437 -0
  8. package/lib/index.d.ts +722 -0
  9. package/lib/index.js +33711 -0
  10. package/locale/en.json +6 -0
  11. package/locale/zh.json +6 -0
  12. package/package.json +171 -4
  13. package/skills/asc-tools/tool-ops-tune/INSTALL.md +52 -0
  14. package/skills/asc-tools/tool-ops-tune/LICENSE +38 -0
  15. package/skills/asc-tools/tool-ops-tune/README.md +167 -0
  16. package/skills/asc-tools/tool-ops-tune/SKILL.md +93 -0
  17. package/skills/asc-tools/tool-ops-tune/agent/AGENTS.md +195 -0
  18. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
  19. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
  20. package/skills/asc-tools/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
  21. package/skills/asc-tools/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
  22. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
  23. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
  24. package/skills/asc-tools/tool-ops-tune/docs/ops-tune-design.md +404 -0
  25. package/skills/asc-tools/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +730 -0
  26. package/skills/asc-tools/tool-ops-tune/docs//347/237/245/350/257/206/345/272/223/350/247/204/350/214/203.md +103 -0
  27. package/skills/asc-tools/tool-ops-tune/evals/evals.json +242 -0
  28. package/skills/asc-tools/tool-ops-tune/ops-collect/SKILL.md +146 -0
  29. package/skills/asc-tools/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
  30. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_board.sh +458 -0
  31. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
  32. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
  33. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
  34. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
  35. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1102 -0
  36. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/isolation_test.py +452 -0
  37. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
  38. package/skills/asc-tools/tool-ops-tune/ops-family/SKILL.md +76 -0
  39. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
  40. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
  41. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
  42. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
  43. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
  44. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
  45. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
  46. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
  47. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
  48. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
  49. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
  50. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
  51. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
  52. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/index.md +9 -0
  53. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
  54. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
  55. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
  56. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
  57. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
  58. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
  59. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
  60. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
  61. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
  62. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
  63. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
  64. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
  65. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
  66. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
  67. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
  68. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
  69. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
  70. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
  71. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
  72. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
  73. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
  74. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
  75. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
  76. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
  77. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
  78. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
  79. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
  80. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
  81. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
  82. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
  83. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
  84. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
  85. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
  86. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
  87. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
  88. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
  89. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
  90. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
  91. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
  92. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
  93. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
  94. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +87 -0
  95. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
  96. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
  97. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
  98. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
  99. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
  100. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
  101. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
  102. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
  103. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
  104. package/skills/asc-tools/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
  105. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
  106. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
  107. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
  108. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
  109. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
  110. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
  111. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
  112. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
  113. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
  114. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
  115. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
  116. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
  117. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
  118. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
  119. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
  120. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
  121. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
  122. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
  123. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
  124. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
  125. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
  126. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
  127. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
  128. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
  129. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
  130. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
  131. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
  132. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
  133. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
  134. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
  135. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
  136. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
  137. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
  138. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
  139. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
  140. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
  141. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
  142. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
  143. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
  144. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
  145. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
  146. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
  147. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
  148. package/skills/asc-tools/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
  149. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
  150. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
  151. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
  152. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
  153. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
  154. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
  155. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
  156. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
  157. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
  158. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
  159. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
  160. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
  161. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
  162. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
  163. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
  164. package/skills/asc-tools/tool-ops-tune/ops-report/SKILL.md +77 -0
  165. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/run_evals.py +963 -0
  166. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
  167. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +535 -0
  168. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
  169. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
  170. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
  171. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
  172. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
  173. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
  174. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
  175. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
  176. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
  177. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
  178. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
  179. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
  180. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
  181. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
  182. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
  183. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +466 -0
  184. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
  185. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/delta_compare.py +278 -0
  186. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/render_html.py +304 -0
  187. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
  188. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
  189. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/verdict.py +1094 -0
  190. package/skills/asc-tools/tool-ops-tune/scripts/diff_audit.py +281 -0
  191. package/skills/asc-tools/tool-precision-debug/LICENSE +38 -0
  192. package/skills/asc-tools/tool-precision-debug/README.md +190 -0
  193. package/skills/asc-tools/tool-precision-debug/scripts/install.sh +475 -0
  194. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/LICENSE +38 -0
  195. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/SKILL.md +136 -0
  196. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/evals/evals.json +932 -0
  197. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/baseline.md +69 -0
  198. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/checkpoint-design.md +82 -0
  199. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/dumptensor.md +83 -0
  200. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/hypothesis-experiment.md +114 -0
  201. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/index.md +20 -0
  202. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/localization.md +85 -0
  203. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/numerical-modeling.md +94 -0
  204. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/operator-modeling.md +116 -0
  205. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/progressive-error-analysis.md +86 -0
  206. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reporting.md +140 -0
  207. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reproducibility.md +121 -0
  208. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/semantic-bisection.md +72 -0
  209. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/sensitive-points.md +146 -0
  210. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fp16-promotion-boundary.md +46 -0
  211. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fused-rmsnorm-gelu-residual.md +162 -0
  212. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/index.md +16 -0
  213. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/integer-float-collision.md +44 -0
  214. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/partial-statistics-merge.md +30 -0
  215. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/softplus-v2-grad-family.md +156 -0
  216. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/sync-dataflow-handshake.md +89 -0
  217. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/tail-valid-region-state.md +30 -0
  218. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/thnn-fused-gru-bias-reduction.md +73 -0
  219. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/index.md +34 -0
  220. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/accumulation-order.md +108 -0
  221. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/algorithm-parameter-contract.md +118 -0
  222. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/buffer-lifetime-alias.md +133 -0
  223. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/cast-rounding.md +76 -0
  224. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/complex-operator-boundary.md +48 -0
  225. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/data-movement-alignment.md +104 -0
  226. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/golden-host-contract.md +84 -0
  227. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index-address-ownership.md +57 -0
  228. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index.md +32 -0
  229. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/multicore-ownership.md +117 -0
  230. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/pipeline-sync-visibility.md +146 -0
  231. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/precision-mode-approximation.md +90 -0
  232. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/shape-boundary-contract.md +57 -0
  233. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/special-values.md +122 -0
  234. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/tiling-tail-state.md +146 -0
  235. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/broadcast-transpose.md +64 -0
  236. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/convolution.md +60 -0
  237. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/dynamic-quant.md +47 -0
  238. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/index.md +18 -0
  239. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/matmul-mmad.md +131 -0
  240. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/normalization.md +145 -0
  241. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/reduction.md +167 -0
  242. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/softplus-v2-grad.md +58 -0
  243. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/sort-merge.md +65 -0
  244. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/index.md +18 -0
  245. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/kernel-debug-data.md +133 -0
  246. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/msobjdump.md +150 -0
  247. package/skills/cann-doctor/SKILL.md +15 -0
  248. package/skills/catalog.json +79 -0
  249. package/skills/mattpocock/GLOSSARY.md +30 -0
  250. package/skills/mattpocock/LICENSE +21 -0
  251. package/skills/mattpocock/README.md +258 -0
  252. package/skills/mattpocock/SCOPE.md +35 -0
  253. package/skills/mattpocock/docs/agents/triage-labels.md +15 -0
  254. package/skills/mattpocock/docs/engineering/ask-matt.md +91 -0
  255. package/skills/mattpocock/docs/engineering/code-review.md +101 -0
  256. package/skills/mattpocock/docs/engineering/codebase-design.md +88 -0
  257. package/skills/mattpocock/docs/engineering/diagnosing-bugs.md +94 -0
  258. package/skills/mattpocock/docs/engineering/domain-modeling.md +86 -0
  259. package/skills/mattpocock/docs/engineering/grill-with-docs.md +82 -0
  260. package/skills/mattpocock/docs/engineering/implement-spec.md +86 -0
  261. package/skills/mattpocock/docs/engineering/implement.md +97 -0
  262. package/skills/mattpocock/docs/engineering/improve-codebase-architecture.md +113 -0
  263. package/skills/mattpocock/docs/engineering/pr.md +79 -0
  264. package/skills/mattpocock/docs/engineering/prototype.md +67 -0
  265. package/skills/mattpocock/docs/engineering/research.md +73 -0
  266. package/skills/mattpocock/docs/engineering/resolving-merge-conflicts.md +53 -0
  267. package/skills/mattpocock/docs/engineering/retro.md +81 -0
  268. package/skills/mattpocock/docs/engineering/setup-matt-pocock-skills.md +94 -0
  269. package/skills/mattpocock/docs/engineering/tdd.md +94 -0
  270. package/skills/mattpocock/docs/engineering/to-spec.md +81 -0
  271. package/skills/mattpocock/docs/engineering/to-tickets.md +99 -0
  272. package/skills/mattpocock/docs/engineering/triage.md +109 -0
  273. package/skills/mattpocock/docs/engineering/wayfinder.md +103 -0
  274. package/skills/mattpocock/docs/engineering/wizard.md +96 -0
  275. package/skills/mattpocock/docs/productivity/grill-me.md +76 -0
  276. package/skills/mattpocock/docs/productivity/grilling.md +87 -0
  277. package/skills/mattpocock/docs/productivity/handoff.md +76 -0
  278. package/skills/mattpocock/docs/productivity/teach.md +97 -0
  279. package/skills/mattpocock/docs/productivity/to-questionnaire.md +78 -0
  280. package/skills/mattpocock/docs/productivity/wait-what.md +36 -0
  281. package/skills/mattpocock/docs/productivity/writing-for-agents.md +70 -0
  282. package/skills/mattpocock/scripts/link-skills.sh +62 -0
  283. package/skills/mattpocock/scripts/list-skills.sh +7 -0
  284. package/skills/mattpocock/scripts/sync-plugin-version.mjs +41 -0
  285. package/skills/mattpocock/skills/deprecated/README.md +3 -0
  286. package/skills/mattpocock/skills/engineering/README.md +34 -0
  287. package/skills/mattpocock/skills/engineering/ask-matt/PHASE-BOUNDARIES.md +55 -0
  288. package/skills/mattpocock/skills/engineering/ask-matt/SKILL.md +97 -0
  289. package/skills/mattpocock/skills/engineering/ask-matt/agents/openai.yaml +5 -0
  290. package/skills/mattpocock/skills/engineering/code-review/SKILL.md +89 -0
  291. package/skills/mattpocock/skills/engineering/code-review/agents/openai.yaml +3 -0
  292. package/skills/mattpocock/skills/engineering/codebase-design/DEEPENING.md +37 -0
  293. package/skills/mattpocock/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
  294. package/skills/mattpocock/skills/engineering/codebase-design/SKILL.md +114 -0
  295. package/skills/mattpocock/skills/engineering/codebase-design/agents/openai.yaml +3 -0
  296. package/skills/mattpocock/skills/engineering/diagnosing-bugs/SKILL.md +138 -0
  297. package/skills/mattpocock/skills/engineering/diagnosing-bugs/agents/openai.yaml +3 -0
  298. package/skills/mattpocock/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  299. package/skills/mattpocock/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
  300. package/skills/mattpocock/skills/engineering/domain-modeling/GLOSSARY-FORMAT.md +60 -0
  301. package/skills/mattpocock/skills/engineering/domain-modeling/SKILL.md +74 -0
  302. package/skills/mattpocock/skills/engineering/domain-modeling/agents/openai.yaml +3 -0
  303. package/skills/mattpocock/skills/engineering/grill-with-docs/SKILL.md +7 -0
  304. package/skills/mattpocock/skills/engineering/grill-with-docs/agents/openai.yaml +5 -0
  305. package/skills/mattpocock/skills/engineering/implement/SKILL.md +17 -0
  306. package/skills/mattpocock/skills/engineering/implement/agents/openai.yaml +5 -0
  307. package/skills/mattpocock/skills/engineering/implement-spec/SKILL.md +42 -0
  308. package/skills/mattpocock/skills/engineering/implement-spec/agents/openai.yaml +5 -0
  309. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
  310. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/SKILL.md +71 -0
  311. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/agents/openai.yaml +5 -0
  312. package/skills/mattpocock/skills/engineering/pr/CREDITS.md +3 -0
  313. package/skills/mattpocock/skills/engineering/pr/SKILL.md +170 -0
  314. package/skills/mattpocock/skills/engineering/pr/agents/openai.yaml +3 -0
  315. package/skills/mattpocock/skills/engineering/prototype/LOGIC.md +67 -0
  316. package/skills/mattpocock/skills/engineering/prototype/SKILL.md +26 -0
  317. package/skills/mattpocock/skills/engineering/prototype/UI.md +112 -0
  318. package/skills/mattpocock/skills/engineering/prototype/agents/openai.yaml +3 -0
  319. package/skills/mattpocock/skills/engineering/research/SKILL.md +12 -0
  320. package/skills/mattpocock/skills/engineering/research/agents/openai.yaml +3 -0
  321. package/skills/mattpocock/skills/engineering/retro/SKILL.md +44 -0
  322. package/skills/mattpocock/skills/engineering/retro/agents/openai.yaml +5 -0
  323. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/SKILL.md +120 -0
  324. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/agents/openai.yaml +5 -0
  325. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
  326. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +50 -0
  327. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
  328. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
  329. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
  330. package/skills/mattpocock/skills/engineering/tdd/SKILL.md +38 -0
  331. package/skills/mattpocock/skills/engineering/tdd/agents/openai.yaml +3 -0
  332. package/skills/mattpocock/skills/engineering/tdd/mocking.md +59 -0
  333. package/skills/mattpocock/skills/engineering/tdd/tests.md +77 -0
  334. package/skills/mattpocock/skills/engineering/to-spec/SKILL.md +75 -0
  335. package/skills/mattpocock/skills/engineering/to-spec/agents/openai.yaml +5 -0
  336. package/skills/mattpocock/skills/engineering/to-tickets/SKILL.md +105 -0
  337. package/skills/mattpocock/skills/engineering/to-tickets/agents/openai.yaml +5 -0
  338. package/skills/mattpocock/skills/engineering/triage/AGENT-BRIEF.md +207 -0
  339. package/skills/mattpocock/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
  340. package/skills/mattpocock/skills/engineering/triage/SKILL.md +112 -0
  341. package/skills/mattpocock/skills/engineering/triage/agents/openai.yaml +5 -0
  342. package/skills/mattpocock/skills/engineering/wayfinder/SKILL.md +128 -0
  343. package/skills/mattpocock/skills/engineering/wayfinder/agents/openai.yaml +5 -0
  344. package/skills/mattpocock/skills/engineering/wizard/SKILL.md +44 -0
  345. package/skills/mattpocock/skills/engineering/wizard/agents/openai.yaml +3 -0
  346. package/skills/mattpocock/skills/engineering/wizard/template.sh +223 -0
  347. package/skills/mattpocock/skills/in-progress/README.md +17 -0
  348. package/skills/mattpocock/skills/in-progress/chief-of-staff/SKILL.md +75 -0
  349. package/skills/mattpocock/skills/in-progress/chief-of-staff/agents/openai.yaml +5 -0
  350. package/skills/mattpocock/skills/in-progress/claude-handoff/SKILL.md +18 -0
  351. package/skills/mattpocock/skills/in-progress/claude-handoff/agents/openai.yaml +5 -0
  352. package/skills/mattpocock/skills/in-progress/loop-me/SKILL.md +32 -0
  353. package/skills/mattpocock/skills/in-progress/loop-me/agents/openai.yaml +5 -0
  354. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/SKILL.md +102 -0
  355. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/agents/openai.yaml +5 -0
  356. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
  357. package/skills/mattpocock/skills/in-progress/software-factory/EXAMPLE-TASKS.md +80 -0
  358. package/skills/mattpocock/skills/in-progress/software-factory/GIT-HOSTS.md +84 -0
  359. package/skills/mattpocock/skills/in-progress/software-factory/OBSERVABILITY-PLATFORMS.md +75 -0
  360. package/skills/mattpocock/skills/in-progress/software-factory/RUNNERS.md +94 -0
  361. package/skills/mattpocock/skills/in-progress/software-factory/SKILL.md +98 -0
  362. package/skills/mattpocock/skills/in-progress/software-factory/TICKET-TRACKERS.md +85 -0
  363. package/skills/mattpocock/skills/in-progress/writing-beats/SKILL.md +67 -0
  364. package/skills/mattpocock/skills/in-progress/writing-beats/agents/openai.yaml +5 -0
  365. package/skills/mattpocock/skills/in-progress/writing-fragments/SKILL.md +79 -0
  366. package/skills/mattpocock/skills/in-progress/writing-fragments/agents/openai.yaml +5 -0
  367. package/skills/mattpocock/skills/in-progress/writing-shape/SKILL.md +79 -0
  368. package/skills/mattpocock/skills/in-progress/writing-shape/agents/openai.yaml +5 -0
  369. package/skills/mattpocock/skills/misc/README.md +8 -0
  370. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
  371. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/agents/openai.yaml +3 -0
  372. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
  373. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
  374. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/agents/openai.yaml +3 -0
  375. package/skills/mattpocock/skills/misc/scaffold-exercises/SKILL.md +106 -0
  376. package/skills/mattpocock/skills/misc/scaffold-exercises/agents/openai.yaml +3 -0
  377. package/skills/mattpocock/skills/misc/setup-pre-commit/SKILL.md +91 -0
  378. package/skills/mattpocock/skills/misc/setup-pre-commit/agents/openai.yaml +3 -0
  379. package/skills/mattpocock/skills/productivity/README.md +20 -0
  380. package/skills/mattpocock/skills/productivity/grill-me/SKILL.md +7 -0
  381. package/skills/mattpocock/skills/productivity/grill-me/agents/openai.yaml +5 -0
  382. package/skills/mattpocock/skills/productivity/grilling/SKILL.md +30 -0
  383. package/skills/mattpocock/skills/productivity/grilling/agents/openai.yaml +3 -0
  384. package/skills/mattpocock/skills/productivity/handoff/SKILL.md +16 -0
  385. package/skills/mattpocock/skills/productivity/handoff/agents/openai.yaml +5 -0
  386. package/skills/mattpocock/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
  387. package/skills/mattpocock/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
  388. package/skills/mattpocock/skills/productivity/teach/MISSION-FORMAT.md +31 -0
  389. package/skills/mattpocock/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
  390. package/skills/mattpocock/skills/productivity/teach/SKILL.md +140 -0
  391. package/skills/mattpocock/skills/productivity/teach/agents/openai.yaml +5 -0
  392. package/skills/mattpocock/skills/productivity/to-questionnaire/SKILL.md +54 -0
  393. package/skills/mattpocock/skills/productivity/to-questionnaire/agents/openai.yaml +5 -0
  394. package/skills/mattpocock/skills/productivity/wait-what/SKILL.md +7 -0
  395. package/skills/mattpocock/skills/productivity/wait-what/agents/openai.yaml +5 -0
  396. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL-MECHANICS.md +22 -0
  397. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL.md +81 -0
  398. package/skills/mattpocock/skills/productivity/writing-for-agents/agents/openai.yaml +3 -0
  399. package/skills/task-agents/operator-development/Agent.md +71 -0
  400. package/skills/task-agents/operator-development/skills.json +120 -0
  401. package/skills/task-agents/operator-development/stages.schema.json +532 -0
  402. package/skills/task-agents/performance-optimization/Agent.md +78 -0
  403. package/skills/task-agents/performance-optimization/skills.json +64 -0
  404. package/skills/task-agents/response-protocol.md +35 -0
  405. package/skills/task-agents/sidebar-contracts.schema.json +4168 -0
  406. package/skills/task-agents/sidebar-selection.schema.json +971 -0
  407. package/skills/task-agents/visuals/components.json +283 -0
  408. package/skills/task-agents/visuals/contracts.schema.json +3628 -0
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3
+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4
+ * CANN Open Software License Agreement Version 2.0 (the "License").
5
+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7
+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8
+ * See LICENSE in the root of the software repository for the full text of the License.
9
+ */
10
+
11
+ /*!
12
+ * \file broadcast_tiling_common.h
13
+ * \brief AscendC 广播算子通用件:常量 / TilingData / 切分辅助 helper / 四类广播原语。
14
+ * 纯 AscendC API,不依赖任何模板调度框架,可直接拷入自定义算子工程裁剪使用。
15
+ * 平台:DAV_3510(A5 / Ascend950,C310)。
16
+ *
17
+ * 四类广播实现:
18
+ * ④ OneDim(前置) —— 合轴塌一维时整算子走此路:标量首块 Duplicate 铺满、满输入直搬,tiling 退化 1D
19
+ * ① BroadcastNddma —— GM→UB 多维 DMA,广播轴 srcStride=0 由引擎复制(不占 Vector)
20
+ * ② DataCopyPadCompact —— 每轮紧凑搬入,广播由 GetGmOffset 的 stride=0 寻址实现(外层广播轴用);
21
+ * offset 相同时复用为可选优化(本样例未启用)
22
+ * ③ UbBroadcast —— DataCopyPad 搬紧凑源后用 Broadcast 矢量指令在 UB 内展开
23
+ */
24
+ #ifndef BROADCAST_COMMON_H
25
+ #define BROADCAST_COMMON_H
26
+
27
+ #include "kernel_operator.h"
28
+
29
+ namespace BrcDemo {
30
+ using namespace AscendC;
31
+
32
+ constexpr int64_t BROADCAST_MAX_DIMS = 8; // 支持的最大维数
33
+ constexpr int64_t NDDMA_DIM = 5; // 单次多维 DMA 维数上限
34
+ constexpr int64_t BLOCK_LENGTH = 32; // 对齐字节
35
+
36
+ // brcMode:每个输入由 Host tiling 选定的广播实现
37
+ enum BrcMode { BRC_NONE = 0, BRC_NDDMA = 1, BRC_DATACOPYPAD = 2, BRC_UB = 3 };
38
+
39
+ // 自定义算子可直接照搬这组字段(与框架无关)。IN_NUM 由具体算子定。
40
+ template <int IN_NUM>
41
+ struct BroadcastTilingData {
42
+ int32_t brcMode[IN_NUM]; // 每个输入的广播实现(见 BrcMode)
43
+ int32_t shapeLen; // 输出维数
44
+ int32_t ubSplitAxis; // UB 切分轴
45
+ int32_t ubFormer, ubTail; // UB 主块/尾块(沿 ubSplitAxis)
46
+ int64_t ubOuter; // UB 外循环次数
47
+ int64_t blockNum; // 核数
48
+ int64_t blockFormer, blockTail; // 每核外循环单元数(主/尾核)
49
+ int64_t dimProductBeforeUbInner; // UB tile 总数 = ∏outputDims[0..ubSplitAxis-1] × ubOuter
50
+ int64_t elemNum; // 单 buffer 可容纳元素数
51
+
52
+ int64_t outputDims[BROADCAST_MAX_DIMS];
53
+ int64_t outputStrides[BROADCAST_MAX_DIMS];
54
+ int64_t inputDims[IN_NUM][BROADCAST_MAX_DIMS]; // 广播轴长度=1
55
+ int64_t inputStrides[IN_NUM][BROADCAST_MAX_DIMS]; // 广播轴 stride=0 ★关键
56
+ };
57
+
58
+ // ============================ Host 侧通用切分 ============================
59
+ // 除数用「(x > 0 ? x : 1)」内联钳制,保证静态分析可证除数恒 >=1(G.EXP.22-CPP);
60
+ // 正常调用 b/al 恒 >=1,钳制恒取原值,行为不变。
61
+ static inline int64_t BrcCeilDiv(int64_t a, int64_t b)
62
+ {
63
+ int64_t d = (b > 0) ? b : 1;
64
+ return (a + d - 1) / d;
65
+ }
66
+ static inline int64_t BrcAlignDown(int64_t a, int64_t al)
67
+ {
68
+ int64_t d = (al > 0) ? al : 1;
69
+ return (a / d) * d;
70
+ }
71
+
72
+ // 通用两层切分:自动选 ubSplitAxis 并算 ubFormer/ubOuter/ubTail/dimProductBeforeUbInner/多核切分。
73
+ // 适用任意 rank、任意输出 shape,含「尾轴超 UB 容量」「大 shape 无广播」等场景(替代写死 ubSplitAxis=0)。
74
+ // 前置:td.shapeLen / td.outputDims / td.outputStrides(连续布局)已填。aliveBuf=存活 buffer 数。
75
+ template <int IN_NUM>
76
+ inline void ComputeTiling(
77
+ BroadcastTilingData<IN_NUM>& td, int dtSize, int64_t coreNum, int64_t ubSize, int64_t aliveBuf)
78
+ {
79
+ int rank = td.shapeLen;
80
+ int64_t dtBytes = (dtSize > 0) ? dtSize : 1; // 钳制除数,保证静态可证 >=1(G.EXP.22-CPP)
81
+ int64_t alignEle = BLOCK_LENGTH / dtBytes;
82
+ td.elemNum = BrcAlignDown(ubSize / (aliveBuf * dtBytes * 2 /*DoubleBuffer*/), alignEle);
83
+ if (td.elemNum < alignEle)
84
+ td.elemNum = alignEle;
85
+
86
+ // 1) 从尾轴向外选切分轴:尽量把内层整轴塞进 UB
87
+ int splitAxis = 0;
88
+ int64_t innerBelow = 1; // ∏ outputDims[splitAxis+1 .. rank-1]
89
+ for (int ax = rank - 1; ax >= 0; ax--) {
90
+ if (innerBelow * td.outputDims[ax] > td.elemNum) {
91
+ splitAxis = ax;
92
+ break;
93
+ }
94
+ innerBelow *= td.outputDims[ax];
95
+ splitAxis = ax;
96
+ }
97
+ // 2) 切分轴每行(inner)元素数 = innerBelow(= outputStrides[splitAxis])
98
+ int64_t ubFormer;
99
+ if (innerBelow > td.elemNum) { // 连一行都放不下 → 退到最后一轴按 elemNum 分块
100
+ td.ubSplitAxis = rank - 1;
101
+ innerBelow = 1;
102
+ ubFormer = td.elemNum; // 已对齐
103
+ } else {
104
+ td.ubSplitAxis = splitAxis;
105
+ ubFormer = td.elemNum / innerBelow; // 一次能放几行
106
+ }
107
+ int64_t splitDim = td.outputDims[td.ubSplitAxis];
108
+ if (ubFormer > splitDim)
109
+ ubFormer = splitDim;
110
+ if (ubFormer < 1)
111
+ ubFormer = 1;
112
+ td.ubFormer = ubFormer;
113
+ td.ubOuter = BrcCeilDiv(splitDim, ubFormer);
114
+ td.ubTail = splitDim - (td.ubOuter - 1) * ubFormer; // 可能非 alignEle 倍数,DataCopyPad 自动处理
115
+
116
+ // 3) dimProductBeforeUbInner = ∏outputDims[0..ubSplitAxis-1] × ubOuter(UB tile 总数,通用公式)
117
+ int64_t outerProd = 1;
118
+ for (int j = 0; j < td.ubSplitAxis; j++)
119
+ outerProd *= td.outputDims[j];
120
+ td.dimProductBeforeUbInner = outerProd * td.ubOuter;
121
+
122
+ // 4) 多核:先按核数算每核 tile 数(blockFormer),再回收用不上的核(blockNum),避免 blockTail 为负。
123
+ // (错误写法:先 blockNum=min(core,total) 再 blockFormer=ceil(total/blockNum) → 末核 blockTail 可能<0)
124
+ int64_t totalTiles = td.dimProductBeforeUbInner;
125
+ int64_t cn = (coreNum < 1) ? 1 : coreNum;
126
+ td.blockFormer = BrcCeilDiv(totalTiles, cn); // 每核最多几个 tile
127
+ if (td.blockFormer < 1)
128
+ td.blockFormer = 1;
129
+ td.blockNum = BrcCeilDiv(totalTiles, td.blockFormer); // 回收无效核
130
+ td.blockTail = totalTiles - (td.blockNum - 1) * td.blockFormer; // ∈[1, blockFormer]
131
+ }
132
+
133
+ // ============================ 切分辅助 helper(纯标量) ============================
134
+
135
+ // ① 线性 tile 序号 → 多维下标。axes[ubSplitAxis] ∈ [0, ubOuter),以 ubFormer 行为单位。
136
+ // tileLinear = blockFormer*GetBlockIdx() + loop;tileTotal = dimProductBeforeUbInner
137
+ __aicore__ inline void GetAxesIndices(
138
+ int64_t (&axes)[BROADCAST_MAX_DIMS], int64_t tileLinear, const int64_t (&outputDims)[BROADCAST_MAX_DIMS],
139
+ int64_t ubSplitAxis, int64_t tileTotal)
140
+ {
141
+ int64_t rem = tileTotal;
142
+ for (int64_t idx = 0; idx < ubSplitAxis; idx++) {
143
+ rem /= outputDims[idx];
144
+ axes[idx] = tileLinear / rem;
145
+ tileLinear -= axes[idx] * rem;
146
+ }
147
+ axes[ubSplitAxis] = tileLinear;
148
+ }
149
+
150
+ // ② 外循环每轮 +1(带进位)。切分轴上界 ubOuter,其余轴 outputDims。ubSplitAxis=0 时无外层轴可进位。
151
+ __aicore__ inline void UpdateAxesIndices(
152
+ int64_t (&axes)[BROADCAST_MAX_DIMS], const int64_t (&outputDims)[BROADCAST_MAX_DIMS], int64_t ubSplitAxis,
153
+ int64_t ubOuter)
154
+ {
155
+ axes[ubSplitAxis]++;
156
+ if (axes[ubSplitAxis] == ubOuter) {
157
+ axes[ubSplitAxis] = 0;
158
+ if (ubSplitAxis > 0)
159
+ axes[ubSplitAxis - 1]++; // 防 ubSplitAxis=0 时 axes[-1] 越界
160
+ }
161
+ for (int64_t idx = ubSplitAxis - 1; idx >= 1; idx--) {
162
+ if (axes[idx] == outputDims[idx]) {
163
+ axes[idx] = 0;
164
+ axes[idx - 1]++;
165
+ }
166
+ }
167
+ }
168
+
169
+ // ③ 多维下标 → GM 线性偏移。广播轴 stride=0 → 该轴自动原地复用,无需特殊分支
170
+ __aicore__ inline int64_t GetGmOffset(
171
+ const int64_t (&axes)[BROADCAST_MAX_DIMS], const int64_t (&strides)[BROADCAST_MAX_DIMS], int64_t ubSplitAxis,
172
+ int64_t ubFormer)
173
+ {
174
+ int64_t off = 0;
175
+ for (int64_t idx = 0; idx < ubSplitAxis; idx++)
176
+ off += axes[idx] * strides[idx];
177
+ off += axes[ubSplitAxis] * strides[ubSplitAxis] * ubFormer; // 切分轴以 ubFormer 行为步长
178
+ return off;
179
+ }
180
+
181
+ // ④ 填 UB 内 Broadcast 的 dst/src shape(首轴随主块/尾块变化),供 ③ 使用
182
+ __aicore__ inline void FillUbShape(
183
+ uint32_t (&dstShape)[BROADCAST_MAX_DIMS], uint32_t (&srcShape)[BROADCAST_MAX_DIMS],
184
+ const int64_t (&outputDims)[BROADCAST_MAX_DIMS], const int64_t (&inDims)[BROADCAST_MAX_DIMS], int64_t ubSplitAxis,
185
+ int64_t shapeLen, int64_t curRows)
186
+ {
187
+ dstShape[0] = (uint32_t)curRows;
188
+ srcShape[0] = (inDims[ubSplitAxis] == 1) ? 1u : (uint32_t)curRows; // 切分轴广播则源首轴=1
189
+ for (int64_t i = ubSplitAxis + 1, j = 1; i < shapeLen; i++, j++) {
190
+ dstShape[j] = (uint32_t)outputDims[i];
191
+ srcShape[j] = (uint32_t)inDims[i]; // 广播轴在源上=1
192
+ }
193
+ }
194
+
195
+ // ③ 用:当前 tile 紧凑源的元素数 = 源行数 × 切分轴以下各源轴乘积(广播轴在源上为 1)。
196
+ // 注意:不能用输出 tile 长度(那是展开后的),否则 [M,1] 这类尾轴广播会多搬。
197
+ __aicore__ inline int64_t UbSrcLen(
198
+ const int64_t (&inStrides)[BROADCAST_MAX_DIMS], const int64_t (&inDims)[BROADCAST_MAX_DIMS], int64_t ubSplitAxis,
199
+ int64_t shapeLen, int64_t rows)
200
+ {
201
+ int64_t srcRows = (inStrides[ubSplitAxis] != 0) ? rows : 1; // 切分轴广播则源只 1 行
202
+ int64_t inner = 1;
203
+ for (int64_t j = ubSplitAxis + 1; j < shapeLen; j++)
204
+ inner *= inDims[j];
205
+ return srcRows * inner;
206
+ }
207
+
208
+ // ============================ 实现①:NDDMA 搬入即广播 ============================
209
+
210
+ // 装配多维 DMA 参数:广播轴 loopSrcStride 天然=0 → 引擎复制(逻辑同 atvoss WithoutLoop)
211
+ template <typename T>
212
+ __aicore__ inline AscendC::MultiCopyParams<T, NDDMA_DIM> MakeNddmaParams(
213
+ const int64_t (&outputDims)[BROADCAST_MAX_DIMS], const int64_t (&outputStrides)[BROADCAST_MAX_DIMS],
214
+ const int64_t (&inputStrides)[BROADCAST_MAX_DIMS], int64_t shapeLen, int64_t ubSplitAxis, int64_t ubSplitSize)
215
+ {
216
+ AscendC::MultiCopyLoopInfo<NDDMA_DIM> loop;
217
+ int64_t axisInsideUb = NDDMA_DIM - (shapeLen - ubSplitAxis); // 高位需补几个 size=1 的轴
218
+ // 防御:rank=shapeLen-ubSplitAxis>NDDMA_DIM 时 axisInsideUb<0,下面 NDDMA_DIM-1-axisInsideUb 会越界。
219
+ // Host 选型已对 rank>5 回退 BRC_UB(见 broadcast_add_tiling.cpp / PickBroadcastMode),此处再夹一道。
220
+ if (axisInsideUb < 0)
221
+ axisInsideUb = 0; // 仅防越界;rank>5 应由 Host 拦截
222
+
223
+ for (int64_t i = 0; i < axisInsideUb; i++) {
224
+ loop.loopSize[NDDMA_DIM - 1 - i] = 1;
225
+ loop.loopSrcStride[NDDMA_DIM - 1 - i] = inputStrides[ubSplitAxis];
226
+ loop.loopDstStride[NDDMA_DIM - 1 - i] = outputStrides[ubSplitAxis];
227
+ }
228
+ loop.loopSize[NDDMA_DIM - 1 - axisInsideUb] = ubSplitSize;
229
+ loop.loopSrcStride[NDDMA_DIM - 1 - axisInsideUb] = inputStrides[ubSplitAxis];
230
+ loop.loopDstStride[NDDMA_DIM - 1 - axisInsideUb] = outputStrides[ubSplitAxis];
231
+ for (int64_t i = axisInsideUb + 1; i < NDDMA_DIM; i++) {
232
+ int64_t axis = ubSplitAxis + i - axisInsideUb;
233
+ loop.loopSize[NDDMA_DIM - 1 - i] = outputDims[axis];
234
+ loop.loopSrcStride[NDDMA_DIM - 1 - i] = inputStrides[axis]; // 广播轴=0
235
+ loop.loopDstStride[NDDMA_DIM - 1 - i] = outputStrides[axis];
236
+ }
237
+ return AscendC::MultiCopyParams<T, NDDMA_DIM>{loop, (T)0};
238
+ }
239
+
240
+ // gm 已按当前 tile 偏移;UB tile 内存在广播(split 轴源/目的跨度不一致)→ 多维 DMA 复制,
241
+ // 否则退化为连续搬运(即②)。前置条件:rank = shapeLen - ubSplitAxis <= NDDMA_DIM(=5),
242
+ // rank>5 需 with-loop 版本(本头未实现);Host 选型须保证(见 broadcast_add_tiling.cpp 的 rank 兜底)。
243
+ template <typename T>
244
+ __aicore__ inline void BroadcastNddma(
245
+ const GlobalTensor<T>& gm, const LocalTensor<T>& ub, const int64_t (&outputDims)[BROADCAST_MAX_DIMS],
246
+ const int64_t (&outputStrides)[BROADCAST_MAX_DIMS], const int64_t (&inputStrides)[BROADCAST_MAX_DIMS],
247
+ int64_t shapeLen, int64_t ubSplitAxis, int64_t ubSplitSize)
248
+ {
249
+ if (outputStrides[ubSplitAxis] != inputStrides[ubSplitAxis]) {
250
+ auto params = MakeNddmaParams<T>(outputDims, outputStrides, inputStrides, shapeLen, ubSplitAxis, ubSplitSize);
251
+ static constexpr AscendC::MultiCopyConfig cfg = {false, 0, 0, false}; // 必须 static:模板参为 const&
252
+ AscendC::DataCopy<T, NDDMA_DIM, cfg>(ub, gm, params);
253
+ } else {
254
+ AscendC::DataCopyExtParams ext{1, (uint32_t)(ubSplitSize * inputStrides[ubSplitAxis] * sizeof(T)), 0, 0, 0};
255
+ AscendC::DataCopyPadExtParams<T> pad{false, 0, 0, 0};
256
+ AscendC::DataCopyPad(ub, gm, ext, pad);
257
+ }
258
+ }
259
+
260
+ // ============================ 实现②:DataCopyPad 紧凑搬入 ============================
261
+
262
+ // 紧凑连续搬一段(不复制,lenEle 可非 32B 对齐,DataCopyPad 自动 pad)。② 广播效果不在这里,
263
+ // 而在 GM offset:外层广播轴 stride=0,GetGmOffset 会让这些轴推进时仍指向同一段 GM(见 GetGmOffset)。
264
+ template <typename T>
265
+ __aicore__ inline void DataCopyPadCompact(const GlobalTensor<T>& gm, const LocalTensor<T>& ub, int64_t lenEle)
266
+ {
267
+ AscendC::DataCopyExtParams ext{1, (uint32_t)(lenEle * sizeof(T)), 0, 0, 0};
268
+ AscendC::DataCopyPadExtParams<T> pad{false, 0, 0, 0};
269
+ AscendC::DataCopyPad(ub, gm, ext, pad);
270
+ }
271
+
272
+ // 可选优化(本样例未启用,正确性见 datacopypad_design.md):当某广播输入本轮 GM offset 与上轮相同
273
+ // (仅外层广播轴推进、切分轴未变)时可跳过搬运、复用上轮 UB。DoubleBuffer 下需按 buffer 槽位分别记录
274
+ // 已填 offset,比"切分轴 stride"判据更通用——后者在 ② 路径恒为真,会让复用永不生效(死路径)。
275
+
276
+ // ============================ 实现③:UB 内 Broadcast 指令 ============================
277
+
278
+ // src 已是 UB 内紧凑源(GM 输入先 DataCopyPadCompact,或上游计算结果);dst 为展开目标
279
+ template <typename T>
280
+ __aicore__ inline void UbBroadcast(
281
+ const LocalTensor<T>& dst, const LocalTensor<T>& src, const int64_t (&outputDims)[BROADCAST_MAX_DIMS],
282
+ const int64_t (&inDims)[BROADCAST_MAX_DIMS], int64_t ubSplitAxis, int64_t shapeLen, int64_t curRows)
283
+ {
284
+ uint32_t dShape[BROADCAST_MAX_DIMS], sShape[BROADCAST_MAX_DIMS];
285
+ FillUbShape(dShape, sShape, outputDims, inDims, ubSplitAxis, shapeLen, curRows);
286
+ int64_t rank = shapeLen - ubSplitAxis;
287
+ // 退化守卫:无任何可展开维(所有 dShape==sShape,如切分轴广播但 tile 内仅 1 行)时,
288
+ // Broadcast 会变成 src==dst 的空广播并产生 nan。此时直接拷贝 src→dst(src 已是该 tile 正确数据)。
289
+ bool anyExpand = false;
290
+ int64_t cnt = 1;
291
+ for (int64_t k = 0; k < rank; k++) {
292
+ if (dShape[k] > sShape[k])
293
+ anyExpand = true;
294
+ cnt *= dShape[k];
295
+ }
296
+ if (!anyExpand) { // 无可展开维:直接 UB→UB 拷贝(dtype 无关,避免空广播 nan)
297
+ int32_t alignEle = BLOCK_LENGTH / sizeof(T);
298
+ int32_t cntAlign = ((int32_t)cnt + alignEle - 1) / alignEle * alignEle; // 向上对齐;buffer=elemNum 不越界
299
+ AscendC::DataCopy(dst, src, cntAlign); // CopyOut 只写真实 tile,多拷的对齐尾部无害
300
+ return;
301
+ }
302
+ AscendC::BroadcastTiling bt;
303
+ AscendC::GetBroadcastTilingInfo<T>(rank, dShape, sShape, false, bt);
304
+ AscendC::Broadcast<T>(dst, src, dShape, sShape, &bt);
305
+ }
306
+
307
+ // ============================ 实现④:OneDim 合轴塌一维快路径(标量广播) ============================
308
+ // 适用:合轴后塌成一维——每个输入要么满 shape(连续)、要么纯标量,全连续。是 scalar 广播(lr/scale/
309
+ // alpha 等)与同 shape elementwise 的最快实现:标量首块 Duplicate 铺满 UB 后复用,不走逐块 DMA;多维
310
+ // tiling 退化成 1D,固定成本最低(对标 atvoss SCH_MODE_ONE_DIM_ADVANCE,schMode 202)。
311
+ // 注意:[M,1]→[M,N] 这类"部分轴广播"合轴后仍是多维,不属本路径,走 ①②③。
312
+
313
+ // 极简 TilingData(对标 Advance):只携带 1D 总长 + 块大小 + 核数 + 标量位,切分由 kernel 运行期推导。
314
+ struct OneDimTilingData {
315
+ int64_t dimLen; // 输出总元素数(合轴后一维长度)
316
+ int32_t tileNum; // 单块 UB 元素数(已对齐)
317
+ int32_t blockNum; // 实际启用核数
318
+ int32_t scalarFlag; // bit i = 1 → 第 i 个输入是标量(首块 Duplicate)
319
+ };
320
+
321
+ // Host 选型:判断能否走 OneDim,并求 dimLen / scalarFlag。
322
+ // 规则:每个输入要么纯标量(∏inputDims==1)要么满 shape(∏inputDims==dimLen),否则塌不成一维返回 false。
323
+ template <int IN_NUM>
324
+ inline bool TryOneDim(const BroadcastTilingData<IN_NUM>& td, int64_t& dimLen, int32_t& scalarFlag)
325
+ {
326
+ dimLen = 1;
327
+ for (int j = 0; j < td.shapeLen; j++)
328
+ dimLen *= td.outputDims[j];
329
+ scalarFlag = 0;
330
+ for (int i = 0; i < IN_NUM; i++) {
331
+ int64_t cnt = 1;
332
+ for (int j = 0; j < td.shapeLen; j++)
333
+ cnt *= td.inputDims[i][j];
334
+ if (cnt == 1)
335
+ scalarFlag |= (1 << i); // 纯标量
336
+ else if (cnt != dimLen)
337
+ return false; // 既非标量又非满 shape → 不能塌一维
338
+ }
339
+ return true;
340
+ }
341
+
342
+ // Host tiling(对标 Advance):只算 dimLen / tileNum / blockNum,其余切分留给 kernel 运行期推。
343
+ // aliveBuf=存活 buffer 数(满输入双缓冲计 1,标量首块单块也计 1,输出双缓冲计 1;保守取上界即可)。
344
+ inline void ComputeOneDimTiling(
345
+ OneDimTilingData& t, int64_t dimLen, int32_t scalarFlag, int dtSize, int64_t coreNum, int64_t ubSize,
346
+ int64_t aliveBuf)
347
+ {
348
+ t.dimLen = dimLen;
349
+ t.scalarFlag = scalarFlag;
350
+ int64_t dtBytes = (dtSize > 0) ? dtSize : 1; // 钳制除数,保证静态可证 >=1(G.EXP.22-CPP)
351
+ int64_t alignEle = BLOCK_LENGTH / dtBytes;
352
+ int64_t tileNum = BrcAlignDown(ubSize / (aliveBuf * dtBytes * 2 /*DoubleBuffer*/), alignEle);
353
+ if (tileNum < alignEle)
354
+ tileNum = alignEle;
355
+ int64_t ubOuter = BrcCeilDiv(dimLen, tileNum); // 一维共几块
356
+ int64_t cn = (coreNum < 1) ? 1 : coreNum;
357
+ if (ubOuter < cn)
358
+ cn = (ubOuter < 1) ? 1 : ubOuter; // 块数不足核数 → 减核(小 shape 自适应)
359
+ t.tileNum = (int32_t)tileNum;
360
+ t.blockNum = (int32_t)cn;
361
+ }
362
+
363
+ // Kernel 端运行期推导当前核的循环参数(对标 Advance:tiling 只给 dimLen/tileNum/blockNum)。
364
+ // baseOffset = 本核起始元素偏移;loops = 本核块数;tailLen = 本核最后一块的元素数。
365
+ struct OneDimCoreParam {
366
+ int64_t baseOffset;
367
+ int64_t loops;
368
+ int64_t tailLen;
369
+ };
370
+ __aicore__ inline OneDimCoreParam OneDimCalcCore(int64_t dimLen, int64_t tileNum, int64_t blockNum)
371
+ {
372
+ int64_t tn = (tileNum > 0) ? tileNum : 1; // 钳制除数,保证静态可证 >=1(G.EXP.22-CPP)
373
+ int64_t bn = (blockNum > 0) ? blockNum : 1;
374
+ int64_t ubOuter = (dimLen + tn - 1) / tn;
375
+ int64_t ubTail = dimLen - (ubOuter - 1) * tn; // 最后一块元素数(可非对齐)
376
+ int64_t blockFormer = (ubOuter + bn - 1) / bn; // 每核块数(先定块数)
377
+ int64_t blockTail = ubOuter - (bn - 1) * blockFormer; // 尾核块数 ∈[1, blockFormer]
378
+ int64_t bid = AscendC::GetBlockIdx();
379
+ OneDimCoreParam p;
380
+ p.baseOffset = blockFormer * tn * bid;
381
+ bool lastCore = (bid == bn - 1);
382
+ p.loops = lastCore ? blockTail : blockFormer;
383
+ p.tailLen = lastCore ? ubTail : tn; // 非尾核最后一块仍是整块
384
+ return p;
385
+ }
386
+
387
+ // OneDim 单输入搬入:标量仅首块 Duplicate 铺满(后续块复用同一 UB,调用方勿重 Alloc);满 shape 逐块连续搬。
388
+ template <typename T>
389
+ __aicore__ inline void OneDimLoadInput(
390
+ const LocalTensor<T>& dst, const GlobalTensor<T>& gm, int64_t offset, int64_t len, bool isScalar, bool firstTile)
391
+ {
392
+ if (isScalar) {
393
+ if (firstTile)
394
+ AscendC::Duplicate(dst, gm.GetValue(0), len); // 标量值铺满;之后复用
395
+ } else {
396
+ DataCopyPadCompact(gm[offset], dst, len); // 满输入:连续搬,非对齐 Pad 兜底
397
+ }
398
+ }
399
+
400
+ } // namespace BrcDemo
401
+ #endif // BROADCAST_COMMON_H
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3
+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4
+ * CANN Open Software License Agreement Version 2.0 (the "License").
5
+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7
+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8
+ * See LICENSE in the root of the software repository for the full text of the License.
9
+ */
10
+
11
+ /*!
12
+ * \file onedim_add_kernel.cpp
13
+ * \brief 端到端样例(Kernel 侧):z = x + y,y 为标量 → ④ OneDim 快路径。
14
+ * 演示「OneDimCalcCore 运行期推切分 → 标量首块 Duplicate(单块复用)、满输入逐块搬 → 一维写回」。
15
+ * 与 broadcast_add_kernel.cpp 同形式;范式级代码:GET_TILING_DATA / DTYPE_X 等按工程宏占位。
16
+ */
17
+ #include "broadcast_tiling_common.h"
18
+
19
+ namespace BrcDemo {
20
+
21
+ template <typename T>
22
+ class OneDimAdd {
23
+ public:
24
+ __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, const OneDimTilingData& t)
25
+ {
26
+ ot_ = t;
27
+ xScalar_ = ot_.scalarFlag & (1 << 0);
28
+ yScalar_ = ot_.scalarFlag & (1 << 1);
29
+ xGm_.SetGlobalBuffer((__gm__ T*)x);
30
+ yGm_.SetGlobalBuffer((__gm__ T*)y);
31
+ zGm_.SetGlobalBuffer((__gm__ T*)z);
32
+ // 满输入走双缓冲队列;标量输入走单块 TBuf(首块 Duplicate,整轮复用,不进 ping-pong)
33
+ if (xScalar_)
34
+ pipe_.InitBuffer(xBuf_, ot_.tileNum * sizeof(T));
35
+ else
36
+ pipe_.InitBuffer(qx_, 2, ot_.tileNum * sizeof(T));
37
+ if (yScalar_)
38
+ pipe_.InitBuffer(yBuf_, ot_.tileNum * sizeof(T));
39
+ else
40
+ pipe_.InitBuffer(qy_, 2, ot_.tileNum * sizeof(T));
41
+ pipe_.InitBuffer(qz_, 2, ot_.tileNum * sizeof(T));
42
+ }
43
+
44
+ __aicore__ inline void Process()
45
+ {
46
+ // 运行期从 dimLen/tileNum/blockNum 推本核循环参数(对标 Advance)
47
+ OneDimCoreParam cp = OneDimCalcCore(ot_.dimLen, ot_.tileNum, ot_.blockNum);
48
+ int64_t off = cp.baseOffset;
49
+ for (int64_t loop = 0; loop < cp.loops; loop++) {
50
+ int64_t len = (loop == cp.loops - 1) ? cp.tailLen : ot_.tileNum; // 最后一块可非对齐
51
+ bool first = (loop == 0);
52
+
53
+ LocalTensor<T> xv = LoadInput(qx_, xBuf_, xGm_, xScalar_, off, len, first);
54
+ LocalTensor<T> yv = LoadInput(qy_, yBuf_, yGm_, yScalar_, off, len, first);
55
+
56
+ LocalTensor<T> zv = qz_.template AllocTensor<T>();
57
+ AscendC::Add(zv, xv, yv, len);
58
+ qz_.EnQue(zv);
59
+ if (!xScalar_)
60
+ qx_.FreeTensor(xv);
61
+ if (!yScalar_)
62
+ qy_.FreeTensor(yv);
63
+
64
+ LocalTensor<T> zo = qz_.template DeQue<T>();
65
+ AscendC::DataCopyExtParams ext{1, (uint32_t)(len * sizeof(T)), 0, 0, 0};
66
+ AscendC::DataCopyPad(zGm_[off], zo, ext); // 一维连续写回
67
+ qz_.FreeTensor(zo);
68
+ off += ot_.tileNum;
69
+ }
70
+ }
71
+
72
+ private:
73
+ // 标量:单块 TBuf,首块 Duplicate 一次后复用(不 EnQue);满输入:队列 Alloc + 连续搬入 + EnQue→DeQue。
74
+ __aicore__ inline LocalTensor<T> LoadInput(
75
+ TQue<TPosition::VECIN, 2>& q, TBuf<TPosition::VECCALC>& buf, const GlobalTensor<T>& gm, bool isScalar,
76
+ int64_t off, int64_t len, bool firstTile)
77
+ {
78
+ if (isScalar) {
79
+ LocalTensor<T> s = buf.template Get<T>();
80
+ OneDimLoadInput(s, gm, off, len, /*isScalar=*/true, firstTile); // 仅首块 Duplicate 铺满
81
+ return s;
82
+ }
83
+ LocalTensor<T> in = q.template AllocTensor<T>();
84
+ OneDimLoadInput(in, gm, off, len, /*isScalar=*/false, firstTile); // 满输入:连续搬入
85
+ q.EnQue(in);
86
+ return q.template DeQue<T>();
87
+ }
88
+
89
+ TPipe pipe_;
90
+ TQue<TPosition::VECIN, 2> qx_, qy_;
91
+ TQue<TPosition::VECOUT, 2> qz_;
92
+ TBuf<TPosition::VECCALC> xBuf_, yBuf_; // 标量输入专用单块(满输入不用)
93
+ GlobalTensor<T> xGm_, yGm_, zGm_;
94
+ OneDimTilingData ot_;
95
+ bool xScalar_{false}, yScalar_{false};
96
+ };
97
+
98
+ } // namespace BrcDemo
99
+
100
+ // 算子入口
101
+ extern "C" __global__ __aicore__ void onedim_add(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
102
+ {
103
+ GET_TILING_DATA(ot, tiling); // 解析 OneDimTilingData
104
+ BrcDemo::OneDimAdd<DTYPE_X> op;
105
+ op.Init(x, y, z, ot);
106
+ op.Process();
107
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3
+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4
+ * CANN Open Software License Agreement Version 2.0 (the "License").
5
+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7
+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8
+ * See LICENSE in the root of the software repository for the full text of the License.
9
+ */
10
+
11
+ /*!
12
+ * \file onedim_add_tiling.cpp
13
+ * \brief 端到端样例(Host 侧):z = x + y,y 为标量 → 合轴塌一维,走 ④ OneDim 快路径。
14
+ * 演示「构造 shape/stride → TryOneDim 命中 → ComputeOneDimTiling 极简切分」。
15
+ * 与 broadcast_add_tiling.cpp 同形式;范式级代码:AlignDown/平台查询/ge 类型等按工程惯例占位,
16
+ * 落地需接 op proto / tiling 注册。
17
+ */
18
+ #include "broadcast_tiling_common.h"
19
+
20
+ namespace BrcDemo {
21
+
22
+ constexpr int IN_NUM = 2; // x(满 shape), y(标量)
23
+ using TD = BroadcastTilingData<IN_NUM>;
24
+
25
+ // 简化的切分入口(省略 context 取值/校验)。输出 [M,N];x 满 shape;y 为标量(单元素)。
26
+ // 产物是 OneDimTilingData(极简:dimLen/tileNum/blockNum/scalarFlag),写入 GE tiling 上下文。
27
+ ge::graphStatus AddScalarTiling(OneDimTilingData& ot, int64_t M, int64_t N, int dtSize, int64_t coreNum, int64_t ubSize)
28
+ {
29
+ TD td;
30
+ // ---- 1. shape / stride(输出连续;标量输入各轴 dim=1 / stride=0)----
31
+ td.shapeLen = 2;
32
+ td.outputDims[0] = M;
33
+ td.outputDims[1] = N;
34
+ td.outputStrides[0] = N;
35
+ td.outputStrides[1] = 1;
36
+ td.inputDims[0][0] = M;
37
+ td.inputDims[0][1] = N; // x 满 shape
38
+ td.inputStrides[0][0] = N;
39
+ td.inputStrides[0][1] = 1;
40
+ td.inputDims[1][0] = 1;
41
+ td.inputDims[1][1] = 1; // y 标量(紧凑存 1 个元素)
42
+ td.inputStrides[1][0] = 0;
43
+ td.inputStrides[1][1] = 0;
44
+
45
+ // ---- 2. 前置:能否塌成一维(每输入要么满 shape 要么纯标量)----
46
+ int64_t dimLen;
47
+ int32_t scalarFlag;
48
+ if (!TryOneDim(td, dimLen, scalarFlag)) {
49
+ // 塌不成一维(部分轴广播,如 [M,1]/[1,N])→ 改走 ①②③(见 broadcast_add_tiling.cpp)。
50
+ // 本样例 x 满 + y 标量必命中;返回失败仅示意"未命中则换路"。
51
+ return ge::GRAPH_FAILED;
52
+ }
53
+ // scalarFlag:bit0=0(x 满 shape)、bit1=1(y 标量);kernel 据此对各输入分发
54
+
55
+ // ---- 3. OneDim 极简切分:只算 dimLen/tileNum/blockNum,其余切分留给 kernel 运行期 ----
56
+ // buffer 槽位:x 双缓冲(1) + 标量 y 单块(1) + z 双缓冲(1) = 3,取 IN_NUM+1 为保守上界
57
+ int64_t aliveBuf = IN_NUM + 1;
58
+ ComputeOneDimTiling(ot, dimLen, scalarFlag, dtSize, coreNum, ubSize, aliveBuf);
59
+
60
+ // context_->SetBlockDim(ot.blockNum); // 落地时设置
61
+ return ge::GRAPH_SUCCESS;
62
+ }
63
+
64
+ } // namespace BrcDemo
@@ -0,0 +1,46 @@
1
+ # 实现②:DataCopyPad 紧凑搬入(外层广播,offset 寻址)
2
+
3
+ > 主文档:[broadcast_design.md](broadcast_design.md) | 参考代码:[`code/broadcast_tiling_common.h`](code/broadcast_tiling_common.h)(`DataCopyPadCompact`)
4
+
5
+ ## 思路
6
+
7
+ 当广播轴**全部位于切分轴之上(外层循环轴)**时,UB tile 内数据连续、无需复制。广播由 **GM offset 算术**实现:外层广播轴 `stride=0`,`GetGmOffset` 在这些轴推进时给出同一段 GM 偏移,于是每个 tile 用普通 `DataCopyPad` 搬一段连续数据即可,"广播"体现在不同输出 tile 指向相同输入区。
8
+
9
+ ## 适用
10
+
11
+ 广播轴全在切分轴之上(`brcInTile == false`)、切分轴本身连续。同 ① 一样不占 Vector,且比 ① 更省——连 DMA 的 in-tile 复制都不需要,纯连续搬。
12
+
13
+ > ② 与 ① **共用同一段 kernel**:`BroadcastNddma` 内 `outputStrides[ubSplitAxis] == inputStrides[ubSplitAxis]`(切分轴非广播、tile 内无需复制)时自动落入 `DataCopyPadCompact`。
14
+
15
+ ## Kernel 写法
16
+
17
+ ```cpp
18
+ // 节选,完整见 code/broadcast_add_kernel.cpp
19
+ if (td_.brcMode[i] == BRC_DATACOPYPAD) {
20
+ int64_t off = GetGmOffset(axes, inputStrides[i], ubSplitAxis, ubFormer); // 外层广播轴 stride=0 → off 复用
21
+ int64_t len = rows * inputStrides[i][ubSplitAxis]; // 切分轴非广播,len=tile
22
+ DataCopyPadCompact(yGm[off], dst, len); // 每轮搬,正确且安全
23
+ }
24
+ ```
25
+
26
+ 紧凑搬入 `DataCopyPadCompact`(`code/broadcast_tiling_common.h`):
27
+
28
+ ```cpp
29
+ AscendC::DataCopyExtParams ext{1, (uint32_t)(lenEle * sizeof(T)), 0, 0, 0}; // blockCount=1,连续一段
30
+ AscendC::DataCopyPad(ub, gm, ext, pad); // lenEle 可非 32B 对齐
31
+ ```
32
+
33
+ ## 关于"复用"(可选优化,本样例未启用)
34
+
35
+ 早期版本想靠"不重搬 + 复用上轮 buffer"省搬运,但**判据不能用"切分轴 stride"**:② 路径下切分轴恒非广播(`inputStrides[ubSplitAxis] != 0`),该判据永远要求重搬,复用分支是**死路径**,并不省。
36
+
37
+ 正确的复用判据是「**本输入 GM offset 与上一轮相同**」——即本轮只推进了外层广播轴(stride=0)、切分轴未变。此时上轮 UB 内容仍有效可复用。注意:
38
+
39
+ - **DoubleBuffer 复杂性**:depth=2 的 TQue 每轮交替返回 ping/pong 两块。复用需按 buffer 槽位分别记录"该槽当前持有哪个 offset 的数据",仅当目标槽已持有当前 offset 才跳过搬运。简单做法是给该广播输入改用单块 `TBuf`(非 ping-pong),自行管 MTE2→V 同步。
40
+ - **收益有限**:多搬几次连续数据是安全的(不影响正确性),仅多占 MTE2。**入门样例选择每轮都搬**,把复用留作 profiling 确认 ② 的搬运成为瓶颈后再加的优化。
41
+
42
+ ## 注意
43
+
44
+ - ② 的广播完全靠 `inputStrides` 的 0 与 `GetGmOffset`,kernel 里**不需要任何广播指令或 DMA 复制**。
45
+ - `len` 用真实元素数(含非对齐尾块),`DataCopyPad` 自动 pad,无需手动处理。
46
+ - 若要做复用优化,复用 buffer 不能与每轮重写的输入共用,且判据用 offset 比较而非切分轴 stride。
@@ -0,0 +1,14 @@
1
+ # Broadcast 族(B 型多实现选型)
2
+
3
+ 选型决策树(决定性能的核心,选错直接慢甚至 nan):
4
+
5
+ ```
6
+ 广播轴是一维且在前(OneDim 形态)→ OneDim 前置快路径
7
+ 其余形态三选一(按 shape/对齐/带宽特征):
8
+ ├─ NDDMA:……(非对齐容忍场景)
9
+ ├─ DataCopyPad:……(padding 场景)
10
+ └─ UB 中转:……(小 shape 场景)
11
+ ```
12
+
13
+ 结构:本总览(速查+决策树)+ 三份分册 + `code/` 可裁剪源码。
14
+ 内容沉淀自广播类算子多实现选型实践。