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,191 @@
1
+ # Transpose 性能调优参考:GATHER_TRANSPOSE 策略
2
+
3
+ > 策略名:GATHER_TRANSPOSE(基于 gather 指令的转置)
4
+ > tilingKey:**10006**
5
+ > 硬件/编译要求:仅 `__NPU_ARCH__ == 3510`(dav-3510)可用,依赖 AscendC `MicroAPI` / `Reg` 寄存器编程模型,且必须打开编译宏 **`TRANSPOSE_ENABLE_GATHER`**。
6
+ > 关键实现文件:
7
+ > - kernel:`op_kernel/arch35/transpose_with_gather.h`(`Transpose::TransposeWithGather<T>`)
8
+ > - 派发入口:`op_kernel/transpose_kernel.cpp`
9
+ > - host 选择:`op_kernel/transpose_tiling.cpp`(`TryGatherTiling`)
10
+ > - gather 专用 tiling:`op_kernel/transpose_tiling_gather.{h,cpp}`(`TransWithGather::TransposeGatherTiling`)
11
+
12
+ ---
13
+
14
+ ## 一、适用场景
15
+
16
+ ### 1.1 为什么用 gather 指令做转置
17
+
18
+ 传统的 Transpose 在 Ascend 上通常依赖 NDDMA(带 stride 的 DMA 搬运)完成维度重排:数据按输出 perm 的顺序,通过多层带步长的 `DataCopy` 从 GM 搬入/搬出。当被转置的轴落在**最后一维**(last axis transpose)时,NDDMA 的搬运粒度会退化——输出最后一维在输入侧不连续,每个连续 burst 长度很短,MTE 通道被大量小 burst 和非连续 stride 拖累,带宽利用率低。
19
+
20
+ GATHER_TRANSPOSE 的思路是:把转置从"搬运时重排"改为"搬入后在 UB 内用向量 gather 重排":
21
+
22
+ 1. 用一次尽量连续的 `DataCopyPad`(MTE2)把一个 UB 分块的数据整块搬入 UB,搬入布局尽量保证 burst 连续、MTE 效率高;
23
+ 2. 在 UB 内用寄存器 gather 指令(`DataCopyGatherImpl` / `vgather`),按预先构造好的 index,一次性把输入布局按输出 perm 重排到输出 buffer;
24
+ 3. 再用一次连续的 `DataCopyPad`(MTE3)把结果搬出。
25
+
26
+ 这样把"非连续访问"的代价从昂贵的 DMA 通道转移到 UB 内的向量 gather 上,MTE2/MTE3 两端都走连续大 burst,显著提升带宽利用。
27
+
28
+ ### 1.2 命中条件(什么 shape / perm 下选到)
29
+
30
+ host 侧选择逻辑见 `transpose_tiling.cpp::Run`,顺序为:VCONV → **gather** → NDDMA 兜底。gather 命中需要同时满足:
31
+
32
+ - 编译期打开 `TRANSPOSE_ENABLE_GATHER`(否则该分支整体被 `#if` 屏蔽,host 永远不产出 10006,统一由 NDDMA 覆盖);
33
+ - `shapeInfo_.isLastAxisTranspose == true`,即 `SetIsLastAxisTranspose()` 判定 **归约后 perm 的最后一维不等于 dim-1**(`reducedPerm[dim-1] != dim-1`),也就是最后一维参与了转置;
34
+ - `TransWithGather::DoTiling(...)` 返回成功(tiling 能算出合法的 UB / block 切分,详见下文的多处失败返回点)。
35
+
36
+ 任何一步不满足就 fall through 到 NDDMA。注意 shape 在进入前已经过 `RemoveAxisV2`(去掉大小为 1 的轴)和 `MergeAxisV2`(合并连续可归约轴)。
37
+
38
+ ### 1.3 tiling 层面的可行性约束(为什么有些 shape 命中不了)
39
+
40
+ `DoTiling` 内部有几个硬门槛,不满足即返回 false 交还 NDDMA:
41
+
42
+ - **MTE 搬入量下限**:`CalcUbAxesInfo` 要求单次搬入 UB 的字节数 `totalSizeInUb >= MTE_GATE`(`0x8000` = 32KB)。太小的分块用 gather 不划算。
43
+ - **Bank Conflict 规避**:`CheckBC(indexStep)` 检查 gather 的 index 步长按 sub-bank(8B)/ bank(128B)对齐后是否落在会产生 bank conflict 的位置,命中冲突则拒绝该切分。`CalcSqrtedTensor` 里也会因此把切分尺寸回退一个 sub-bank。
44
+ - **多核利用率**:`CalcBlockSplitInfo` 要求 `usedCoreCnt >= coreNum/2`,否则返回 false(核用不满不如走别的策略)。
45
+ - **借轴数量上限**:进 UB 参与重排的轴数受 `UB_MAX_BRW_NUM = 3` 限制(gather index 最多按 3 维构造)。
46
+
47
+ ### 1.4 为什么需要硬件 / toolkit 支持
48
+
49
+ gather kernel 使用 AscendC 的 **MicroAPI(即 `Reg` 寄存器编程)** 模型:`RegTensor`、`MaskReg`、`MicroAPI::Arange/Div/Muls/Select/DataCopy`、以及核心的 `DataCopyGatherImpl`(向量 gather)。别名 `namespace MicroAPI = Reg` 仅在 `kernel_macros.h` 中 `__NPU_ARCH__ == 3510` 时定义,并通过 reg_compute 接口头暴露。因此:
50
+
51
+ - 只有 dav-3510 架构才有对应的向量 gather 硬件指令与 API;
52
+ - 旧 toolkit 缺 MicroAPI 别名会编译失败,所以整条路径用 `TRANSPOSE_ENABLE_GATHER`(默认 0)保护,构建可在无 MicroAPI 的 toolkit 上正常通过,只是不产出该策略。
53
+
54
+ ---
55
+
56
+ ## 二、kernel 执行流程与关键实现
57
+
58
+ ### 2.1 整体流程
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ A[Init: 申请 UB buffer / 绑定 GM] --> B[Process]
63
+ B --> C[GetCoreLoopRange: 本核 blk 循环区间]
64
+ C --> D[InitAxes: 载入 UB 轴 / block 切轴信息]
65
+ D --> E[GenGatherIndex4AllPhase: 预生成各相位 gather index]
66
+ E --> F{blkLpIdx 循环}
67
+ F --> G[CalcBlkAddr: 算本次 in/out GM 基址]
68
+ G --> H[UpdateUbAxes: 处理尾块, 选 gIndexId 相位]
69
+ H --> I[CopyDataIn: MTE2 连续搬入 UB]
70
+ I --> J[GetOutLoopAxes: 输出侧循环轴/步长]
71
+ J --> K[GatherData: UB 内向量 gather 重排]
72
+ K --> L[CopyDataOut: MTE3 连续搬出]
73
+ L --> F
74
+ ```
75
+
76
+ ### 2.2 Init:buffer 与 double buffer
77
+
78
+ `Init`(`transpose_with_gather.h:115`)申请三块 UB:
79
+
80
+ ```cpp
81
+ pipe->InitBuffer(xInQue_, BUFFER_NUM, td_->dataTensorSize); // VECIN
82
+ pipe->InitBuffer(xOutQue_, BUFFER_NUM, td_->dataTensorSize); // VECOUT
83
+ pipe->InitBuffer(idxBuf_, td_->indexTensorSize); // VECCALC, gather index
84
+ idxLocal_ = idxBuf_.Get<RangeType_>();
85
+ ```
86
+
87
+ - `BUFFER_NUM = 2`(见 `transpose_base.h`),即输入队列 `xInQue_` 与输出队列 `xOutQue_` 都是 **double buffer**,MTE2 搬入 / gather 计算 / MTE3 搬出通过 `TQue` 的 EnQue/DeQue 天然形成流水,搬运与计算 overlap。
88
+ - index buffer 是单块 `TBuf`(不需要 ping-pong,index 在 `Process` 前一次性生成后整个核复用)。
89
+ - `dataTensorSize` / `indexTensorSize` 由 host `CalcTensorSize` 按元素字节数(1B / 8B / 其它)和 ping-pong 份数从 UB 总量反推,保证 data(×2 ping-pong ×2 in/out)+ index 能放进 UB。
90
+
91
+ ### 2.3 类型策略
92
+
93
+ kernel 用三个派生类型适配不同位宽(`transpose_with_gather.h:89`):
94
+
95
+ - `RangeType_`:index / arange 计算类型,`<=2B` 用 `int16_t`,否则 `int32_t`;
96
+ - `IdxType_`:传给 gather 的下标类型(对应无符号版本);
97
+ - `CastType_`:1B 元素(`int8/uint8`)在 gather 时按 16-bit 处理(gather 硬件粒度),搬出时再用 `StoreDist::DIST_PACK_B16` 打包回 8-bit。
98
+
99
+ `vlSize_` / `idxVLSize_` 由 `GetVRegSize()` 除以对应类型宽度得到,是一次向量指令处理的元素数。
100
+
101
+ ### 2.4 gather index 的构造(核心)
102
+
103
+ index 表示"输出的每个元素来自输入 UB 内的哪个偏移"。构造在 `GenGatherIndex`(`:533`),按需要重排的维度数分派:
104
+
105
+ - `dimNum = ubAxesCnt - outUbOutCutPos`(即输出侧连续搬出的 cube 之外、需要 gather 的维度数),最多 3;
106
+ - `GenIndex4OneDim` / `GenIndex4TwoDim` / `GenIndex4ThreeDim` 分别对应 1/2/3 维重排。
107
+
108
+ 以二维为例(`GenIndex4TwoDim`,输入 `(a,b,c,d)` → 输出 `(d,c,b,a)`,为 a、b 生成 index):
109
+
110
+ ```
111
+ vec_a = VL % a // Arange 后对 a 取模
112
+ vec_b = VL / a // 除法得高维下标
113
+ index = vec_a * a_in_offset + vec_b * b_in_offset
114
+ ```
115
+
116
+ 超过一个向量长度(`idxVLSize_`)的部分,用增量 + 进位方式在循环里递推(避免每次重算除法):
117
+
118
+ ```
119
+ vec_a += a_inc; cmp_a = (vec_a >= a); vec_a -= cmp_a * a // Select 生成进位
120
+ vec_b += b_inc + cmp_a
121
+ ```
122
+
123
+ 三维版本 `GenIndex4ThreeDim` 同理再多一层进位链(a→b→c)。每维的 `*_in_offset` 由 `CalcUbAxesInOffset` 根据 UB 内轴布局算出(考虑 `DataCopyPad` 的块对齐:跨过 `inUbInCutPos` 时按 `elemPerBlock_` 向上对齐)。
124
+
125
+ #### 多相位 index(尾块处理)
126
+
127
+ `GenGatherIndex4AllPhase`(`:547`)在 Process 循环前**一次性生成多份 index**,因为分块循环里会出现"整块 / 输入方向尾块 / 输出方向尾块 / 双向尾块"四种尺寸组合。用 `gIdxOffset_`(按 block 对齐的每相位 index 长度)把不同相位的 index 依次排在 `idxBuf_` 里:
128
+
129
+ - 相位 0:满块;
130
+ - 相位 1:输入切轴尾块(`inUbTailFactor_ = inUbCutAxisSize % inUbCutAxisFactor`);
131
+ - 相位 2:输出切轴尾块(`outUbTailFactor_`);
132
+ - 相位 3:双向尾块。
133
+
134
+ 具体生成哪几份取决于 host 给出的 `blkInUbCutPos` / `blkOutUbCutPos` 是否为 -1(即该方向是否真的被 block 切分且除不尽)。运行时 `UpdateUbAxes` 按当前 `blkLpIdx` 是否落在尾块上,置 `gIndexId_ ∈ {0,1,2,3}`;`GatherData` 里用 `idxAddr += gIndexId_ * gIdxOffset_` 直接选中对应相位的 index,无需重算。
135
+
136
+ ### 2.5 GatherData:寄存器编程重排
137
+
138
+ 核心循环(`transpose_with_gather.h:265`),运行在 `__VEC_SCOPE__` 内:
139
+
140
+ ```cpp
141
+ idxAddr += gIndexId_ * gIdxOffset_; // 选相位
142
+ for (lpIdx : burstLpCnt) { // 按向量长度分段
143
+ mask = UpdateMask<T>(maskValue);
144
+ MicroAPI::DataCopy(idxOriReg, idxAddr + lpIdx*vlSize_); // 载入基准 index
145
+ for (axis2Idx) for (axis1Idx) for (axis0Idx) { // 输出侧外层循环
146
+ idxUpdate = axis2*..+ axis1*..+ axis0*outUbAxis0InROffset_;
147
+ MicroAPI::Adds(idxReg, idxOriReg, idxUpdate, maskIdx); // 基准 index + 外层偏移
148
+ DataCopyGatherImpl(xReg, xInAddr, idxReg, mask); // 向量 gather
149
+ MicroAPI::DataCopy(xOutAddr + outIdx*outLenAlign + lpIdx*vlSize_, xReg, mask);
150
+ }
151
+ }
152
+ ```
153
+
154
+ 要点:
155
+
156
+ - **基准 index 复用**:一份 index(`idxOriReg`)描述最内层重排;输出侧的 axis0/1/2 外层循环只需给基准 index 加一个标量偏移 `idxUpdate`(`GetOutLoopAxes` 里算出的 `outUbAxisXInROffset_`),避免为每个外层组合都存一份 index,省 UB。
157
+ - **gather 指令** `DataCopyGatherImpl(dst_reg, base_addr, idx_reg, mask)`:以 `xInAddr` 为基址,按 `idxReg` 的每个元素做偏移取数到 `xReg`,mask 控制有效 lane。这是 dav-3510 特有的向量 gather 硬件能力。
158
+ - **1B 特殊路径**:`sizeof(T)==1` 时 gather 按 `CastType_`(16-bit)进行,写出用 `DataCopy<CastType_, StoreDist::DIST_PACK_B16>` 打包回 8-bit;`maskValue` 也相应 `*= sizeof(int16_t)`。
159
+
160
+ ### 2.6 搬入 / 搬出(MTE 连续化)
161
+
162
+ - `CopyDataIn`(`:626`):`SetCopyInParams` 用 `DataCopyExtParams` + `LoopModeParams`(loop1/loop2 两层 stride 循环)配置带 stride 的 `DataCopyPad<T, PaddingMode::Compact>`,把一个分块整块搬入 UB。`inCube = CalcUbAxesInOffset(inUbInCutPos-1)*sizeof(T)` 是连续 burst 长度,`srcStride = axis0InSrcStride*sizeof(T) - inCube` 描述 GM 侧跳步;搬入 UB 侧按 block 对齐紧凑摆放(`Compact`)。
163
+ - `CopyDataOut`(`:676`):对称地用 `DataCopyPad` + loop mode 把 gather 结果搬出到 `yGM_[blkOutAddr_]`,`dstStride = axis0OutDstStride*sizeof(T) - outCube` 描述输出 GM 跳步。
164
+ - 搬入/搬出前后都成对调用 `SetLoopModePara` / `ResetLoopModePara`,方向分别为 `OUT_TO_UB` / `UB_TO_OUT`。
165
+
166
+ 两端 burst 长度(inCube / outCube)都尽量做大且连续,把不连续代价集中到 UB 内 gather,这正是该策略的性能收益来源。
167
+
168
+ ### 2.7 多核切分与地址计算
169
+
170
+ - **block 切分**(host `CalcBlockSplitInfo`):在 UB 分块之上,把剩余的 block 轴乘积 `totalElems` 均分到核。`usedCoreCnt = ceil(totalElems / ceil(totalElems/coreNum))`,`blkFactor` 为每核块数,最后一核用 `blkTailFactor`;要求 `usedCoreCnt >= coreNum/2` 否则放弃该策略。
171
+ - **本核区间**:`GetCoreLoopRange` 用 `blockIdx_ * blkFactor` 定起点,末核用尾 factor;`blockIdx_ >= usedCoreCnt` 的核直接 return(不参与)。
172
+ - **地址**:`CalcBlkAddr` 对每个 block 轴用 `idx / blkAxesOffset(i) % blkAxes[i]` 拆出下标,分别乘 `blkAxesInAOffset` / `blkAxesOutAOffset` 累加得到本次搬入/搬出的 GM 基址。
173
+
174
+ ### 2.8 host tiling 关键概念对照
175
+
176
+ | host 概念 | 含义 |
177
+ | --- | --- |
178
+ | `inUbPerm_` / `outUbPerm_` | 从最内维往外挑选进 UB 参与重排的输入侧 / 输出侧轴(各 ≤ `UB_MAX_BRW_NUM=3`),挑到累计尺寸超过 `sqrtedTensor` 或达上限为止 |
179
+ | `sqrtedTensor` | `sqrt(elemInTensor)` 按 block / cacheLine 对齐,并做 BC 规避;用来平衡 in/out 两个方向的 UB 分块尺寸 |
180
+ | `inUbCutAxisFactor` / `outUbCutAxisFactor` | 输入 / 输出切轴的分块因子;`AdjustUbCutAxisFactor` 按 UB 是否溢出回调 |
181
+ | `ubPerm` / `inUbAxes` / `outUbAxes` | UB 内轴序与各轴大小,喂给 kernel 生成 index 与循环 |
182
+ | `axisXInSrcStride` / `axisXOutDstStride` | `CalcUbSplitInfo4MTE` 算出的 MTE 搬入/搬出多层 stride |
183
+ | `blkInUbCutPos` / `blkOutUbCutPos` | 该方向切轴是否被 block 切分且除不尽(决定尾块相位) |
184
+
185
+ ---
186
+
187
+ ## 调优提示
188
+
189
+ - 该策略专治"最后一维参与转置"且分块足够大(≥32KB)的场景;若命中不了,先确认 `TRANSPOSE_ENABLE_GATHER` 是否开启、是否在 dav-3510 上。
190
+ - index 步长若频繁触发 `CheckBC` 的 bank conflict,tiling 会缩小分块或直接放弃;shape 的最后一维大小与元素位宽是影响 BC 的主要因素。
191
+ - gather 相位是预生成的,尾块越多(切轴除不尽)index buffer 占用越大,可能挤压 data buffer 分块尺寸;规整的、能整除的分块尺寸更友好。
@@ -0,0 +1,276 @@
1
+ # Transpose 调优参考:N_LAST_TRANSPOSE(非末轴转置)
2
+
3
+ - 策略名:N_LAST_TRANSPOSE(kernel 类 `TransposeNLast`)
4
+ - tilingKey:10004
5
+ - kernel 实现:`arch35/transpose_n_last.h`
6
+ - 派发入口:`transpose_kernel.cpp`(`tilingKey == N_LAST_TRANSPOSE`)
7
+ - host 选择:`transpose_tiling.cpp::EntryTilingTemplate`
8
+
9
+ 面向性能调优开发者。内容以代码为准,未使用的技术不做罗列。
10
+
11
+ ---
12
+
13
+ ## 一、适用场景
14
+
15
+ ### 1. 什么是"末轴不参与转置"
16
+
17
+ 对一个 `perm` 排列,若排列后的最后一维仍是原始最后一维,即 `reducedPerm[dim-1] == dim-1`,则称末轴不参与转置(non-last-axis transpose)。判定见 `SetIsLastAxisTranspose`:
18
+
19
+ ```cpp
20
+ shapeInfo_.isLastAxisTranspose = shapeInfo_.reducedPerm[dim - 1] != dim - 1;
21
+ ```
22
+
23
+ 注意这里的 shape 与 perm 都是经过 `RemoveAxisV2`(去除大小为 1 的轴)和 `MergeAxisV2`(合并连续轴)化简后的结果。例如 `perm=[0,2,1,3]` 交换的是中间两维,末轴 3 保持在末尾,属于本策略场景;而 `perm=[0,2,3,1]` 把末轴挪走了,则不属于。
24
+
25
+ ### 2. 为什么可以特殊优化(末轴连续搬运)
26
+
27
+ 末轴不动意味着:输入中沿末轴连续的一段元素,在输出中依然是连续的一段。转置只发生在前面的高维之间,是"整块搬运 + 块的重新排布",而不需要在最内层做逐元素的跨步重排。
28
+
29
+ 于是本策略把末轴(以及被切进 UB 的相邻高维)当作一个连续的数据块:
30
+
31
+ - 搬入(`CopyIn`)时以连续 `DataCopyPad` 把块从 GM 读进 UB;
32
+ - 搬出(`CopyOut`)时利用 `DataCopyPad` + `LoopModeParams` 的多层循环步长,把 UB 中的连续块按输出布局的目的地址步长写回 GM。
33
+
34
+ 整个过程没有任何 Vector 计算,纯 DMA 搬运,末轴长度越大,单次搬运的连续 burst 越长,带宽利用率越高。
35
+
36
+ ### 3. MOVEALIGN_LAST_MIN_ELE = 32 阈值的含义
37
+
38
+ 选择条件见 `EntryTilingTemplate`:
39
+
40
+ ```cpp
41
+ if (shapeInfo_.totalVolumeActual * shapeInfo_.eleLenInBytes >= SMALL_SHAPE_BYTES_THRES_HOLD) {
42
+ if (!shapeInfo_.isLastAxisTranspose &&
43
+ shapeInfo_.reducedInShape[shapeInfo_.dim - 1] >= MOVEALIGN_LAST_MIN_ELE) { // 32
44
+ tilingKey_ = KEY_N_LAST_TRANSPOSE; // 10004
45
+ return;
46
+ }
47
+ ...
48
+ }
49
+ ```
50
+
51
+ 即三个前提同时满足才选中本策略:
52
+
53
+ 1. 总数据量足够大(`>= SMALL_SHAPE_BYTES_THRES_HOLD`),否则走 SMALL_SHAPE;
54
+ 2. 末轴不参与转置(`!isLastAxisTranspose`);
55
+ 3. 化简后末轴元素数 `reducedInShape[dim-1] >= 32`。
56
+
57
+ `MOVEALIGN_LAST_MIN_ELE = 32` 是末轴的最小元素数门槛。它的意义是保证连续搬运块足够长——只有末轴足够长,连续 `DataCopyPad` 才能摊薄每次搬运的固定开销、接近对齐搬运(move-align)的效率。若末轴太短(< 32),连续块太碎,move-align 带来的收益被非对齐尾块和搬运指令开销吃掉,此时改由 NDDMA 系列(`KEY_NDDMA_BASE` / `KEY_BIG_DIM`)处理更合适。
58
+
59
+ ### 4. 为什么能提升性能
60
+
61
+ - 末轴连续,搬运粒度大,DMA burst 长,带宽利用率高;
62
+ - 无 Vector 计算,纯搬运,指令流简单;
63
+ - 目的地址的重排通过 `LoopModeParams` 的硬件多层循环步长一次配置、循环内复用完成,减少了逐块地址计算与指令发射开销。
64
+
65
+ ---
66
+
67
+ ## 二、kernel 执行流程与关键实现
68
+
69
+ ### 1. 数据通路与 buffer
70
+
71
+ ```cpp
72
+ TQueBind<QuePosition::VECIN, QuePosition::VECOUT, 1> vecQue_;
73
+ ```
74
+
75
+ 使用 `TQueBind` 把 VECIN 与 VECOUT 绑定为同一块 UB(搬入即搬出,中间无计算),配合 `BUFFER_NUM = 2` 的 double buffer:
76
+
77
+ ```cpp
78
+ pipe->InitBuffer(vecQue_, BUFFER_NUM, tiling_->ubSize / BUFFER_NUM);
79
+ ```
80
+
81
+ host 侧 `CalcUBSplitInfo` 对本策略把可用 UB 折半:
82
+
83
+ ```cpp
84
+ case KEY_N_LAST_TRANSPOSE:
85
+ splitInfo_.ubElement = ubSize_ / BUFFER_NUM / eleSize;
86
+ ```
87
+
88
+ 因此 double buffer 使搬入与搬出在两块 buffer 上流水重叠,掩盖 MTE 时延。
89
+
90
+ ### 2. 多核切分
91
+
92
+ `Process` 先按 host 计算好的多核参数(`realCoreNum` / `blkFactor` / `blkTailFactor`)划分本核处理的循环区间:
93
+
94
+ ```cpp
95
+ ParseMultiCoreRange(blockIdx_, realCoreNum, blkFactor, blkTailFactor,
96
+ blkProcessNum_, blkProcessIdxStart_, blkProcessIdxEnd_);
97
+ ```
98
+
99
+ `blockIdx >= realCoreNum` 的核直接返回不做工。host 侧 `CalcBlockSplitInfoForNLastTranspose` 会在满足 UB 容量约束(`UbOutOfBoundCheckNLast`)与核利用率阈值(`VEC_CORE_USED_THRES_HOLD = 0.9`)之间选择 UB 切分因子 `inUbFactor` 和切分轴 `inCutIndex`,尽量让 `realCoreNum` 接近物理核数。
100
+
101
+ ### 3. Init / Process 总体流程
102
+
103
+ ```mermaid
104
+ flowchart TD
105
+ A[Init] --> B[ParseTilingData 解析 UB 内 main/tail shape]
106
+ A --> C[SetGlobalBuffer x/y]
107
+ A --> D[InitBuffer double buffer]
108
+ P[Process] --> E[ParseMultiCoreRange 多核区间]
109
+ E --> F[ProcessPerCore]
110
+ F --> G[GetLoopParams 每维步长]
111
+ F --> H[GetBlockLoopNum 目的地址混合基]
112
+ F --> I{循环 loopStart..loopEnd}
113
+ I --> J[CopyIn 连续 DataCopyPad 入 UB]
114
+ I --> K[CopyOut 多层循环 DataCopyPad 出 GM]
115
+ ```
116
+
117
+ ### 4. 关键函数说明
118
+
119
+ **`ParseTilingData`**:根据 `inCutIndex` / `inUbFactor` / `inTailFactor` 展开 UB 内 main 块与 tail 块的输入 shape(`inUbInputShapeMain_/Tail_`),再按 `perm` 映射出对应的输出 shape。切分轴之后(更靠内)的维保留原大小,切分轴之前的维在 UB 内视作 1,切分轴本身取 factor。
120
+
121
+ **`GetLoopParams(n)`**:为搬出计算每层循环的 `loopSize`、源步长 `loopSrcStride`(基于末轴按 `BLOCK_SIZE_BYTE=32` 对齐后的 `alignedStride`)与目的步长 `loopDstStride`(沿输出 shape 累乘,直到遇到当前轴在 perm 中的位置)。main 与 tail 分别计算,避免热循环中判分支。
122
+
123
+ **`GetBlockLoopNum`**:用右侧维度累乘 `rightProducts` 构造目的地址的"混合基"`dstAddressOffsetMixedBase_` 和每维贡献 `dstLoopNumArray_`,供 `GetDstAddressOffset` 按 loopIdx 反解出 GM 目的偏移。
124
+
125
+ **`GetDstAddressOffset`**:把线性 `loopIdx` 按混合基逐位分解并直接累加成目的地址偏移,融合了"进制分解 + 累加",不落中间数组(见注释 P9)。
126
+
127
+ **`CopyIn`**:计算源地址偏移后,用 `DataCopyPad` 把一个 UB 块连续搬入。若末轴字节数按 32B 非整除,则退化为 `blockCount = blockLen / lastAxisLen` 的多 block 带 pad 搬入:
128
+
129
+ ```cpp
130
+ copyInParams.blockLen = blockLen * sizeof(T);
131
+ copyInParams.blockCount = 1;
132
+ if ((lastAxisLen * sizeof(T)) % BLOCK_SIZE_BYTE != 0) {
133
+ copyInParams.blockLen = lastAxisLen * sizeof(T);
134
+ copyInParams.blockCount = blockLen / lastAxisLen;
135
+ }
136
+ ```
137
+
138
+ **`CopyOut`**:核心搬出。先设 `copyOutParams`(以 `loopSize[0]` 为连续 burst,`loopSize[1]` 为 blockCount,`dstStride` 用输出步长表达跨行),再用 `SetLoopModePara(loopParams, DataCopyMVType::UB_TO_OUT)` 配置 loop1/loop2 两层硬件循环步长,然后在 loop4~loop7 四层软件循环里逐块 `DataCopyPad` 写回 GM:
139
+
140
+ ```cpp
141
+ SetLoopModePara(loopParams, DataCopyMVType::UB_TO_OUT);
142
+ for (loop7) for (loop6) for (loop5) for (loop4)
143
+ DataCopyPad(outputGM_[dst + ...], bindLocalOut[src + ...], copyOutParams);
144
+ ResetLoopModePara(DataCopyMVType::UB_TO_OUT);
145
+ ```
146
+
147
+ 即通过 "硬件 2 层循环(LoopMode)+ 软件 4 层循环 + copyParams 内 2 层" 组合覆盖最多 8 维的输出重排,而每个最内单元都是一次连续块的 move-align 搬运。
148
+
149
+ **`ProcessPerCore`**:预计算各维 `GetLoopParams` 与 `GetBlockLoopNum`,把 tiling 指针字段、成员数组缓存到栈上局部变量(注释 P1/P4/P6,避免结构体动态下标造成的别名污染与重复 Load),并将 main / tail 循环分离以消除热路径分支(注释 P2):
150
+
151
+ ```cpp
152
+ for (loopIdx = loopStart; loopIdx < loopEnd; loopIdx++) {
153
+ if (inTailFactor != 0 && (loopIdx + 1) % inCutLoopSize == 0) {
154
+ CopyIn(...); CopyOut(..., loopSizeTail_, ...); // 尾块
155
+ } else {
156
+ CopyIn(...); CopyOut(..., loopSizeMain_, ...); // 主块
157
+ }
158
+ }
159
+ ```
160
+
161
+ ### 5. 用到的关键技术小结
162
+
163
+ - Double buffer(`BUFFER_NUM=2`)+ `TQueBind`(VECIN/VECOUT 绑定同一 UB)实现搬入/搬出流水重叠,无中间计算。
164
+ - 连续 `DataCopyPad`:末轴连续,以长 burst 搬运;末轴非 32B 对齐时退化为多 block + pad。
165
+ - `SetLoopModePara` / `LoopModeParams`(`UB_TO_OUT`)硬件多层循环步长表达输出转置布局,循环外一次配置、循环内复用。
166
+ - 多核切分:host 侧按 0.9 核利用率阈值和 UB 容量约束选切分因子,kernel 侧 `ParseMultiCoreRange` 分配区间。
167
+ - 主/尾块循环分离、tiling 字段与成员数组栈缓存等标量优化,减少热路径分支与重复访存。
168
+
169
+ ---
170
+
171
+ ## 三、CopyOut 维度合并优化
172
+
173
+ > ⚠️ **实战经验**:N_LAST 的 CopyOut 按 **input 轴顺序**逐维循环,但 perm 会把 input 轴打散到 output 的不同位置。如果 output 中有相邻维度在 GM 中连续(C-order),可以将它们合并为更大的连续块,减少软件循环层数和 strided 写次数。实测在 batch_to_space 等高维 transpose 算子中,维度合并可将 CopyOut 从 6 维 6 循环降为 3 维 2 硬件循环,性能等价于连续写出。
174
+
175
+ ### 1. 问题:循环顺序与 output 连续性不匹配
176
+
177
+ N_LAST 的循环按 input 轴从内到外排列(axis N-1, N-2, ..., 0),对应 `SimtComputeDim*` 的 `loopSize[n]` / `loopDstStride[n]`。但 perm 重排后,相邻的 input 轴在 output 中的位置不一定连续。
178
+
179
+ 以 batch_to_space(perm=[2,3,0,4,1,5])为例:
180
+
181
+ ```
182
+ input 6D: [bs0(0), bs1(1), N(2), H(3), W(4), C(5)]
183
+ output 6D: [N(0), H(1), bs0(2), W(3), bs1(4), C(5)] (perm=[2,3,0,4,1,5])
184
+ ```
185
+
186
+ N_LAST 循环顺序 vs output 位置:
187
+
188
+ | loop | input axis | output 位置 | 与下一 loop 在 output 中连续? |
189
+ |------|-----------|------------|---------------------------|
190
+ | loop0 | bs0(0) | 2 | ✗ (下一 loop bs1 在 output 4) |
191
+ | loop1 | bs1(1) | 4 | ✗ (下一 loop N 在 output 0) |
192
+ | loop2 | N(2) | 0 | ✓ (H 在 output 1) |
193
+ | loop3 | H(3) | 1 | ✗ (W 在 output 3) |
194
+ | loop4 | W(4) | 3 | ✗ (C 在 output 5) |
195
+ | loop5 | C(5) | 5 | — |
196
+
197
+ 5 个相邻关系中有 4 个不连续,导致 CopyOut 每层循环的 dstStride 有 gap(strided 写),每次 DataCopyPad 只搬末轴 C 个元素。
198
+
199
+ ### 2. 维度合并算法
200
+
201
+ **核心思路**:检查 perm 逆映射,找出 output 中位置连续的 input 轴组,将同组维度合并为更大的连续块。
202
+
203
+ **步骤**:
204
+
205
+ 1. 计算 perm 逆映射:`inv_perm[input_axis] = output_position`
206
+ 2. 按 output 位置排序 input 轴
207
+ 3. 找出 output 中位置连续的 input 轴组(`output_pos[i+1] == output_pos[i]+1`)
208
+ 4. 合并同组维度:
209
+ - 最内组的乘积作为新的 `blockLen`(连续 burst)
210
+ - 次内组的乘积作为 `blockCount`(连续行数)
211
+ - 更外组的乘积作为硬件循环的 `loopSize`(dstStride 连续,无 gap)
212
+
213
+ ### 3. 合并示例(batch_to_space)
214
+
215
+ perm=[2,3,0,4,1,5] 的 output 全部相邻维度连续,可合并为 3 组:
216
+
217
+ ```
218
+ output 6D: [N(0), H(1), bs0(2), W(3), bs1(4), C(5)]
219
+
220
+ 连续组1: W(3) + bs1(4) + C(5) → 合并为 W*bs1*C 的连续块 (blockLen)
221
+ 连续组2: H(1) + bs0(2) → 合并为 H_cut*bs0 (硬件循环1, dstStride=W*bs1*C 连续)
222
+ 连续组3: N(0) → 硬件循环2, dstStride=H*bs0*W*bs1*C 连续)
223
+ ```
224
+
225
+ **合并前后对比**:
226
+
227
+ | | 合并前(6 维 6 循环) | 合并后(3 维 2 硬件循环) |
228
+ |---|---|---|
229
+ | blockLen | C | **W*bs1*C**(连续) |
230
+ | blockCount | W, dstStride=bs1*C(strided) | 1 |
231
+ | 硬件循环1 | H_cut, dstStride=bs0*W*bs1*C | **H_cut*bs0**, dstStride=W*bs1*C(连续) |
232
+ | 硬件循环2 | N, dstStride=H*bs0*W*bs1*C | N, dstStride=H*bs0*W*bs1*C(连续) |
233
+ | 软件循环 | bs1 + bs0(2 层 strided) | **0 层** |
234
+ | DataCopyPad 次数 | bs0×bs1 次 strided | **1 次连续** |
235
+ | 所有 dstStride | 4/5 个有 gap | **0 个有 gap** |
236
+
237
+ 合并后 CopyOut 变成 **1 次 DataCopyPad + 2 层硬件循环**,所有 stride 连续(无 gap),等价于直接连续写出整个 UB 块。
238
+
239
+ ### 4. CopyIn 同理
240
+
241
+ CopyIn 的 `srcAddressOffset` 按 input 线性偏移计算,input 中相邻维度在 GM 中天然连续(C-order)。同样可以合并 input 中连续的维度组,增大单次 DataCopyPad 的 blockLen,减少搬运次数。
242
+
243
+ ### 5. 通用判断条件
244
+
245
+ 维度合并不是 batch_to_space 专用的——任何 N_LAST 适用场景都可以尝试:
246
+
247
+ 1. **perm 不是完全逆序**(即 output 维度顺序与 input 不同),但部分维度在 output 中仍连续
248
+ 2. **可合并维度数 ≥ 2**:至少有一对相邻维度在 output 中连续,合并后减少至少 1 层循环
249
+ 3. **cut axis 不在最内组**:cut axis 需要单独成组(UB 切分约束),不能与更内维合并
250
+
251
+ **特殊情况**:
252
+ - 如果 perm 恒等(无转置),所有维度连续,合并后退化为 TENSOR_MOVE(1 次 DataCopyPad)
253
+ - 如果 perm 完全逆序,无连续维度,不能合并
254
+ - 大部分实际 transpose 的 perm 只有部分维度交换,至少有 1-2 组可合并
255
+
256
+ ### 6. 实测数据参考
257
+
258
+ 以 batch_to_space 算子(perm=[2,3,0,4,1,5],6D)为例,在 ascend950 上:
259
+
260
+ | 实现 | CopyOut 方式 | case2 aiv(us) | case12 aiv(us) |
261
+ |------|------------|--------------|---------------|
262
+ | 基线 DataCopyPad | 4D 连续写出 | 19.4 | 24.6 |
263
+ | N_LAST(未合并) | 6 维 strided 写 | 58.9 | 124.1 |
264
+ | N_LAST(合并后预期) | 3 维连续写 | ~19 | ~25 |
265
+ | TQueBind 4D | 4D 连续写出 | 13.1 | 15.4 |
266
+
267
+ > N_LAST 未合并时比基线慢 2-5 倍,根因就是 CopyOut 的 strided 写。合并后预期与基线持平,因为 CopyOut 变为连续写出。TQueBind 更快是因为它在 4D 空间操作,天然利用了输出连续性,且 TilingData 更小(128B vs 972B)。
268
+
269
+ ### 7. 实施建议
270
+
271
+ 在 N_LAST 模板中增加维度合并逻辑的最佳位置:
272
+
273
+ - **Host 端**(`ComputeNLastTiling` / `ParseTilingData`):在计算 `loopSize` / `loopDstStride` 之前,先检测可合并维度组,将合并后的维度组数和乘积写入 TilingData
274
+ - **Kernel 端**(`GetLoopParams` / `CopyOut`):按合并后的维度组数设置循环参数,减少循环层数
275
+
276
+ **关键**:合并逻辑应作为 N_LAST 模板的通用增强,而非算子专用适配。通过检查 `inv_perm` 的连续性自动判断,无需 hardcode 特定 perm。