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,177 @@
1
+ # Transpose 双轴切分策略 CUT_TWICE(tilingKey = 10003)
2
+
3
+ > 本文面向性能调优开发者,基于 arch35 `TransposeCutTwoAxis`(`transpose_cut_two_axis.h`,781 行)与 host 侧 `transpose_tiling.cpp` 的实际实现整理,不含臆测。
4
+ >
5
+ > - kernel 类:`Transpose::TransposeCutTwoAxis<T>`
6
+ > - 派发:`transpose_kernel.cpp` 中 `tilingKey == CUT_TWICE(10003)`
7
+ > - host 选择:`DoSplitUB()`(NDDMA 家族),block 切分 `CalcBlockSplitInfoForCutTwice()`,区间 `GetIntervalInfoForCutTwice()`
8
+ > - 数据结构:`TransposeOpTilingData`(`transpose_tiling_data.h`)
9
+
10
+ CUT_TWICE 属于 NDDMA(N 维 DMA)Transpose 家族。该家族先把逻辑 shape 归约(reduce)、再对齐扩展到固定的 5 维(`NDDMA_MAX_DIM_NUM = 5`),然后依据 UB 容纳能力在**输入方向和输出方向各切一根轴**来搬运并完成转置。
11
+
12
+ ---
13
+
14
+ ## 一、适用场景
15
+
16
+ ### 1.1 为什么要在输入、输出两个方向都切分
17
+
18
+ Transpose 的本质是「一次搬运 + 换轴写回」。NDDMA 方案把一块数据读进 UB(`DataCopy`,按 `expandedInputShape` 的顺序线性读入),再按目标 perm 的顺序写回 GM(`DataCopyPad` + LoopMode 的多维 stride)。要让搬运高效,进 UB 的这一块必须满足两个约束:
19
+
20
+ 1. **UB 容量约束**:一块的元素数不能超过 `ubElement`(UB 可用元素数)。
21
+ 2. **搬出连续度约束**:写回时最内层要尽量凑满一个 cache line / block(32B),否则出现大量小碎片写。
22
+
23
+ host 侧 `DoSplitUB()` 的做法是:
24
+
25
+ - `DoSplitUBInput()`:先把 `inUbElement` 设为 `sqrt(ubElement)`(见 `CalcUBSplitInfo` 中 `KEY_NDDMA_BASE` 分支),从**输入最内轴**往外找到第一根装不下的轴,把它作为 `inCutIndex`,切分因子 `inUbFactor`。这保证了「读入方向」的连续块大小合适。
26
+ - 随后在 `DoSplitUB()` 里从**输出最内轴**往外扫,给「写出方向」找一根切分轴 `outCutIndex`、因子 `outUbFactor`,保证写回时每块也不越界、且尽量对齐。
27
+
28
+ 问题在于:输入切的那根轴,在输出的轴序里处于某个位置 `FindOutIndex(inCutIndex)`;输出切的那根轴是 `outCutIndex`。如果这两者不是同一根轴,单切一根轴无法同时满足「读连续」和「写连续/不越界」——**读方向切好了,写方向仍然有一根大轴撑爆 UB 或产生极碎的写**。此时必须两个方向各切一根。
29
+
30
+ ### 1.2 相对 CUT_ONCE,何时必须用双轴切分
31
+
32
+ 判定就在 `DoSplitUB()` 结尾一行:
33
+
34
+ ```cpp
35
+ if (splitInfo_.outCutIndex > FindOutIndex(splitInfo_.inCutIndex)) {
36
+ tilingKey_ = KEY_CUT_TWICE; // 10003
37
+ } else {
38
+ tilingKey_ = KEY_CUT_ONCE; // 10002
39
+ }
40
+ ```
41
+
42
+ 含义:
43
+
44
+ - `FindOutIndex(inCutIndex)` 是「输入切分轴」映射到输出轴序中的位置。
45
+ - 若为满足 UB 约束而选出的输出切分轴 `outCutIndex`,其位置比输入切分轴在输出里的位置**更靠外(下标更大 = 更外层)**,说明:仅靠切分输入轴对应的那根输出轴还不够,还得再往外切一根独立的输出轴才能把一块塞进 UB。这时才是真正的「双轴」。
46
+ - 反之(`outCutIndex <= FindOutIndex(inCutIndex)`),输入切分轴对应的输出轴自己就够用,单轴切分(CUT_ONCE)即可,`CalcBlockSplitInfoForCutOnce()` 里甚至会把 `outCutIndex` 直接回退到 `FindOutIndex(inCutIndex)`。
47
+
48
+ 典型触发场景:高维、perm 把「大内轴」换到外侧的转置(例如 `[N, H, W, C]` 的复杂重排),单方向切分无法兼顾读写两端的块大小时,双轴切分能把 UB 一块限制在既读连续又写不越界的范围内。
49
+
50
+ ### 1.3 为什么能提升性能
51
+
52
+ - **两端都可控**:输入方向的块保证 `DataCopy` 读入的连续度;输出方向的块保证 `DataCopyPad` 写回时 `blockLen/blockCount/dstStride` 合理,减少小于 cache line 的碎片写。
53
+ - **多核利用率**:`CalcBlockSplitInfoForCutTwice()` 会用 `outAxiseExceptSplitInAxis * inUbAxis` 估算并行度,若低于 `coreNum_`,则回头在 `inUbFactor` 上从大到小搜索,直到并行度达到 `VEC_CORE_USED_THRES_HOLD` 阈值且不越界(`UbOutOfBoundCheck`)。即在「块足够大」和「核用满」之间取平衡。
54
+ - **NDDMA 一次成型**:借助 5 维 `MultiCopyParams` + LoopMode,一次 API 调用即可完成多维带 stride 的搬运,免去逐轴显式循环拷贝的开销。
55
+
56
+ ---
57
+
58
+ ## 二、kernel 执行流程与关键实现
59
+
60
+ ### 2.1 整体结构
61
+
62
+ ```mermaid
63
+ flowchart TD
64
+ A[Init: ParseTilingData, SetGlobalBuffer, InitBuffer vecQue_] --> B[Process]
65
+ B --> C{blockIdx_ >= realCoreNum_?}
66
+ C -->|是| Z[return 本核不干活]
67
+ C -->|否| D[按 blkFactor/blkTailFactor 计算本核 srcOffset_ 与 blkProcessNum_]
68
+ D --> E[ProcessPerCore]
69
+ E --> F[计算 inputOutputCutIndex_/outputInputCutIndex_/max,minCutIndex_]
70
+ F --> G[GetCopyOutParams: 求 4 组 loopSize 与 loopDstStride_]
71
+ G --> H[GetTailAddressOffsetBase: 求各 tail 段的基址偏移]
72
+ H --> I[outUbLoop_ = 除两切分轴外各轴的 UB 循环数乘积]
73
+ I --> J[ProcessBlock]
74
+ J --> M[ProcessMain]
75
+ J --> N[ProcessInputTail]
76
+ J --> O[ProcessOutputTail]
77
+ J --> P[ProcessTail]
78
+ ```
79
+
80
+ ### 2.2 Init
81
+
82
+ ```cpp
83
+ blockIdx_ = GetBlockIdx();
84
+ ParseTilingData(); // 算 expandedInput/OutputCutIndex_
85
+ inputGM_.SetGlobalBuffer((__gm__ T*)x);
86
+ outputGM_.SetGlobalBuffer((__gm__ T*)y);
87
+ pipe->InitBuffer(vecQue_, 1, tiling_->ubSize); // 单块 buffer(深度 1)
88
+ ```
89
+
90
+ `ParseTilingData()` 把 host 给的 `inCutIndex/outCutIndex`(基于归约后的 dim)平移到 5 维扩展坐标系:
91
+
92
+ ```cpp
93
+ expandedOutputCutIndex_ = outCutIndex + NDDMA_MAX_DIM_NUM - permSize;
94
+ expandedInputCutIndex_ = inCutIndex + NDDMA_MAX_DIM_NUM - permSize;
95
+ ```
96
+
97
+ ### 2.3 多核切分(Process)
98
+
99
+ 按 `blkFactor_ / blkTailFactor_` 把「总 NDDMA 块数」平均分到 `realCoreNum_` 个核。前 `blkTailFactor` 个核各多处理一块。得到本核处理区间 `[srcOffset_, srcOffset_ + blkProcessNum_ - 1]`。这里的「块索引」是一维扁平编号,后面通过混合进制还原成多维偏移。
100
+
101
+ ### 2.4 四个数据区间:main / inputTail / outputTail / tail
102
+
103
+ 因为**同时切了两根轴**,每根轴都可能有尾块(`inTailFactor`、`outTailFactor`),两两组合出 4 类块:
104
+
105
+ | 区间 | 含义 | 处理函数 | 使用的 UB shape |
106
+ |------|------|----------|-----------------|
107
+ | main | 两轴都取满 factor 的主体块 | `ProcessMain` | `inUbMainSrc/DstShape` |
108
+ | inputTail | 输入切分轴取尾、输出轴取满 | `ProcessInputTail` | `inUbInputTailSrc/DstShape` |
109
+ | outputTail | 输出切分轴取尾、输入轴取满 | `ProcessOutputTail` | `inUbOutputTailSrc/DstShape` |
110
+ | tail | 两轴都取尾(尾中之尾) | `ProcessTail` | `inUbTailSrc/DstShape` |
111
+
112
+ 区间边界由 host `GetIntervalInfoForCutTwice()` 预先算好,放进 tiling 的 `rangeMainEnd / rangeInputTailStart.. / rangeTailStart..`。只有当 `inTailFactor`、`outTailFactor` 非 0 时对应尾区间才存在(host 里有三种组合分支)。
113
+
114
+ kernel 侧 `ProcessBlock()` 用 `PorcessOffsetRange()` 把本核的 `[srcOffset_, ...]` 与四个全局区间求交,只对落在本核内的那部分区间调用对应 `Process*`:
115
+
116
+ ```cpp
117
+ if (offsetRangeMainRes.end != 0 || blockIdx_ == 0) ProcessMain(...);
118
+ if (offsetRangeInputTailRes.end != 0) ProcessInputTail(...);
119
+ if (offsetRangeOutputTailRes.end != 0) ProcessOutputTail(...);
120
+ if (offsetRangeTailRes.end != 0) ProcessTail(...);
121
+ ```
122
+
123
+ ### 2.5 单块搬运的核心:Process* + SetupLoopInfo
124
+
125
+ 四个 `Process*` 结构完全一致,区别只在用哪套 UB shape 和基址偏移。以 `ProcessMain` 为例,单块流程:
126
+
127
+ ```mermaid
128
+ flowchart LR
129
+ A[loopidx 混合进制拆解 -> srcAddressOffset, dstAddressOffset] --> B[AllocTensor bindLocalIn]
130
+ B --> C["DataCopy NDDMA 多维读入 UB (paramsMain)"]
131
+ C --> D[EnQue]
132
+ D --> E["SetLoopModePara UB_TO_OUT (换轴 stride)"]
133
+ E --> F[DeQue bindLocalOut]
134
+ F --> G["循环 DataCopyPad 写回 outputGM_ (copyOutParams)"]
135
+ G --> H[ResetLoopModePara + FreeTensor]
136
+ ```
137
+
138
+ 关键点:
139
+
140
+ 1. **地址还原(混合进制)**:一维 `loopidx` 通过 `DecimalToMixedBase(loopidx, loopNumArray, mixedBase)` 拆成各外层轴的循环下标,再乘以每轴的 `loopShapeSizeArray`(shape size)累加成 GM 上的 `srcAddressOffset`/`dstAddressOffset`。`GetLoopAddressOffsetImpl` 负责挑出「除切分轴外、循环数 >1」的轴,src 用原轴序、dst 通过 `FindPermIndex` 用 perm 后的轴序,从而实现读写两端各自的地址步进。tail 段还会减去前面区间已消费的块数偏移(如 `ProcessInputTail` / `ProcessTail` 里那串 `loopidx - (...)`),并加上 `GetTailAddressOffsetBase()` 算出的尾块基址。
141
+
142
+ 2. **读入:NDDMA `DataCopy`**
143
+ ```cpp
144
+ DataCopy<T, NDDMA_MAX_DIM_NUM, config>(bindLocalIn, inputGM_[srcAddressOffset], paramsMain);
145
+ ```
146
+ `paramsMain = {loopInfoMain, constValue}`,`loopInfoMain` 由 `SetupLoopInfo(inUbSrcShape, inUbDstShape)` 生成:5 维的 `loopSize / loopSrcStride / loopDstStride`。其中:
147
+ - `loopSrcStride` 按 `expandedInputShape` 的后缀连乘得到(输入连续读)。
148
+ - `loopDstStride` 先按 `inUbDstShape` 后缀连乘,再在 `maxCutIndex_ - 1` 处做 32B 对齐(`BLOCK_SIZE_BYTE`),然后按 `expandedPerm` 重排到目标轴序——这是「换轴」发生的地方。
149
+ - 三个数组最后 `reverseArray` 反转以适配 API 的维度顺序。
150
+
151
+ 3. **写回:LoopMode + `DataCopyPad`**
152
+ `GetCopyOutParams()` 预先把 UB→GM 的搬出拆成:内两维用 `DataCopyExtParams`(`blockLen = loopSize[0]*sizeof(T)`、`blockCount = loopSize[1]`、`dstStride = (loopDstStride_[1] - loopSize[0]) * sizeof(T)`),外两维用 `LoopModeParams`(loop1/loop2 的 size 与 src/dst stride),最外一维(`loopSize[4]`)在 kernel 里用显式 `for` + `DataCopyPad` 逐次搬出。`SetLoopModePara(loopParams, DataCopyMVType::UB_TO_OUT)` 设定换轴的两层循环,搬完 `ResetLoopModePara`。
153
+
154
+ `GetCopyOutParams()` 里对每根切分轴(`inUbMainDstShape[i] != expandedOutputShape[i]` 处)分段累计 `loopSize`,并按 32B 向上对齐算 `loopSrcStride[1]`,保证写回块头部对齐。
155
+
156
+ ### 2.6 用到的关键技术(按代码实况)
157
+
158
+ - **TQueBind(VECIN+VECOUT)单缓冲**:`vecQue_` 类型是 `TQueBind<VECIN, VECOUT, 1>`,`InitBuffer(vecQue_, 1, ubSize)` 深度为 1。即**同一块 UB 空间既作输入又作输出,无 double buffer**(`BUFFER_NUM=2` 仅在基类常量中,本策略未用于 ping-pong)。同步靠 `EnQue`/`DeQue` 维持 MTE2→MTE3 的依赖。
159
+ - **NDDMA 5 维搬运**:`DataCopy<T, 5, config>` + `MultiCopyParams/MultiCopyLoopInfo`,一次完成多维带 stride 的读入;`config = {false,0,0,false}`。
160
+ - **LoopMode 搬出**:`SetLoopModePara / ResetLoopModePara` + `DataCopyPad`,以 `DataCopyMVType::UB_TO_OUT` 完成换轴写回,支持非对齐尾块 pad。
161
+ - **多核切分**:`blkFactor_/blkTailFactor_/realCoreNum_` 一维扁平分核,`PorcessOffsetRange` 做本核区间与四类块区间求交。
162
+ - **混合进制寻址**:`DecimalToMixedBase` 把扁平 `loopidx` 还原成多维坐标,是「不显式嵌套多层 for」而处理任意维搬运的关键手段。
163
+ - **32B 对齐**:`SetupLoopInfo` 与 `GetCopyOutParams` 中多处按 `BLOCK_SIZE_BYTE=32` 做 `CeilAlign`,保证 stride/块头对齐,避免非对齐访存降速。
164
+
165
+ ---
166
+
167
+ ## 附:关键 tiling 字段(TransposeOpTilingData)
168
+
169
+ | 字段 | 作用 |
170
+ |------|------|
171
+ | `inCutIndex / outCutIndex` | 输入、输出方向切分轴(归约后坐标) |
172
+ | `inUbFactor / outUbFactor` | 两轴的 UB 切分因子 |
173
+ | `inTailFactor / outTailFactor` | 两轴尾块大小(决定尾区间是否存在) |
174
+ | `realCoreNum / blkFactor / blkTailFactor` | 多核切分参数 |
175
+ | `expandedPerm / expandedInput/OutputShape` | 5 维扩展后的 perm 与 shape |
176
+ | `inUbMain/InputTail/OutputTail/Tail Src/DstShape` | 四类块各自的 UB src/dst 形状 |
177
+ | `rangeMainEnd / rangeInputTail* / rangeOutputTail* / rangeTail*` | 四个扁平块区间边界 |
@@ -0,0 +1,398 @@
1
+ # Transpose Fusion 优化设计
2
+
3
+ ## 1. 优化目标
4
+
5
+ Transpose(转置)是深度学习算子中高频出现的内存布局重排操作。Naive 实现通常采用独立的 Transpose 算子或在 GM 上逐元素重排,导致:
6
+
7
+ - **额外的算子调用开销**:输出后调用独立 Transpose 算子,增加 kernel 启动开销和数据搬运。
8
+ - **跨步访问效率低**:直接按转置维度访问 GM 导致跨步访问(strided access),内存带宽利用率极低。
9
+ - **UB 上手动转置复杂**:在 UB 上通过标量循环实现转置,无法利用向量化指令,且代码复杂度高。
10
+ - **迭代式算法重复转置**:Sinkhorn 等迭代算法中梯度数据需行列交替访问,每次迭代都转置引入大量 DMA 开销。
11
+
12
+ 本优化通过 DataCopy stride 参数实现零拷贝转置融合、TransDataTo5HD 向量化转置、Transpose buffer 常驻复用等手段,将转置操作融入数据搬运流程,消除额外开销。
13
+
14
+ | 指标 | naive | optimized | 收益 |
15
+ |------|-------|-----------|------|
16
+ | 转置实现方式 | 独立 Transpose 算子 | DataCopy stride 跳写融合 | 消除算子调用和额外搬运 |
17
+ | 内存访问模式 | 跨步访问(strided) | 连续读取+跳写(srcStride=0) | 读取带宽最大化 |
18
+ | UB 转置 | 标量循环重排 | TransDataTo5HD 向量化 | 效率提升 4-8 倍 |
19
+ | 迭代式转置 | 每迭代一次转置+DMA | 首尾各一次转置,中间常驻 UB | 零中间 DMA 开销 |
20
+ | 多维转置 | 多次独立转置 | 单次 stride 参数控制 | 减少指令数 |
21
+
22
+ > 适用算子族:`conversion` 族所有涉及布局转换的变体,如 `transpose`、`flash_attention` 输出(BNSD→NBSD、TND→NTD)、`gather_elements` 非最后一维 gather 等。
23
+
24
+ ## 2. 架构概览
25
+
26
+ ### 2.1 存储层级与数据流
27
+
28
+ Transpose 融合的数据流:src 经 MTE2 连续读取到 UB,通过 DataCopy stride 参数(`srcStride=0` 连读、`dstStride=跳步` 跳写)在搬运时完成布局转换,无需独立 Transpose 算子。对于 UB 内向量化转置,使用 TransDataTo5HD 指令。对于迭代式算法,Transpose Buffer 常驻 UB,首尾各一次转置,中间零 DMA。
29
+
30
+ ### 2.2 转置策略矩阵
31
+
32
+ | 场景 | 优化策略 | 核心 API / 参数 |
33
+ |------|---------|----------------|
34
+ | 输出转置融合 | DataCopy stride 跳写 | `srcStride=0` 连读 + `dstStride=跳步` 跳写 |
35
+ | 头尾块边界处理 | 单独 DataCopy | 头块/尾块单独处理,中间块 stride 跳写 |
36
+ | 变长序列转置 | 动态 tSize/tBase 计算 | `actualSeqLengthsGmQ.GetValue()` 获取变长信息 |
37
+ | UB 向量化转置 | TransDataTo5HD | `TransposeBase16M8` / `TransposeBase16M16` |
38
+ | 迭代式转置常驻 | Transpose Buffer 复用 | `TBuf<TPosition::VECCALC>` 常驻,首尾转置 |
39
+ | 非最后一维 Gather | Transpose-Gather-ReTranspose | 三步法:转置使 gather 维度连续 |
40
+
41
+ ### 2.3 支持的布局转换
42
+
43
+ | 源布局 | 目标布局 | 适用场景 | stride 计算 |
44
+ |--------|---------|---------|------------|
45
+ | BNSD | NBSD | FlashAttention 输出 | `dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(T) / 32U` |
46
+ | BSND | NBSD | Batch Matmul 输出 | 类似 BNSD,调整 axis 顺序 |
47
+ | BSH | NBSD | 简化 Attention 输出 | 类似 BNSD,S 和 H 合并 |
48
+ | TND | NTD | 变长序列 | `dstStride = (tSize - 1) * headDim * sizeof(T) / 32U` |
49
+ | [row, col] | [col, row] | 通用矩阵转置 | `TransposeBase16M8` / `TransposeBase16M16` |
50
+ | [N, C, D, H, W] | [N, C, D, W, H] | 5D 数据转置 | `TransDataTo5HD` |
51
+
52
+ ## 3. 关键参数配置
53
+
54
+ ```cpp
55
+ // DataCopyParams / DataCopyExtParams 转置参数
56
+ struct DataCopyParams {
57
+ uint16_t blockCount; // 块数量(如 gCount)
58
+ uint16_t blockLen; // 每块长度(单位:32B)
59
+ uint16_t srcStride; // 源地址块间步长(单位:32B)
60
+ uint16_t dstStride; // 目的地址块间步长(单位:32B)
61
+ };
62
+
63
+ // DataCopyExtParams(stride 超过 65535 时使用)
64
+ struct DataCopyExtParams {
65
+ uint16_t blockCount;
66
+ uint32_t blockLen; // 字节为单位
67
+ uint32_t srcStride; // 字节为单位
68
+ uint32_t dstStride; // 字节为单位
69
+ uint32_t reserved;
70
+ };
71
+ ```
72
+
73
+ ### 3.1 Stride 计算原则
74
+
75
+ ```cpp
76
+ // 通用 stride 转置公式:
77
+ // srcStride = 0 表示连读(源数据连续)
78
+ // dstStride = (目标轴总长度 - 当前块长度) * 元素大小 / 32U
79
+
80
+ // BNSD → NBSD 示例
81
+ dataCopyParams.blockCount = gCount; // 处理多少个 G
82
+ dataCopyParams.blockLen = s1Size * headDim * sizeof(OUT_T) / 32U; // 一个 S1*D
83
+ dataCopyParams.srcStride = 0; // 连读
84
+ dataCopyParams.dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(OUT_T) / 32U; // 跳写
85
+
86
+ // TND → NTD 变长序列示例
87
+ uint64_t tSize = actualSeqLengthsGmQ.GetValue(batchSize - 1); // 总 T
88
+ uint64_t tBase = (bIdx == 0) ? 0 : actualSeqLengthsGmQ.GetValue(bIdx - 1); // 当前 batch 的 T 起始
89
+ dataCopyParams.dstStride = (tSize - 1) * headDim * sizeof(OUT_T) / 32U; // 按 T 跳写
90
+ ```
91
+
92
+ ### 3.2 TransDataTo5HD 对齐要求
93
+
94
+ | 转置类型 | row 对齐 | col 对齐 | 说明 |
95
+ |---------|---------|---------|------|
96
+ | TransposeBase16M8 | 16 | 8 | FP32 场景 |
97
+ | TransposeBase8M16 | 8 | 16 | FP16 场景 |
98
+ | TransposeBase16M16 | 16 | 16 | 通用场景 |
99
+
100
+ ```cpp
101
+ template <typename T>
102
+ __aicore__ inline void TransposeBase16M8(LocalTensor<T>& dstUb, LocalTensor<T>& srcUb,
103
+ uint64_t rowNum, uint64_t colNum) {
104
+ uint64_t srcAddrList[TRANS_ADDR_LEN];
105
+ uint64_t dstAddrList[TRANS_ADDR_LEN];
106
+ for (uint64_t r = 0; r < rowNum / TRANS_ADDR_LEN; r++) {
107
+ for (uint64_t i = 0; i < TRANS_ADDR_LEN; i++) {
108
+ srcAddrList[i] = (uint64_t)(srcUb[r * TRANS_ADDR_LEN * colNum + i * colNum].GetPhyAddr());
109
+ dstAddrList[i] = (uint64_t)(dstUb[r * TRANS_ADDR_LEN + i / 2 * rowNum + i % 2 * BLOCK_NUM_32].GetPhyAddr());
110
+ }
111
+ struct TransDataTo5HDParams transDataParams;
112
+ transDataParams.repeatTimes = colNum / BLOCK_NUM_32;
113
+ TransDataTo5HD<float>(dstAddrList, srcAddrList, transDataParams);
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## 4. 核心计算循环
119
+
120
+ ### 4.1 naive 版本(优化前)
121
+
122
+ ```cpp
123
+ // 阶段 1:输出后调用独立 Transpose 算子
124
+ DataCopy(outputGm, attenOutUb, size); // BNSD 格式
125
+ Transpose(outputGm, tempGm, ...); // 额外转置操作
126
+
127
+ // 阶段 2:跨步访问读取转置数据(效率极低)
128
+ for (uint32_t n = 0; n < nSize; n++) {
129
+ for (uint32_t b = 0; b < batchSize; b++) {
130
+ for (uint32_t s = 0; s < s1Size; s++) {
131
+ for (uint32_t d = 0; d < headDim; d++) {
132
+ // 跨步访问:每次只读一个元素
133
+ dst[n][b][s][d] = src[b][n][s][d];
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ // 阶段 3:UB 上标量循环转置
140
+ for (uint64_t i = 0; i < rowNum; i++) {
141
+ for (uint64_t j = 0; j < colNum; j++) {
142
+ dstUb[j * rowNum + i] = srcUb[i * colNum + j];
143
+ }
144
+ }
145
+
146
+ // 阶段 4:迭代式算法每迭代都转置+DMA
147
+ for (int j = numIters_ - 1; j > 0; --j) {
148
+ colNormGrad();
149
+ TransposeX(); // 转置
150
+ CopyOutTranspose(); // DMA 写出
151
+ rowNormGrad();
152
+ TransposeXBack(); // 转置回来
153
+ CopyOutTransposeBack(); // DMA 写出
154
+ }
155
+ ```
156
+
157
+ ### 4.2 optimized 版本(优化后)
158
+
159
+ ```cpp
160
+ // === Variant A: BNSD → NBSD 转置输出融合 ===
161
+ DataCopyParams dataCopyParams;
162
+ dataCopyParams.blockCount = gCount; // 处理多少个 G
163
+ dataCopyParams.blockLen = s1Size * headDim * sizeof(OUT_T) / 32U; // 一个 S1*D
164
+ dataCopyParams.srcStride = 0; // 连读
165
+ dataCopyParams.dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(OUT_T) / 32U; // 跳写
166
+
167
+ uint64_t attenOutOffset = n2Idx * gSize * batchSize * qSeqSize * headDim + // N2轴
168
+ gStartIdx * batchSize * qSeqSize * headDim + // G轴
169
+ bIdx * qSeqSize * headDim; // B轴
170
+ DataCopy(attentionOutGm[attenOutOffset], attenOutUb, dataCopyParams);
171
+
172
+ // === Variant B: 头尾块单独处理 ===
173
+ bool hasHeadBlock = (s1StartIdx != 0);
174
+ bool hasTailBlock = ((s1EndIdx + 1) != s1Size);
175
+
176
+ if (hasHeadBlock) {
177
+ DataCopyParams dataCopyParamsHead;
178
+ dataCopyParamsHead.blockCount = 1;
179
+ dataCopyParamsHead.blockLen = (s1Size - s1StartIdx) * headDim * sizeof(OUT_T) / 32U;
180
+ dataCopyParamsHead.dstStride = 0; // 单块无需跳写
181
+ DataCopy(attentionOutGm[offset], attenOutUb, dataCopyParamsHead);
182
+ attenOutUbOffset += (s1Size - s1StartIdx) * headDim;
183
+ }
184
+
185
+ DataCopyParams dataCopyParams;
186
+ dataCopyParams.blockCount = gCount - hasHeadBlock - hasTailBlock;
187
+ dataCopyParams.dstStride = (batchSize * qSeqSize - s1Size) * headDim / 32U;
188
+ DataCopy(attentionOutGm[offset], attenOutUb[attenOutUbOffset], dataCopyParams);
189
+
190
+ if (hasTailBlock) {
191
+ DataCopyParams dataCopyParamsTail;
192
+ dataCopyParamsTail.blockCount = 1;
193
+ dataCopyParamsTail.blockLen = (s1EndIdx + 1) * headDim * sizeof(OUT_T) / 32U;
194
+ DataCopy(attentionOutGm[offset], attenOutUb[attenOutUbOffset], dataCopyParamsTail);
195
+ }
196
+
197
+ // === Variant C: TND → NTD 变长序列转置 ===
198
+ uint64_t tSize = actualSeqLengthsGmQ.GetValue(batchSize - 1); // 总 T
199
+ uint64_t tBase = (bIdx == 0) ? 0 : actualSeqLengthsGmQ.GetValue(bIdx - 1); // 当前 batch 的 T 起始
200
+
201
+ DataCopyParams dataCopyParams;
202
+ dataCopyParams.blockCount = gCountOneS1;
203
+ dataCopyParams.blockLen = headDim * sizeof(OUT_T) / 32U;
204
+ dataCopyParams.dstStride = (tSize - 1) * headDim * sizeof(OUT_T) / 32U; // 按 T 跳写
205
+
206
+ uint64_t attenOutOffset = n2Idx * gSize * tSize * headDim + // N2轴
207
+ gIdx * tSize * headDim + // G轴
208
+ tBase * headDim + // B轴(动态)
209
+ s1Idx * headDim; // S1轴
210
+ DataCopy(attentionOutGm[attenOutOffset], attenOutUb[attenOutUbOffset], dataCopyParams);
211
+
212
+ // === Variant D: TransDataTo5HD 向量化转置 ===
213
+ template <typename T>
214
+ __aicore__ inline void TransposeBase16M8(LocalTensor<T>& dstUb, LocalTensor<T>& srcUb,
215
+ uint64_t rowNum, uint64_t colNum) {
216
+ uint64_t srcAddrList[TRANS_ADDR_LEN];
217
+ uint64_t dstAddrList[TRANS_ADDR_LEN];
218
+ for (uint64_t r = 0; r < rowNum / TRANS_ADDR_LEN; r++) {
219
+ for (uint64_t i = 0; i < TRANS_ADDR_LEN; i++) {
220
+ srcAddrList[i] = (uint64_t)(srcUb[r * TRANS_ADDR_LEN * colNum + i * colNum].GetPhyAddr());
221
+ dstAddrList[i] = (uint64_t)(dstUb[r * TRANS_ADDR_LEN + i / 2 * rowNum + i % 2 * BLOCK_NUM_32].GetPhyAddr());
222
+ }
223
+ struct TransDataTo5HDParams transDataParams;
224
+ transDataParams.repeatTimes = colNum / BLOCK_NUM_32;
225
+ TransDataTo5HD<float>(dstAddrList, srcAddrList, transDataParams);
226
+ }
227
+ }
228
+
229
+ // === Variant E: Transpose Buffer 常驻复用 ===
230
+ TBuf<TPosition::VECCALC> gradTransposeBuf_;
231
+ void Process() {
232
+ TransposeXIn(); // 首次转置到 UB
233
+ for (int j = numIters_ - 1; j > 0; --j) {
234
+ colNormGrad(); // 原地读写 gradTransposeBuf_
235
+ rowNormGrad(); // 原地读写 gradTransposeBuf_
236
+ }
237
+ TransposeXOut(); // 最后一次转置回并搬出
238
+ CopyOut(offset);
239
+ }
240
+
241
+ // === Variant F: Transpose-Gather-ReTranspose 三步法 ===
242
+ __aicore__ inline void Process() {
243
+ for (size_t preDimId = 0; preDimId < curGroupPreDim; preDimId++) {
244
+ for (size_t postDimPartId = 0; postDimPartId < postDimPartNum; postDimPartId++) {
245
+ TransposeProcess(xBaseOffset, idxBaseOffset, carryNumAlign_, ...);
246
+ this->MTE3ToMTE2Sync();
247
+ GatherProcess(carryNumAlign_);
248
+ this->MTE3ToMTE2Sync();
249
+ ReTransposeProcess(idxBaseOffset, carryNumAlign_);
250
+ }
251
+ }
252
+ }
253
+ ```
254
+
255
+ ## 5. 从 naive 到 transpose_fusion 的关键修改点
256
+
257
+ | 修改项 | naive(优化前) | transpose_fusion(优化后) |
258
+ |--------|---------------|---------------------------|
259
+ | 转置实现 | 独立 Transpose 算子 | DataCopy stride 参数零拷贝融合 |
260
+ | 内存读取 | 跨步访问(strided) | srcStride=0 连续读取 |
261
+ | 内存写回 | 连续写出 | dstStride=跳步 实现布局转换 |
262
+ | UB 转置 | 标量循环重排 | TransDataTo5HD 向量化指令 |
263
+ | 迭代式转置 | 每迭代转置+DMA | 首尾各一次,中间常驻 UB |
264
+ | 头尾边界 | 统一处理(可能错误) | 头块/尾块单独 DataCopy |
265
+ | 变长序列 | 固定长度假设 | 动态 tSize/tBase 计算 |
266
+ | Gather 维度 | 直接跨步 gather(低效) | Transpose→Gather→ReTranspose 三步法 |
267
+
268
+ ## 6. 注意事项 / 约束
269
+
270
+ 1. **DataCopyParams stride 为 uint16_t**:最大 65535(单位:32B)。若 stride 超过此限制,需切换到 `DataCopyExtParams`(uint32_t,范围更大)。
271
+
272
+ 2. **blockLen 单位为 32B**:`DataCopyParams.blockLen` 的单位是 32B,计算时需 `sizeof(T) * elementCount / 32U`。使用 `DataCopyExtParams` 时单位为字节。
273
+
274
+ 3. **仅适用于单维度转置**:多维度复杂重排需要组合多次 stride 搬运或使用 Gather。例如 [B, N, S, D] → [N, B, S, D] 可通过一次 stride 跳写完成,但 [B, N, S, D] → [D, S, N, B] 需要多次操作。
275
+
276
+ 4. **Transpose buffer 常驻的 UB 占用**:`gradTransposeBuf_` 占用 `tAlign_ × n_ × n_ × 4` 字节,n 较大时成为 tiling 瓶颈。仅在迭代次数较多(≥3)时收益明显。
277
+
278
+ 5. **TransDataTo5HD 对齐要求**:row 和 col 必须满足对应转置类型的对齐要求(16/8/16)。未对齐时需 padding 或降级为标量处理。
279
+
280
+ 6. **变长序列需要从 GM 读取 actual sequence 信息**:TND 场景下每个 batch 的 T 大小不同,需从 `actualSeqLengthsGmQ` 动态获取,引入额外的 GM 读取开销。
281
+
282
+ 7. **stride 跳写效率低于连续搬运**:虽然消除了 Transpose 算子,但 stride 模式的写回效率仍略低于连续搬运。需权衡消除算子调用 vs stride 写回开销。
283
+
284
+ 8. **头尾块增加 DataCopy 指令数量**:头块和尾块各需一次额外的 DataCopy,逻辑复杂度增加,但保证输出正确性。
285
+
286
+ ## 7. 常见问题与解决方案
287
+
288
+ ### Q1: DataCopyParams 和 DataCopyExtParams 如何选择?
289
+
290
+ ```cpp
291
+ // DataCopyParams:stride 为 uint16_t(单位:32B),适合大多数场景
292
+ DataCopyParams params;
293
+ params.dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(OUT_T) / 32U;
294
+ // 若上述值 > 65535,则必须使用 DataCopyExtParams
295
+
296
+ // DataCopyExtParams:stride 为 uint32_t(单位:32B),适合大 stride 场景
297
+ DataCopyExtParams extParams;
298
+ extParams.dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(OUT_T) / 32U; // 32B
299
+ ```
300
+
301
+ ### Q2: 如何计算 BNSD → NBSD 的 dstStride?
302
+
303
+ ```cpp
304
+ // BNSD: [Batch, NumHead, SeqLen, HeadDim]
305
+ // NBSD: [NumHead, Batch, SeqLen, HeadDim]
306
+ // 目标:将 N 轴提取到最外层
307
+
308
+ // 在 GM 上,NBSD 的相邻 batch 间隔为 batchSize * qSeqSize * headDim 字节
309
+ // 当前块写完后,下一个 N 的位置需要跳过 (batchSize * qSeqSize - s1Size) * headDim
310
+ dstStride = (batchSize * qSeqSize - s1Size) * headDim * sizeof(OUT_T) / 32U;
311
+ ```
312
+
313
+ ### Q3: TransposeBase16M8 和 TransposeBase16M16 如何选择?
314
+
315
+ | 数据类型 | 推荐转置类型 | 原因 |
316
+ |---------|------------|------|
317
+ | FP32 | TransposeBase16M8 | row 对齐 16,col 对齐 8(32B) |
318
+ | FP16/BF16 | TransposeBase16M16 | row 对齐 16,col 对齐 16(32B) |
319
+
320
+ ```cpp
321
+ if constexpr (is_same<TGrad, float>::value) {
322
+ TransposeBase16M8(gradTranUb, gradUb, params_.singleCoreNc, block_.dohowoAlign8);
323
+ } else {
324
+ TransposeBase16M16(gradTranUb, gradUb, params_.singleCoreNc, block_.dohowoAlign16);
325
+ }
326
+ ```
327
+
328
+ ### Q4: 迭代式算法中 Transpose Buffer 常驻的收益如何评估?
329
+
330
+ 收益 = 节省的 DMA 次数 × 每次 DMA 开销 - 额外 UB 占用成本
331
+
332
+ - 迭代次数 ≥ 3:通常收益明显
333
+ - 迭代次数 = 1:无收益,反而增加首尾转置开销
334
+ - buffer 大小 > UB 容量 50%:可能成为 tiling 瓶颈,需评估
335
+
336
+ ### Q5: 多维度复杂重排如何处理?
337
+
338
+ 单次 stride 搬运仅支持单维度转置。多维度重排需组合多次操作:
339
+
340
+ ```cpp
341
+ // 示例:[B, N, S, D] → [D, S, N, B]
342
+ // 步骤 1: [B, N, S, D] → [B, N, D, S] (S↔D 转置)
343
+ // 步骤 2: [B, N, D, S] → [N, B, D, S] (B↔N 转置)
344
+ // 步骤 3: [N, B, D, S] → [D, S, N, B] (复杂重排,可能需要 Gather)
345
+ ```
346
+
347
+ 对于复杂重排,考虑使用 Gather 指令或预先在 Host 端重组数据布局。
348
+
349
+ ## 8. 选型决策与自检清单
350
+
351
+ ### 8.1 选型决策
352
+
353
+ ```
354
+ if (算子输出需要布局转换):
355
+ → 启用 transpose_fusion
356
+
357
+ if (转换可表达为单维度 stride 跳写):
358
+ → 使用 DataCopy stride 参数零拷贝融合
359
+ → srcStride = 0(连读)
360
+ → dstStride = 跳步值(按目标布局计算)
361
+
362
+ if (存在头尾块边界不对齐):
363
+ → 头块/尾块单独 DataCopy,中间块 stride 跳写
364
+
365
+ else if (需要 UB 上向量化转置):
366
+ → 使用 TransDataTo5HD
367
+ → 选择 TransposeBase16M8 / 16M16 按数据类型
368
+ → 确保 row/col 满足对齐要求
369
+
370
+ else if (迭代式算法需行列交替访问):
371
+ → 使用 Transpose Buffer 常驻复用
372
+ → 评估迭代次数 ≥ 3 且 buffer 大小可控
373
+ → 首尾各一次转置,中间原地读写
374
+
375
+ else if (非最后一维 Gather):
376
+ → Transpose-Gather-ReTranspose 三步法
377
+ → 转置使 gather 维度连续
378
+
379
+ else:
380
+ → 使用独立 Transpose 算子或 Host 端预处理
381
+ else:
382
+ → 标准 DataCopy 连续写出
383
+ ```
384
+
385
+ ### 8.2 自检清单
386
+
387
+ - [ ] 转置通过 DataCopy stride 参数实现,非独立 Transpose 算子
388
+ - [ ] `srcStride = 0` 确保读取连续,最大化 MTE2 带宽
389
+ - [ ] `dstStride` 正确计算,按目标布局跳写
390
+ - [ ] DataCopyParams stride ≤ 65535,超限使用 DataCopyExtParams
391
+ - [ ] blockLen 单位正确(DataCopyParams 为 32B,DataCopyExtParams 为字节)
392
+ - [ ] 头尾块边界单独处理,保证输出正确性
393
+ - [ ] TransDataTo5HD 的 row/col 满足对齐要求(16/8/16)
394
+ - [ ] Transpose Buffer 常驻时,迭代次数 ≥ 3 且 UB 占用可控
395
+ - [ ] 变长序列场景动态获取 tSize/tBase,非固定长度假设
396
+ - [ ] TND 场景从 GM 读取 actualSeqLengths,评估额外读取开销
397
+ - [ ] 多维度重排评估是否可分解为多次单维度 stride 搬运
398
+ - [ ] 精度校验通过:与 naive Transpose 对比,数据一致性 100%