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,423 @@
1
+ # SWAT 调度模式技术文档
2
+
3
+ ## 1. 背景
4
+
5
+ 在昇腾 AI 处理器上执行大规模矩阵乘(尤其是量化场景如 MXFP4/MXFP8)时,Cube 侧的算力利用率很大程度上取决于**调度器如何把 `M × N` 的逻辑分块分配给有限数量的 AIC 核**。常见痛点有三类:
6
+
7
+ 1. **非方阵分块 + B 侧流式加载**:当 A、B 都不常驻 L1(non-full-load),B 片段要反复从 GM/L2 流入。如果相邻核按朴素的"先行后列"顺序推进 N,B 就会频繁失效,导致 MTE2 带宽成为瓶颈。
8
+ 2. **尾部薄片**:`M % baseM`、`N % baseN` 经常产生一个明显小于 `baseM/baseN` 的边缘 tile。它与相邻满块一起落到同一个 serpentine 行窗口里,窗口的关键路径被满块拖到 `baseM`,尾薄块的"省算"收益被完全吃掉。
9
+ 3. **最后一轮空闲核**:`totalCnt = mCnt × nCnt` 往往不是 `blockNum`(AIC 核数)的整数倍,最后一轮里只有前 `endBlockIdx+1` 个核有任务,其余核空转,拖高整体时延。
10
+
11
+ **SWAT** 就是针对 non-full-load 路径提出的组合调度策略,名字可以读成「**S**erpentine **W**indow + **A**daptive **T**ail」。它用三个相互独立、又互相约束边界的机制一次性解决上述三个问题:
12
+
13
+ | 机制 | 定位 | 对应问题 |
14
+ |---|---|---|
15
+ | A. Serpentine 行窗口遍历 | 全局遍历顺序 | B 侧流式带宽复用 |
16
+ | B. 尾部基块合并(尺寸重排) | 稳态区与尾区之间的桥梁 | M/N 边缘薄片 |
17
+ | C. 尾块二维再切分 | 最后一轮局部处理 | 末轮空闲核 |
18
+
19
+ 三者都沿用一个共同的常量 `WINDOW_LEN = 4`(serpentine 行窗口高度),从而保持 host tiling、device scheduler、device kernel 三层的切分边界对齐。
20
+
21
+ SWAT 下有两种子模式:
22
+
23
+ - `NO_FULL_LOAD_MODE`:A、B 都流式,本文分析的主要版本。
24
+ - `A_FULL_LOAD_MODE`:A 常驻 L1,只流式 B,机制 C 被简化。
25
+
26
+ 模式通过一个编译期标签选择:
27
+
28
+ ```cpp
29
+ template <uint64_t FULL_LOAD_MODE_>
30
+ struct QuantMatmulMxSwatScheduler {
31
+ static constexpr uint64_t fullLoadMode = FULL_LOAD_MODE_;
32
+ };
33
+
34
+ constexpr uint64_t NO_FULL_LOAD_MODE = 0UL;
35
+ constexpr uint64_t A_FULL_LOAD_MODE = 1UL;
36
+ ```
37
+
38
+ ## 2. 调度器整体结构
39
+
40
+ SWAT 调度器为每个 AIC 核独立维护一份"我下一轮做哪一个 tile"的迷你状态机,状态由 host tiling 决定的 `Params` 初始化:
41
+
42
+ ```cpp
43
+ struct Params {
44
+ int64_t baseM; // 稳态基础 tile M
45
+ int64_t baseN; // 稳态基础 tile N
46
+ int64_t mTailTile; // 机制 C:M 方向二维子切分倍率
47
+ int64_t nTailTile; // 机制 C:N 方向二维子切分倍率
48
+ int64_t mBaseTailSplitCnt; // 机制 B:M 尾部合并区 tile 数
49
+ int64_t nBaseTailSplitCnt; // 机制 B:N 尾部合并区 tile 数
50
+ int64_t mTailMain; // 机制 B:M 合并区"主尺寸"
51
+ int64_t nTailMain; // 机制 B:N 合并区"主尺寸"
52
+ };
53
+ ```
54
+
55
+ 关键运行时字段(节选):
56
+
57
+ ```cpp
58
+ int64_t m_, n_, k_;
59
+ int64_t baseM_, baseN_;
60
+ int64_t mCnt_, nCnt_, totalCnt_; // 各方向 tile 数
61
+ int64_t mBaseNormCnt_, nBaseNormCnt_; // 机制 B: 保持 baseM/baseN 的 tile 数
62
+ int64_t mBaseTailMain_, nBaseTailMain_; // 机制 B: 合并区主尺寸
63
+ int64_t mBaseTailLast_, nBaseTailLast_; // 机制 B: 合并区末块尺寸
64
+ int64_t mCoreNum_, mTailCoreNum_; // 机制 A: 行窗口高度 / 末窗口高度
65
+ int64_t mainRow_; // 机制 A: 稳态行窗口层数
66
+ int64_t blockIdx_, blockNum_; // AIC 自身索引 / 总数
67
+ int64_t startBlockIdx_, endBlockIdx_; // 活跃核范围
68
+ int64_t roundIdx_, round_; // 我要跑几轮 / 当前第几轮
69
+ int64_t mTailTile_, nTailTile_, totalTailTile_; // 机制 C
70
+
71
+ static constexpr int64_t WINDOW_LEN = 4;
72
+ ```
73
+
74
+ kernel 层只看到一个循环接口:
75
+
76
+ ```cpp
77
+ while (bs.GetTileIdx(blockIdx)) {
78
+ int64_t mPos = Get<MNK_M>(blockIdx);
79
+ int64_t nPos = Get<MNK_N>(blockIdx);
80
+ BlockShape singleShape = bs.GetBlockShape(blockIdx);
81
+ if (Get<MNK_M>(singleShape) <= 0 || Get<MNK_N>(singleShape) <= 0) {
82
+ return; // 机制 C 产生的空子块
83
+ }
84
+ // 以 (mPos, nPos) 与 singleShape 切 GM 张量,送给 BlockMmad
85
+ mmadOp_(gmBlockA, gmBlockB, gmBlockScaleA, gmBlockScaleB, gmBlockC, singleShape);
86
+ }
87
+ ```
88
+
89
+ 调度器约定把 `BlockCoord` 的 M/N 槽用作**GM 起点坐标**,把 K/B 槽当作**逻辑 tile 索引**寄存处,这样 `GetBlockShape` 后面还能重建出形状。
90
+
91
+ ## 3. 机制 A:Serpentine 行窗口遍历
92
+
93
+ ### 3.1 目的
94
+
95
+ 在 non-full-load 路径下 B 是流式的,如果所有核"从左扫到右"再"从左扫到右",相邻两次扫描复用不到 B 已加载的片段。Serpentine 把每 `WINDOW_LEN` 行打成一个行窗口,窗口内多核并行走 M,**沿 N 推进时奇数行窗口反向**,让两次推进的 N 边界继续落在同一个 B 片段,从而最大化 L1/L2 命中。
96
+
97
+ ### 3.2 构造期建模
98
+
99
+ ```cpp
100
+ m_ = shape.m; n_ = shape.n; k_ = shape.k;
101
+ baseM_ = params.baseM; baseN_ = params.baseN;
102
+ mCnt_ = CeilDiv(m_, baseM_);
103
+ nCnt_ = CeilDiv(n_, baseN_);
104
+ totalCnt_ = mCnt_ * nCnt_;
105
+
106
+ mCoreNum_ = Min(WINDOW_LEN, mCnt_); // 行窗口高度,封顶 4
107
+ mainRow_ = mCnt_ / mCoreNum_ - 1; // 稳态区窗口层数
108
+ mTailCoreNum_ = mCnt_ - mCoreNum_ * mainRow_; // 末窗口实际高度
109
+
110
+ endBlockIdx_ = (totalCnt_ - 1) % blockNum_;
111
+ round_ = CeilDiv(totalCnt_, blockNum_);
112
+ if (blockIdx_ > endBlockIdx_) {
113
+ round_ -= 1;
114
+ }
115
+ ```
116
+
117
+ - `mCoreNum_` = 行窗口内并行处理 M 的核数。
118
+ - `mainRow_` = 完整窗口层数,最后一层交给 `mTailCoreNum_` 处理(不满 4 也不退化)。
119
+ - `round_` = 当前核需要跑几轮。
120
+
121
+ ### 3.3 运行期映射
122
+
123
+ `GetTileIdx` 把线性 `tileIdx` 还原到 `(rowIdx, mTileIdx, nTileIdx)`,最后对奇数行反转 N:
124
+
125
+ ```cpp
126
+ int64_t rowIdx = tileIdx / nCnt_ / mCoreNum_;
127
+ int64_t mTileIdx = 0, nTileIdx = 0;
128
+ if (rowIdx < mainRow_) {
129
+ mTileIdx = rowIdx * mCoreNum_ + tileIdx % mCoreNum_;
130
+ nTileIdx = (tileIdx / mCoreNum_) % nCnt_;
131
+ } else {
132
+ rowIdx = mainRow_;
133
+ int64_t tailIdx = tileIdx - mainRow_ * mCoreNum_ * nCnt_;
134
+ mTileIdx = mainRow_ * mCoreNum_ + tailIdx % mTailCoreNum_;
135
+ nTileIdx = (tailIdx / mTailCoreNum_) % nCnt_;
136
+ }
137
+ if (rowIdx & 1) {
138
+ nTileIdx = nCnt_ - 1 - nTileIdx; // 奇数行反向
139
+ }
140
+ ```
141
+
142
+ 关键不变量:**行窗口的边界在整个调度中是神圣的**——机制 B 的合并区、机制 C 的切分区都必须沿 `WINDOW_LEN` 对齐,不能打碎窗口。
143
+
144
+ ## 4. 机制 B:尾部基块合并(尺寸重排,不改数量)
145
+
146
+ ### 4.1 目标
147
+
148
+ 如果 `m % baseM` 产生一个明显小于 `baseM` 的薄片,行窗口的关键路径被它周围的满块拖到 `baseM`。机制 B 把**最后若干个 tile(含薄片)的 M 尺寸重新等分**,让它们变得均匀。**tile 数量保持不变**,变的只是尺寸分布。
149
+
150
+ ### 4.2 Host 侧搜索
151
+
152
+ ```cpp
153
+ if (mTailSize > 0UL && isInnerAxisAlign) {
154
+ uint64_t baseTailCntMax = std::min((runInfo_.baseM - mTailSize) / BASIC_BLOCK_SIZE_16,
155
+ runInfo_.mBlockCnt);
156
+ uint64_t windowSize = std::min(WINDOW_LEN, runInfo_.mBlockCnt);
157
+ uint64_t mainWindowNum = runInfo_.mBlockCnt / windowSize - 1UL;
158
+ uint64_t tailWindowSize = runInfo_.mBlockCnt - mainWindowNum * windowSize;
159
+ uint64_t perfRes = (mainWindowNum + 1UL) * runInfo_.baseM;
160
+ uint64_t mergeWindowNum = 1UL;
161
+
162
+ for (uint64_t mergeLen = tailWindowSize - 1UL; mergeLen < baseTailCntMax;
163
+ mergeLen += windowSize, ++mergeWindowNum) {
164
+ uint64_t newTailMain =
165
+ Align(CeilDiv((mergeLen * runInfo_.baseM + mTailSize), mergeLen + 1UL),
166
+ BASIC_BLOCK_SIZE_16);
167
+ uint64_t curPerf =
168
+ (mainWindowNum + 1UL - mergeWindowNum) * runInfo_.baseM + mergeWindowNum * newTailMain;
169
+ if (curPerf <= perfRes) {
170
+ perfRes = curPerf;
171
+ runInfo_.mTailMain = newTailMain;
172
+ runInfo_.mBaseTailSplitCnt = mergeLen + 1UL;
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ 拆解:
179
+
180
+ - **`windowSize / mainWindowNum / tailWindowSize`**:让尾区至少覆盖一整个 serpentine 窗口,范围 `[windowSize, 2·windowSize-1]`。
181
+ - **搜索起点 `mergeLen = tailWindowSize - 1, mergeWindowNum = 1`**:先把整个尾窗口里"`mergeLen` 个 `baseM` + 1 个 `mTailSize`"合并成 `mergeLen+1` 个 `newTailMain`。
182
+ - **步长 `mergeLen += windowSize, ++mergeWindowNum`**:每次再吞掉一个 serpentine 窗口进入合并区,保证边界对齐。
183
+ - **新尺寸公式**:
184
+
185
+ ```
186
+ newTailMain = Align16( ceil((mergeLen * baseM + mTailSize) / (mergeLen + 1)) )
187
+ ≈ baseM - (baseM - mTailSize) / (mergeLen + 1)
188
+ ```
189
+ `mergeLen` 越大,`newTailMain` 越接近 `baseM`。
190
+ - **上界 `baseTailCntMax = (baseM - mTailSize) / 16`**:再往上 `newTailMain` 被 16 对齐拉到 `baseM`,合并不再有收益。
191
+ - **成本函数**:`curPerf = (未合并窗口数) * baseM + mergeWindowNum * newTailMain`,即所有 serpentine 窗口的关键路径之和。用 `<=` 接受新解,平局偏好更深合并(tile 更均匀)。
192
+
193
+ ### 4.3 Device 端重建形状
194
+
195
+ ```cpp
196
+ mBaseNormCnt_ = mCnt_ - params.mBaseTailSplitCnt;
197
+ int64_t mMergeSize = m_ - mBaseNormCnt_ * baseM_;
198
+ mBaseTailMain_ = params.mBaseTailSplitCnt == 1 ? mMergeSize : params.mTailMain;
199
+ mBaseTailLast_ = mMergeSize - (params.mBaseTailSplitCnt - 1) * mBaseTailMain_;
200
+ // N 方向同理
201
+ ```
202
+
203
+ 最终 M 方向得到:
204
+
205
+ - `mBaseNormCnt_` 个 `baseM_`
206
+ - `mBaseTailSplitCnt - 1` 个 `mBaseTailMain_`
207
+ - 1 个 `mBaseTailLast_`
208
+ - 总和 = `m_`;总数 = `mCnt_`(**保持不变**)
209
+
210
+ 形状查询:
211
+
212
+ ```cpp
213
+ int64_t singleCoreM = baseM_;
214
+ if (mTileIdx >= mBaseNormCnt_) {
215
+ singleCoreM = mTileIdx < mCnt_ - 1 ? mBaseTailMain_ : mBaseTailLast_;
216
+ }
217
+ ```
218
+
219
+ GM 偏移修正(合并区 tile 不再是 `baseM` 的整数倍):
220
+
221
+ ```cpp
222
+ int64_t mPos = mTileIdx * baseM_ + mSplitAddrOffset;
223
+ if (mTileIdx > mBaseNormCnt_) {
224
+ mPos -= (mTileIdx - mBaseNormCnt_) * (baseM_ - mBaseTailMain_);
225
+ }
226
+ ```
227
+
228
+ ### 4.4 一个具体例子
229
+
230
+ `baseM=256, m=2404, mCnt=10`:
231
+
232
+ - `mTailSize = 100, mainWindowNum = 1, tailWindowSize = 6, baseTailCntMax = 9`。
233
+ - 迭代 1:`mergeLen=5 → newTailMain=Align16(230)=240`,`curPerf=1·256+1·240=496 < 512`,接受 `mBaseTailSplitCnt=6, mTailMain=240`。
234
+ - 迭代 2:`mergeLen=9 → newTailMain=256`(饱和),`curPerf=512`,拒绝。
235
+
236
+ 最终 M 排布(仍是 **10** 个 tile):
237
+
238
+ ```
239
+ [256][256][256][256][240][240][240][240][240][180]
240
+ └─ mBaseNormCnt_=4 ─┘└──── mBaseTailSplitCnt=6 ────┘
241
+ ```
242
+
243
+ 薄片从 100 涨到 180,窗口关键路径从 256 降到 240。
244
+
245
+ ## 5. 机制 C:尾块二维再切分(末轮空闲核救援)
246
+
247
+ ### 5.1 目标
248
+
249
+ 最后一轮只有 `endBlockIdx_ + 1` 个核有活,其他核空转。机制 C 把最后一轮里**所有原 tile**(共 `tailOriCnt = endBlockIdx_ + 1` 个)各自在 M/N 方向切成 `mTailTile_ × nTailTile_` 个子块,让总活跃核数扩展到 `tailOriCnt × totalTailTile_`。
250
+
251
+ 注意:这里"尾"指的是"最后一整轮里的 tile",不只是最末那一个。
252
+
253
+ ### 5.2 Host 侧搜索
254
+
255
+ 优先切更长的那一边,总子块数受总核数和 cube 单元约束:
256
+
257
+ ```cpp
258
+ uint64_t mTile = 1UL, nTile = 1UL;
259
+ uint64_t preSplit = 1UL, secSplit = 1UL;
260
+ uint64_t& preSplitValid = mTailSize >= nTailSize ? mTile : nTile;
261
+ uint64_t& secSplitValid = mTailSize >= nTailSize ? nTile : mTile;
262
+ uint64_t tileMax = aicNum / tailBlockCnt;
263
+ uint64_t mTileMax = std::min(tileMax, CeilDiv(baseM, CUBE_BLOCK));
264
+ uint64_t nTileMax = std::min(tileMax, CeilDiv(baseN, CUBE_BLOCK));
265
+ while ((CalUsedCoreNum(runInfo_, preSplit + 1, secSplit) <= aicNum && preSplit < preSplitMax) ||
266
+ (CalUsedCoreNum(runInfo_, preSplit, secSplit + 1) <= aicNum && secSplit < secSplitMax)) {
267
+ if (可扩 pre) preSplitValid = ++preSplit;
268
+ if (可扩 sec) secSplitValid = ++secSplit;
269
+ }
270
+ ```
271
+
272
+ ### 5.3 Device 端激活新核
273
+
274
+ ```cpp
275
+ if ((endBlockIdx_ + 1) * params.mTailTile * params.nTailTile <= AscendC::GetBlockNum()) {
276
+ mTailTile_ = params.mTailTile;
277
+ nTailTile_ = params.nTailTile;
278
+ totalTailTile_ = params.mTailTile * params.nTailTile;
279
+
280
+ uint64_t tailOriCnt = AscendC::Std::min(totalCnt_, endBlockIdx_ + 1);
281
+ int64_t newEndBlockIdx = endBlockIdx_ + tailOriCnt * (totalTailTile_ - 1);
282
+
283
+ if (blockIdx_ > endBlockIdx_ && blockIdx_ <= newEndBlockIdx) {
284
+ round_ += 1; // 本来不该有活的核,现在多跑一轮
285
+ }
286
+ if (blockIdx_ > newEndBlockIdx) {
287
+ mTailTile_ = 1; nTailTile_ = 1; totalTailTile_ = 1; // 仍闲,自降避免走子块分支
288
+ }
289
+ endBlockIdx_ = newEndBlockIdx;
290
+ }
291
+ ```
292
+
293
+ `newEndBlockIdx` 里**为什么是 `tailOriCnt * (totalTailTile_ - 1)` 而不是 `tailOriCnt * totalTailTile_`**:
294
+
295
+ - 切分前已经有 `tailOriCnt` 个核活跃;
296
+ - 切分后每个原 tile 新增 `totalTailTile_ - 1` 个子块,需要 `tailOriCnt × (totalTailTile_ - 1)` 个**新**核;
297
+ - `newEndBlockIdx` 是最后一个被激活的核索引,自然等于 `endBlockIdx_` + 新激活数;
298
+ - 总活跃数最终 = `tailOriCnt + tailOriCnt · (totalTailTile_ - 1) = tailOriCnt · totalTailTile_`,但索引末尾不能重复计那已激活的 `tailOriCnt` 个。
299
+
300
+ ### 5.4 核 → (原 tile, 子块) 映射
301
+
302
+ ```cpp
303
+ // GetTileIdx 最后一轮
304
+ int64_t newBlockIdx = (curRoundIdx == round_ - 1) ? blockIdx_ / totalTailTile_ : blockIdx_;
305
+ int64_t tileIdx = newBlockIdx + curRoundIdx * blockNum_;
306
+
307
+ // GetTileIdx / GetBlockShape 共用的子块坐标
308
+ int64_t singleCoreMSplit = CeilDiv(singleCoreM, mTailTile_);
309
+ int64_t singleCoreNSplit = CeilDiv(singleCoreN, nTailTile_);
310
+ int64_t mSplitIdx = (blockIdx_ % totalTailTile_) % mTailTile_;
311
+ int64_t nSplitIdx = (blockIdx_ % totalTailTile_) / mTailTile_;
312
+ int64_t mSplitAddrOffset = mSplitIdx * singleCoreMSplit;
313
+ int64_t nSplitAddrOffset = nSplitIdx * singleCoreNSplit;
314
+ if (mSplitAddrOffset >= singleCoreM || nSplitAddrOffset >= singleCoreN) {
315
+ return {0, 0, 0, 0}; // 越界子块,kernel 直接跳过
316
+ }
317
+ ```
318
+
319
+ - `blockIdx_ / totalTailTile_` → "我是第几个原 tile"
320
+ - `blockIdx_ % totalTailTile_` → "我是这个原 tile 的第几个子块"
321
+
322
+ ### 5.5 具体例子
323
+
324
+ `totalCnt=5, blockNum=24, mTailTile=nTailTile=2 ⇒ totalTailTile=4`:
325
+
326
+ - 门槛 `5 × 4 = 20 ≤ 24`,通过。
327
+ - `tailOriCnt=5, newEndBlockIdx=4+5×3=19`。
328
+
329
+ | blockIdx_ | `/4` 原 tile | `%4` 子块 | 状态 |
330
+ |---|---|---|---|
331
+ | 0~3 | 0 | 0~3 | 干原 tile 0 的 4 个子块 |
332
+ | 4~7 | 1 | 0~3 | 干原 tile 1 |
333
+ | 8~11 | 2 | 0~3 | 干原 tile 2 |
334
+ | 12~15 | 3 | 0~3 | 干原 tile 3 |
335
+ | 16~19 | 4 | 0~3 | 干原 tile 4 |
336
+ | 20~23 | — | — | 仍空闲,自降为 1×1 |
337
+
338
+ 激活核数从 5 提升到 20。
339
+
340
+ ## 6. 三机制协同与完整取数流程
341
+
342
+ ### 6.1 层级协同
343
+
344
+ ```
345
+ Host Tiling
346
+ ├── CalcBasicBlock / AdjustBasicBlock → baseM, baseN, baseK
347
+ ├── OptimizeEdgeBasicBlock → 机制 B: mBaseTailSplitCnt, mTailMain
348
+ ├── CalcTailBasicBlock → 机制 C: mTailTile, nTailTile
349
+ └── CalcPathSpecificL1 / CalScaleFactors → depthA1/B1, stepK, scaleKL1
350
+
351
+ Device Scheduler
352
+ ├── 构造期:算 mCoreNum_, mainRow_, round_, endBlockIdx_; 应用机制 B、C 的参数
353
+ ├── GetTileIdx:serpentine(A) + 合并区形状(B) + 末轮子块偏移(C)
354
+ └── GetBlockShape:重建 (singleCoreM, singleCoreN, mSplitAddrOffset, nSplitAddrOffset)
355
+
356
+ Device Kernel
357
+ └── while (GetTileIdx) { 切 GM 张量 → BlockMmad }
358
+ ```
359
+
360
+ 三机制共享 `WINDOW_LEN = 4`,保证彼此边界不打架:
361
+
362
+ - 机制 A 的 serpentine 行窗口高度 = `min(WINDOW_LEN, mCnt)`。
363
+ - 机制 B 的合并区以 `windowSize = WINDOW_LEN` 为步长扩张。
364
+ - 机制 C 的切分只在 `curRoundIdx == round_ - 1` 时生效,不侵入前面的 serpentine 稳态。
365
+
366
+ ### 6.2 `GetTileIdx` 单步做的事(按顺序)
367
+
368
+ ```cpp
369
+ __aicore__ inline bool GetTileIdx(BlockCoord& blockCoord)
370
+ {
371
+ if (roundIdx_ >= round_) return false; // 1. 判终止
372
+
373
+ int64_t curRoundIdx = roundIdx_;
374
+ int64_t newBlockIdx = (curRoundIdx == round_ - 1) ? blockIdx_ / totalTailTile_ : blockIdx_;
375
+ int64_t tileIdx = newBlockIdx + curRoundIdx * blockNum_; // 2. 机制 C 降维
376
+ /* startBlockIdx_ / endBlockIdx_ 归一化修正 */
377
+
378
+ /* 3. 机制 A: 行窗口拆分 + 奇数行 N 反转 */
379
+ int64_t rowIdx = tileIdx / nCnt_ / mCoreNum_;
380
+ int64_t mTileIdx, nTileIdx;
381
+ if (rowIdx < mainRow_) { /* 稳态窗口 */ }
382
+ else { /* 末窗口用 mTailCoreNum_ */ }
383
+ if (rowIdx & 1) nTileIdx = nCnt_ - 1 - nTileIdx;
384
+
385
+ /* 4. 机制 B: 合并区 tile 形状 */
386
+ int64_t singleCoreM = mTileIdx >= mBaseNormCnt_
387
+ ? (mTileIdx < mCnt_ - 1 ? mBaseTailMain_ : mBaseTailLast_) : baseM_;
388
+ int64_t singleCoreN = /* N 方向同理 */;
389
+
390
+ /* 5. 机制 C: 末轮子块偏移 */
391
+ int64_t mSplitAddrOffset = 0, nSplitAddrOffset = 0;
392
+ if (totalTailTile_ > 1 && curRoundIdx == round_ - 1) {
393
+ /* CeilDiv + blockIdx_ % totalTailTile_ 计算 mSplitAddrOffset/nSplitAddrOffset */
394
+ }
395
+
396
+ /* 6. 合并区 GM 偏差修正 */
397
+ int64_t mPos = mTileIdx * baseM_ + mSplitAddrOffset;
398
+ if (mTileIdx > mBaseNormCnt_) mPos -= (mTileIdx - mBaseNormCnt_) * (baseM_ - mBaseTailMain_);
399
+ int64_t nPos = /* N 方向同理 */;
400
+
401
+ /* 7. 封装 BlockCoord: M/N 存 GM 起点,K/B 存逻辑 tile 索引 */
402
+ Get<MNK_M>(blockCoord) = mPos;
403
+ Get<MNK_N>(blockCoord) = nPos;
404
+ Get<MNK_K>(blockCoord) = mTileIdx;
405
+ Get<MNK_B>(blockCoord) = nTileIdx;
406
+ roundIdx_++;
407
+ return true;
408
+ }
409
+ ```
410
+
411
+ `GetBlockShape` 在调用方读完 GM 坐标后用同一套逻辑重算 `(singleCoreM, singleCoreN, mSplitAddrOffset, nSplitAddrOffset)`,其中机制 C 越界的子块返回 `{0,0,0,0}`,由 kernel 层显式跳过。
412
+
413
+ ## 7. 小结
414
+
415
+ SWAT 的设计哲学是 **"host 搜索 + device 重建"**:host tiling 把 `baseM/baseN/mTailTile/nTailTile/mBaseTailSplitCnt/nBaseTailSplitCnt/mTailMain/nTailMain` 这 8 个量作为最小描述集传下来,device 端按 `WINDOW_LEN` 为公共边界,把三机制逐层叠加出完整的核内任务序列。
416
+
417
+ 三个机制各自的"不变量"值得牢记:
418
+
419
+ - **机制 A**:行窗口高度 ≤ `WINDOW_LEN`,奇数行 N 反向,稳态区与末窗口分别处理。
420
+ - **机制 B**:`mCnt_/nCnt_` 保持不变;只把最后 `mBaseTailSplitCnt` 个 tile 的尺寸从"`mergeLen` 个满块 + 1 个薄块"重排成"`mergeLen` 个 `mTailMain` + 1 个稍薄末块";成本函数是所有 serpentine 窗口关键路径之和。
421
+ - **机制 C**:只作用于最后一轮;末轮所有 tile 被切成 `mTailTile × nTailTile` 个子块;门槛是 `(endBlockIdx_ + 1) × totalTailTile_ ≤ blockNum_`;`newEndBlockIdx` 的 `-1` 是因为不能重复计已激活的原 `tailOriCnt` 个核。
422
+
423
+ 最终,SWAT 在 non-full-load 场景下同时压住了 **B 侧流式带宽、M/N 尾部碎片、末轮核浪费** 三个痛点,用一套统一的窗口化框架把 serpentine 主遍历、尾块重排、尾块再切分融合到同一个 `GetTileIdx/GetBlockShape` 管线里。
@@ -0,0 +1,165 @@
1
+ # matmul_basic_blaze.template — 基础 MatMul 可拷贝模板(Blaze/tensor_api 路径,DAV_3510)
2
+
3
+ > **来源**:内容整理自 Ascend C Blaze/tensor_api Matmul 最佳实践
4
+ > skill 的 `references/scenarios/basic-matmul-development.md`(已通过 480 case
5
+ > 工程穿刺验证:fp16/bf16/fp32 × ND/NZ × transpose × bias 组合)——
6
+ > ops-tune 模板拷贝纪律的「货」,此前 matmul 族只有设计文档无可拷贝代码。
7
+ >
8
+ > **[MODIFY] 标注点**:只改这些——dtype 类型别名、ProblemShape、tiling 字段映射;
9
+ > 组件链(Kernel/BlockMmad/Scheduler/Epilogue)结构**不许改**。
10
+ > 转换规则见同目录 `usage_guide.md`。
11
+
12
+ ## §1 Kernel 入口(op_kernel/matmul_kernel.h)
13
+
14
+ ```cpp
15
+ template <bool TransA, bool TransB, CubeFormat FormatA, CubeFormat FormatB>
16
+ __global__ __aicore__ __cube__ void matmul_kernel(
17
+ GM_ADDR dA, GM_ADDR dB, GM_ADDR dBias, GM_ADDR dC,
18
+ const MatmulTilingData tilingData)
19
+ {
20
+ // [MODIFY] 按用户需求固定 dtype:fp16=half / bf16=bfloat16_t / fp32=float(IsFp32=true)
21
+ using AType = half;
22
+ using BType = half;
23
+ using CType = half;
24
+ using BiasType = float;
25
+
26
+ using LayoutA = AscendC::Std::conditional_t<
27
+ (FormatA == CubeFormat::NZ),
28
+ AscendC::Std::conditional_t<TransA, AscendC::Te::ZNLayoutPtn, AscendC::Te::NZLayoutPtn>,
29
+ AscendC::Std::conditional_t<TransA, AscendC::Te::DNExtLayoutPtn, AscendC::Te::NDExtLayoutPtn>>;
30
+ using LayoutB = AscendC::Std::conditional_t<
31
+ (FormatB == CubeFormat::NZ),
32
+ AscendC::Std::conditional_t<TransB, AscendC::Te::ZNLayoutPtn, AscendC::Te::NZLayoutPtn>,
33
+ AscendC::Std::conditional_t<TransB, AscendC::Te::DNExtLayoutPtn, AscendC::Te::NDExtLayoutPtn>>;
34
+ using LayoutC = AscendC::Te::NDExtLayoutPtn;
35
+ using LayoutBias = AscendC::Te::NDExtLayoutPtn;
36
+
37
+ constexpr uint64_t FUSED_OP_TYPE = 0;
38
+ constexpr bool IS_ND_FORMAT = (FormatA == CubeFormat::ND && FormatB == CubeFormat::ND);
39
+ constexpr bool IS_FP32 = AscendC::Std::is_same_v<AType, float>;
40
+
41
+ using ProblemShape = AscendC::Te::Shape<int64_t, int64_t, int64_t, int64_t>;
42
+ using DispatchPolicy = Blaze::Gemm::MatmulMultiBlockBasic<NO_FULL_LOAD_MODE, FUSED_OP_TYPE>;
43
+ using BlockMmad = Blaze::Gemm::Block::BlockMmad<
44
+ DispatchPolicy, AType, LayoutA, BType, LayoutB, CType, LayoutC, BiasType, LayoutBias>;
45
+ using BlockScheduler = Blaze::Gemm::Block::BlockSchedulerMatmulBasic<
46
+ ProblemShape, NO_FULL_LOAD_MODE, IS_FP32, IS_ND_FORMAT>;
47
+ using BlockEpilogue = Blaze::Gemm::Block::BlockEpilogueEmpty;
48
+ using KernelImpl = Blaze::Gemm::Kernel::GemmUniversal<
49
+ ProblemShape, BlockMmad, BlockEpilogue, BlockScheduler>;
50
+
51
+ using Params = typename KernelImpl::Params;
52
+ using BlockMmadParams = typename BlockMmad::Params;
53
+ using BlockSchedulerParams = typename BlockScheduler::Params;
54
+ using BlockEpilogueParams = typename BlockEpilogue::Params;
55
+
56
+ // [MODIFY] batch 固定 1;多 batch 场景改第 4 维
57
+ ProblemShape problemShape{
58
+ static_cast<int64_t>(tilingData.m),
59
+ static_cast<int64_t>(tilingData.n),
60
+ static_cast<int64_t>(tilingData.k),
61
+ 1L};
62
+
63
+ BlockMmadParams mmParams;
64
+ mmParams.aGmAddr = dA;
65
+ mmParams.bGmAddr = dB;
66
+ mmParams.cGmAddr = dC;
67
+ mmParams.biasGmAddr = hasBias ? dBias : nullptr;
68
+ mmParams.ml1 = tilingData.mL1;
69
+ mmParams.nl1 = tilingData.nL1;
70
+ mmParams.kl1 = tilingData.kL1;
71
+ mmParams.ml0 = tilingData.baseM;
72
+ mmParams.nl0 = tilingData.baseN;
73
+ mmParams.kl0 = tilingData.baseK;
74
+ mmParams.l1Stages = tilingData.l1BufferNum;
75
+ mmParams.l0cStages = static_cast<uint16_t>(tilingData.l0cDB);
76
+
77
+ BlockSchedulerParams schParams;
78
+ schParams.mL1 = tilingData.mL1;
79
+ schParams.nL1 = tilingData.nL1;
80
+ schParams.kL1 = tilingData.kL1;
81
+ schParams.baseM = tilingData.baseM;
82
+ schParams.baseN = tilingData.baseN;
83
+ schParams.baseK = tilingData.baseK;
84
+ schParams.mTailCnt = tilingData.mTailCnt;
85
+ schParams.nTailCnt = tilingData.nTailCnt;
86
+ schParams.mBaseTailSplitCnt = tilingData.mBaseTailSplitCnt;
87
+ schParams.nBaseTailSplitCnt = tilingData.nBaseTailSplitCnt;
88
+ schParams.mTailMain = tilingData.mTailMain;
89
+ schParams.nTailMain = tilingData.nTailMain;
90
+ schParams.isHf32 = 0;
91
+ schParams.l2CacheMode = Blaze::Gemm::L2_CACHE_DEFAULT;
92
+ schParams.sliceM = 0;
93
+ schParams.srcNdStride = 1;
94
+ schParams.innerBatch = 1;
95
+
96
+ BlockEpilogueParams epilogueParams;
97
+
98
+ Params params;
99
+ params.problemShape = problemShape;
100
+ params.mmadParams = mmParams;
101
+ params.epilogueParams = epilogueParams;
102
+ params.schParams = schParams;
103
+
104
+ KernelImpl kernel;
105
+ kernel(params);
106
+ }
107
+ ```
108
+
109
+ ## §2 Launcher 分发(transA × transB × formatA × formatB = 16 组合,分层分发禁手写扁平 16 分支)
110
+
111
+ ```cpp
112
+ template <bool TransA, bool TransB, CubeFormat FormatA>
113
+ void LaunchByBLayout(
114
+ aclrtStream stream,
115
+ GM_ADDR dA, GM_ADDR dB, GM_ADDR dBias, GM_ADDR dC,
116
+ const MatmulTilingData tilingData,
117
+ CubeFormat formatB)
118
+ {
119
+ if (formatB == CubeFormat::NZ) {
120
+ matmul_kernel<TransA, TransB, FormatA, CubeFormat::NZ>
121
+ <<<tilingData.usedCoreNum, nullptr, stream>>>(dA, dB, dBias, dC, tilingData);
122
+ } else {
123
+ matmul_kernel<TransA, TransB, FormatA, CubeFormat::ND>
124
+ <<<tilingData.usedCoreNum, nullptr, stream>>>(dA, dB, dBias, dC, tilingData);
125
+ }
126
+ }
127
+
128
+ template <bool TransA, bool TransB>
129
+ void LaunchByALayout(
130
+ aclrtStream stream,
131
+ GM_ADDR dA, GM_ADDR dB, GM_ADDR dBias, GM_ADDR dC,
132
+ const MatmulTilingData tilingData,
133
+ CubeFormat formatA,
134
+ CubeFormat formatB)
135
+ {
136
+ if (formatA == CubeFormat::NZ) {
137
+ LaunchByBLayout<TransA, TransB, CubeFormat::NZ>(stream, dA, dB, dBias, dC, tilingData, formatB);
138
+ } else {
139
+ LaunchByBLayout<TransA, TransB, CubeFormat::ND>(stream, dA, dB, dBias, dC, tilingData, formatB);
140
+ }
141
+ }
142
+ ```
143
+
144
+ ## §3 TilingData → Params 映射表(核对清单)
145
+
146
+ | Params 字段 | TilingData 来源 | 说明 |
147
+ |------------|----------------|------|
148
+ | `problemShape` | `{m, n, k, 1}` | batch 固定 1 |
149
+ | `mmadParams.ml1/nl1/kl1` | `mL1/nL1/kL1` | L1 tile 尺寸 |
150
+ | `mmadParams.ml0/nl0/kl0` | `baseM/baseN/baseK` | L0 tile 尺寸 |
151
+ | `mmadParams.l1Stages` | `l1BufferNum` | SWAT 默认 L1 buffer 数 |
152
+ | `mmadParams.l0cStages` | `l0cDB` | L0C buffer 数 |
153
+ | `schParams.mTailCnt/nTailCnt` | `mTailCnt/nTailCnt` | 尾块 split(普通 SWAT 语义等价 tail split factor,默认 1/1) |
154
+
155
+ ## §4 候选参数生成
156
+
157
+ tiling 候选不再人工拍:`ops-family/scripts/tiling_candidates.py --family matmul`
158
+ (容量预算校验 + 候选表)。
159
+
160
+ ## §5 与优化策略文档的关系
161
+
162
+ 本模板是 pingpong/swat/streamk 等六策略(`guide.md`)的**基础实现底座**——
163
+ 优化策略在 Blaze 层多由 Scheduler/BlockMmad 组件参数承载(如 `l1BufferNum`
164
+ 即 pingpong 双缓冲份数),调优时先读 `guide.md` 判定策略,回本模板改参数,
165
+ 不改组件链。
@@ -0,0 +1,29 @@
1
+ # matmul 模板使用指南(usage_guide)
2
+
3
+ > `matmul_basic_blaze.template` 的转换与适配说明。模板拷贝纪律(SKILL.md T1-T5)
4
+ > 同样适用:直接拷贝 + 只改 `[MODIFY]` 点。
5
+
6
+ ## 转换步骤
7
+
8
+ 1. 拷贝 `matmul_basic_blaze.template` → 工程 `op_kernel/matmul_kernel.h`
9
+ (`.template` 后缀去掉;本模板是 markdown 载体,代码段整体拷出);
10
+ 2. 按 `[MODIFY]` 标注改:dtype 类型别名(fp16=half / bf16=bfloat16_t /
11
+ fp32=float 且 IS_FP32=true)、ProblemShape、tiling 字段映射;
12
+ 3. tiling 候选用 `ops-family/scripts/tiling_candidates.py --family matmul`
13
+ 生成(容量预算已校验),不人工拍;
14
+ 4. 依赖:工程需含 ops-tensor blaze 头文件(`op_kernel/include/blaze/`,
15
+ Blade library 路径——组件链 Kernel/BlockMmad/Scheduler/Epilogue 全部来自
16
+ `Blaze::Gemm` 命名空间,本模板不引入 blaze_custom)。
17
+
18
+ ## 验证锚点
19
+
20
+ - 来源模板已通过 480 case 穿刺(fp16/bf16/fp32 × ND/NZ × transpose × bias);
21
+ - 拷贝后先跑最小 case(如 128×128×128)验证正确性,再上批量;
22
+ - 编译报错按 MicroAPI 修复顺序(SKILL.md T3):①命名空间 ②API 签名
23
+ ③include ④全部无效才降级对应分支并留痕。
24
+
25
+ ## 边界
26
+
27
+ - 融合 epilogue(vector 后处理)不在此模板(BlockEpilogueEmpty)——
28
+ 融合 matmul 见 Blaze/tensor_api 融合开发场景;
29
+ - Grouped MatMul / MX 量化变体为后续规划项。
@@ -0,0 +1,43 @@
1
+ # MC² 通算融合类算子性能优化策略索引
2
+
3
+ 按策略类型查找对应的适用场景与详细设计文档。
4
+
5
+ 适用于 MC² 通算融合族所有变体:`matmul_all_reduce`、`allgather_matmul`、`matmul_reducescatter`、`alltoall_matmul` 等。
6
+
7
+ > MC²(Matrix Computation & Communication)是昇腾通算融合算子框架,将集合通信与计算(Cube 计算、量化计算等)融合为单一算子,实现通信与计算流水线并行。
8
+
9
+ | 策略 | 优先级 | 适用场景 | 核心手段 | 详细文档 |
10
+ |------|--------|---------|---------|---------|
11
+ | **local_matmul** | 首选 | 所有 MC² 通算融合算子 | 将本 rank 数据的 matmul 从通信块循环中分离,前置/后置独立执行以与通信重叠 | [local_matmul_design.md](local_matmul_design.md) |
12
+ | **pipeline_balancing** | 中 | 所有 MC² 通算融合算子(在 Local Matmul 基础上叠加) | 按 Bound 类型确定长短块排布,**TilingData 驱动的系统搜索**(四条剪枝 + Top-N 候选实测)选最优切分 | [pipeline_balancing_design.md](pipeline_balancing_design.md) |
13
+ | **matmul 计算效率优化** | 最低 | 仅计算 Bound(正交可叠加) | 参考 matmul 族优化策略(pingpong/streamk/fullload 等),提升单块 matmul 效率 | [matmul/guide.md](../matmul/guide.md) |
14
+
15
+ > Local Matmul 不依赖 Bound 判定,推荐优先实现。流水配平在 Local Matmul 基础上进一步优化长短块排布——**须先打印 TilingData (baseM/baseN/usedCoreNum) 并执行隔离测试获取 R 值**,再通过系统搜索算法(非经验值)确定最优 longMSize。计算 Bound 场景下可进一步叠加 matmul 计算效率优化。三者可结合使用。
16
+
17
+ ## 融合模式分类
18
+
19
+ | 融合模式 | 执行顺序 | 典型算子 |
20
+ |---------|---------|---------|
21
+ | TP 权重聚合 | 通信→计算 | allgather_matmul |
22
+ | TP 输出分发 | 计算→通信 | matmul_reducescatter |
23
+ | 全局归约 | 计算→通信 | matmul_all_reduce |
24
+ | EP 专家分发 | 通信→计算 | alltoallv_grouped_matmul |
25
+ | EP 反向分发 | 计算→通信 | grouped_matmul_alltoallv |
26
+
27
+ > 纯通信算子(无计算融合)不属于 MC² 族,不适用本族优化策略。
28
+
29
+ ---
30
+
31
+ ## 与分析层 skill 的关系
32
+
33
+ 本文档为**实现层**设计指南,提供 TilingData 结构、Host 侧参数计算、Kernel 核心循环和修改点等实施细节。对应的**分析层**能力分布在本仓其它 SKILL:
34
+
35
+ | 分析维度 | 本仓落点 |
36
+ |---------|---------|
37
+ | 性能采集 / 多 rank 采集 / 稳态取值 / 隔离测试 | `ops-collect`(collect_board.sh --mode mc2 + isolation_test.py) |
38
+ | Bound 判定(R 值五档、MTE2 污染、跨 rank 不均衡) | `ops-verdict` 规则包 `rules/L3-inter-card.yaml` |
39
+ | 流水配平搜索算法(四条剪枝 + Top-N 候选) | ops-mechanism [mc2-balancing.md](../../../ops-mechanism/references/optimize/mc2-balancing.md) |
40
+ | 膨胀分析 / Local Matmul 分析 | ops-mechanism [mc2.md](../../../ops-mechanism/references/optimize/mc2.md) |
41
+ | 性能指标(加速比 / 掩盖率)核算与前后对比 | `ops-verdict`(snapshot.py + delta_compare.py) |
42
+
43
+ > 实施前须先完成 TilingData 采集和隔离测试(获取 baseM/baseN/usedCoreNum 与 R 值),再参考本文档进行代码实现。