ops-tune-workbench-plugin 0.0.0-stage → 0.0.1-beta.2

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 (183) hide show
  1. package/NOTICE.md +14 -0
  2. package/README.md +39 -2
  3. package/cordis.patch.yml +20 -0
  4. package/lib/client.js +4253 -0
  5. package/lib/host.js +2518 -0
  6. package/package.json +53 -4
  7. package/skills/tool-ops-tune/INSTALL.md +52 -0
  8. package/skills/tool-ops-tune/README.md +167 -0
  9. package/skills/tool-ops-tune/SKILL.md +93 -0
  10. package/skills/tool-ops-tune/agent/AGENTS.md +195 -0
  11. package/skills/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
  12. package/skills/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
  13. package/skills/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
  14. package/skills/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
  15. package/skills/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
  16. package/skills/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
  17. package/skills/tool-ops-tune/docs/ops-tune-design.md +404 -0
  18. package/skills/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +714 -0
  19. package/skills/tool-ops-tune/docs//347/237/245/350/257/206/345/272/223/350/247/204/350/214/203.md +103 -0
  20. package/skills/tool-ops-tune/evals/evals.json +242 -0
  21. package/skills/tool-ops-tune/ops-collect/SKILL.md +146 -0
  22. package/skills/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
  23. package/skills/tool-ops-tune/ops-collect/scripts/collect_board.sh +444 -0
  24. package/skills/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
  25. package/skills/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
  26. package/skills/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
  27. package/skills/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
  28. package/skills/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1063 -0
  29. package/skills/tool-ops-tune/ops-collect/scripts/isolation_test.py +454 -0
  30. package/skills/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
  31. package/skills/tool-ops-tune/ops-family/SKILL.md +76 -0
  32. package/skills/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
  33. package/skills/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
  34. package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
  35. package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
  36. package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
  37. package/skills/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
  38. package/skills/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
  39. package/skills/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
  40. package/skills/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
  41. package/skills/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
  42. package/skills/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
  43. package/skills/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
  44. package/skills/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
  45. package/skills/tool-ops-tune/ops-family/references/common/index.md +9 -0
  46. package/skills/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
  47. package/skills/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
  48. package/skills/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
  49. package/skills/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
  50. package/skills/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
  51. package/skills/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
  52. package/skills/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
  53. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
  54. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
  55. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
  56. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
  57. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
  58. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
  59. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
  60. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
  61. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
  62. package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
  63. package/skills/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
  64. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
  65. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
  66. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
  67. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
  68. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
  69. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
  70. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
  71. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
  72. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
  73. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
  74. package/skills/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
  75. package/skills/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
  76. package/skills/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
  77. package/skills/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
  78. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
  79. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
  80. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
  81. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
  82. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
  83. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
  84. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
  85. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
  86. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
  87. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +86 -0
  88. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
  89. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
  90. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
  91. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
  92. package/skills/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
  93. package/skills/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
  94. package/skills/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
  95. package/skills/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
  96. package/skills/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
  97. package/skills/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
  98. package/skills/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
  99. package/skills/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
  100. package/skills/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
  101. package/skills/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
  102. package/skills/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
  103. package/skills/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
  104. package/skills/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
  105. package/skills/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
  106. package/skills/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
  107. package/skills/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
  108. package/skills/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
  109. package/skills/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
  110. package/skills/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
  111. package/skills/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
  112. package/skills/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
  113. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
  114. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
  115. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
  116. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
  117. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
  118. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
  119. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
  120. package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
  121. package/skills/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
  122. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
  123. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
  124. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
  125. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
  126. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
  127. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
  128. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
  129. package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
  130. package/skills/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
  131. package/skills/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
  132. package/skills/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
  133. package/skills/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
  134. package/skills/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
  135. package/skills/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
  136. package/skills/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
  137. package/skills/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
  138. package/skills/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
  139. package/skills/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
  140. package/skills/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
  141. package/skills/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
  142. package/skills/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
  143. package/skills/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
  144. package/skills/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
  145. package/skills/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
  146. package/skills/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
  147. package/skills/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
  148. package/skills/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
  149. package/skills/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
  150. package/skills/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
  151. package/skills/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
  152. package/skills/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
  153. package/skills/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
  154. package/skills/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
  155. package/skills/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
  156. package/skills/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
  157. package/skills/tool-ops-tune/ops-report/SKILL.md +77 -0
  158. package/skills/tool-ops-tune/ops-verdict/evals/run_evals.py +837 -0
  159. package/skills/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
  160. package/skills/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +405 -0
  161. package/skills/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
  162. package/skills/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
  163. package/skills/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
  164. package/skills/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
  165. package/skills/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
  166. package/skills/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
  167. package/skills/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
  168. package/skills/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
  169. package/skills/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
  170. package/skills/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
  171. package/skills/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
  172. package/skills/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
  173. package/skills/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
  174. package/skills/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
  175. package/skills/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
  176. package/skills/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +444 -0
  177. package/skills/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
  178. package/skills/tool-ops-tune/ops-verdict/scripts/delta_compare.py +244 -0
  179. package/skills/tool-ops-tune/ops-verdict/scripts/render_html.py +274 -0
  180. package/skills/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
  181. package/skills/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
  182. package/skills/tool-ops-tune/ops-verdict/scripts/verdict.py +1072 -0
  183. package/skills/tool-ops-tune/scripts/diff_audit.py +281 -0
@@ -0,0 +1,176 @@
1
+ # Transpose TilingData 结构与参数说明
2
+
3
+ 本文说明 Transpose 各 tiling 策略所用的 TilingData 结构体(POD blob,host 计算后原样拷入 kernel 的 `tiling` GM 参数)。结构体定义见 [`templates/transpose_tiling_data.template`](templates/transpose_tiling_data.template)。
4
+
5
+ ## 使用方式
6
+
7
+ 1. 根据实际入参(dtype、shape、perm),对照 [`guide.md`](guide.md) 策略速查表选择 tiling 策略。
8
+ 2. 直接引用 [`templates/dav3510/`](templates/dav3510/) 下对应策略的 kernel 模板文件(见下表映射),按需微调。
9
+ 3. host 侧计算 TilingData 时,参照本文各字段含义填充。
10
+
11
+ ## 策略 → kernel 模板 → TilingData 结构 映射
12
+
13
+ | 策略 | kernel 模板文件 | TilingData 结构 | 参考文档 |
14
+ |------|-------------|-----------------|----------|
15
+ | TENSOR_MOVE | `templates/dav3510/transpose_tensor_move.template` | `TransposeOpTilingData` | [transpose_tensor_move.md](transpose_tensor_move.md) |
16
+ | SMALL_SHAPE | `templates/dav3510/transpose_small_shape.template` | `TransposeOpTilingData` | [transpose_small_shape.md](transpose_small_shape.md) |
17
+ | CUT_ONCE | `templates/dav3510/transpose_cut_one_axis.template` | `TransposeOpTilingData` | [transpose_cut_one_axis.md](transpose_cut_one_axis.md) |
18
+ | CUT_TWICE | `templates/dav3510/transpose_cut_two_axis.template` | `TransposeOpTilingData` | [transpose_cut_two_axis.md](transpose_cut_two_axis.md) |
19
+ | N_LAST_TRANSPOSE | `templates/dav3510/transpose_n_last.template` | `TransposeOpTilingData` | [transpose_n_last.md](transpose_n_last.md) |
20
+ | BIG_DIM | `templates/dav3510/transpose_big_dim.template` | `TransposeOpTilingData` | [transpose_big_dim.md](transpose_big_dim.md) |
21
+ | GATHER_TRANSPOSE | `templates/dav3510/transpose_with_gather.template` | `GatherTransposeTilingData` | [transpose_gather.md](transpose_gather.md) |
22
+ | VCONV_TRANSPOSE (5HD) | `templates/dav3510/transpose_transdata_5hd.template` | `TransposeVCONVTilingData` | [transpose_vconv_5hd.md](transpose_vconv_5hd.md) |
23
+ | VCONV_021_TRANSPOSE | `templates/dav3510/transpose_transdata_5hd_021axis.template` | `Transpose021VCONVTilingData` | [transpose_vconv_021.md](transpose_vconv_021.md) |
24
+
25
+ > NDDMA 家族共用同一个 `TransposeOpTilingData`;加速策略(gather/vconv/021)各有独立结构。所有结构均 `#pragma pack(push, 8)` 8 字节对齐。
26
+
27
+ ## 外部依赖(CANN toolkit 头文件)
28
+
29
+ kernel 代码依赖以下 toolkit 头(不在本目录,由 CANN 环境提供):
30
+
31
+ - `kernel_operator.h` — AscendC 核心 API(TPipe/TQue/DataCopy 等)
32
+ - `op_kernel/platform_util.h`、`op_kernel/math_util.h` — 平台常量与 CeilDiv/FloorDiv 等
33
+ - `simt_api/asc_simt.h` — SMALL_SHAPE 的 SIMT 逐元素模型
34
+ - `reg_compute/kernel_reg_compute_datacopy_intf.h` — GATHER 的 MicroAPI/Reg 寄存器编程与 `DataCopyGatherImpl`(仅 dav-3510)
35
+
36
+ ---
37
+
38
+ ## 一、TransposeOpTilingData(NDDMA 家族)
39
+
40
+ NDDMA 家族把逻辑 shape 归约后对齐到固定 5 维(`NDDMA_MAX_DIM_NUM=5`),用带 stride 的多维 DMA 完成搬运 + 换轴。字段分四组。
41
+
42
+ ### 1.1 轴与切分基础
43
+
44
+ | 字段 | 类型 | 含义 |
45
+ |------|------|------|
46
+ | `permSize` | int64 | 归约后有效维数(perm 长度)。5 维扩展偏移 = `NDDMA_MAX_DIM_NUM - permSize`。 |
47
+ | `inCutIndex` | int64 | 输入方向切分轴下标(归约后坐标)。 |
48
+ | `outCutIndex` | int64 | 输出方向切分轴下标(归约后坐标)。CUT_TWICE 判定:`outCutIndex > FindOutIndex(inCutIndex)`。 |
49
+ | `inUbFactor` | int64 | 输入切分轴的 UB 分块因子(每块取多少元素)。 |
50
+ | `outUbFactor` | int64 | 输出切分轴的 UB 分块因子。 |
51
+ | `inTailFactor` | int64 | 输入切分轴尾块大小(`inCutAxisSize % inUbFactor`),0 表示无尾块。 |
52
+ | `outTailFactor` | int64 | 输出切分轴尾块大小,0 表示无尾块。 |
53
+ | `ubSize` | int64 | 本策略可用的 UB 字节数(已按 double buffer 等预留后的值)。 |
54
+
55
+ ### 1.2 多核切分
56
+
57
+ | 字段 | 类型 | 含义 |
58
+ |------|------|------|
59
+ | `realCoreNum` | int64 | 实际参与计算的核数(`blockIdx >= realCoreNum` 的核直接返回)。 |
60
+ | `blkFactor` | int64 | 每核处理的 NDDMA 块数(基础值)。 |
61
+ | `blkTailFactor` | int64 | 前 `blkTailFactor` 个核各多处理一块,用于均衡余数。见 `ParseMultiCoreRange`。 |
62
+ | `totalNddmaNum` | int64 | 总 NDDMA 块数(一维扁平编号总数),供多核均分。 |
63
+
64
+ ### 1.3 CUT_TWICE 的四类块区间(扁平 loopidx 边界)
65
+
66
+ 同时切两轴 → main/inputTail/outputTail/tail 四类块。区间边界由 host `GetIntervalInfoForCutTwice` 预算,kernel 用本核范围与之求交。仅当对应尾 factor 非 0 时区间存在。
67
+
68
+ | 字段 | 含义 |
69
+ |------|------|
70
+ | `rangeMainEnd` | main(两轴都取满)区间结束。 |
71
+ | `rangeInputTailStart` / `rangeInputTailEnd` | inputTail(输入取尾、输出取满)区间。 |
72
+ | `rangeOutputTailStart` / `rangeOutputTailEnd` | outputTail(输出取尾、输入取满)区间。 |
73
+ | `rangeTailStart` / `rangeTailEnd` | tail(两轴都取尾)区间。 |
74
+
75
+ ### 1.4 Shape 与 UB 布局数组
76
+
77
+ | 字段 | 长度 | 含义 |
78
+ |------|------|------|
79
+ | `inputShape` / `outputShape` | 8 | 归约后输入/输出逻辑 shape(`TRANSPOSE_MAX_AXIS_NUM_TD=8`)。 |
80
+ | `perm` | 8 | 归约后 perm。 |
81
+ | `baseInShape` | 8 | 输入各维的元素步长(后缀连乘),用于 GM 地址还原。 |
82
+ | `baseNddmaShape` / `nddmaIdx` | 5 | BIG_DIM 专用:折叠后 NDDMA 各维的基数与原始轴映射(见 `FlushBaseNumForBigDim`)。 |
83
+ | `expandedPerm` | 5 | 5 维扩展后的 perm(换轴 stride 依据)。 |
84
+ | `expandedInputShape` / `expandedOutputShape` | 5 | 5 维扩展后的输入/输出 shape。 |
85
+ | `inUbMainSrcShape` / `inUbMainDstShape` | 5 | main 块进/出 UB 的 5 维形状(src=读入布局,dst=换轴写回布局)。 |
86
+ | `inUbInputTailSrcShape` / `inUbInputTailDstShape` | 5 | inputTail 块的 UB src/dst 形状。 |
87
+ | `inUbOutputTailSrcShape` / `inUbOutputTailDstShape` | 5 | outputTail 块的 UB src/dst 形状。 |
88
+ | `inUbTailSrcShape` / `inUbTailDstShape` | 5 | tail 块的 UB src/dst 形状。 |
89
+
90
+ > TENSOR_MOVE / SMALL_SHAPE / N_LAST / CUT_ONCE / BIG_DIM 只用到与自身相关的子集,四类块的 UB 形状数组主要服务 CUT_TWICE;其余策略对应字段可能为 0 或退化值。
91
+
92
+ 外层封装 `TransposeTilingData { TransposeOpTilingData transposeOpTiling; }` 仅为与原始 layout 对齐,kernel 入口传 `&tilingData.transposeOpTiling`。
93
+
94
+ ---
95
+
96
+ ## 二、GatherTransposeTilingData(GATHER_TRANSPOSE)
97
+
98
+ 见 [`transpose_gather.md`](transpose_gather.md)。UB 内向量 gather 重排,MTE2/MTE3 两端连续大 burst。
99
+
100
+ ### 2.1 标量控制
101
+
102
+ | 字段 | 类型 | 含义 |
103
+ |------|------|------|
104
+ | `dataTensorSize` | uint32 | 单份 data buffer 字节数(×2 ping-pong ×2 in/out 后须放进 UB)。 |
105
+ | `indexTensorSize` | uint32 | gather index buffer 字节数(容纳所有相位的 index)。 |
106
+ | `usedCoreCnt` | uint32 | 实际用核数,要求 `>= coreNum/2` 否则该策略放弃。 |
107
+
108
+ ### 2.2 轴切分位置(int8 下标,-1 表示该方向不被切分)
109
+
110
+ | 字段 | 含义 |
111
+ |------|------|
112
+ | `blkAxesCnt` | block 轴数量(UB 分块之上、分给核的轴)。 |
113
+ | `blkInUbCutPos` / `blkOutUbCutPos` | 输入/输出切轴是否被 block 切分且除不尽(决定尾块相位是否存在)。 |
114
+ | `ubAxesCnt` | 进 UB 参与重排的轴数。 |
115
+ | `inUbInCutPos` / `inUbOutCutPos` | 输入侧在 UB 内的切分/连续边界位置。 |
116
+ | `outUbInCutPos` / `outUbOutCutPos` | 输出侧在 UB 内的切分/连续边界位置(`ubAxesCnt - outUbOutCutPos` = 需 gather 的维数,≤3)。 |
117
+
118
+ ### 2.3 分块因子与 stride
119
+
120
+ | 字段 | 类型 | 含义 |
121
+ |------|------|------|
122
+ | `blkFactor` / `blkTailFactor` | int64 | 每核 / 末核处理的 block 数。 |
123
+ | `inUbCutAxisSize` / `outUbCutAxisSize` | int64 | 输入/输出切轴的总大小。 |
124
+ | `inUbCutAxisFactor` / `outUbCutAxisFactor` | int32 | 输入/输出切轴的 UB 分块因子;尾块 = size % factor。 |
125
+ | `axis0/1/2InSrcStride` | int64 | MTE2 搬入的多层 GM 源步长(最多 3 层循环)。 |
126
+ | `axis0/1/2OutDstStride` | int64 | MTE3 搬出的多层 GM 目的步长。 |
127
+
128
+ ### 2.4 轴数组
129
+
130
+ | 字段 | 长度 | 含义 |
131
+ |------|------|------|
132
+ | `blkAxes` | 8 | 各 block 轴大小(`GATHER_MAX_TRANS_AXIS_NUM_TD=8`)。 |
133
+ | `blkAxesInAOffset` / `blkAxesOutAOffset` | 8 | 各 block 轴对应的输入/输出 GM 地址偏移基数(`CalcBlkAddr` 用)。 |
134
+ | `inUbAxes` / `outUbAxes` | 6 | UB 内输入/输出各轴大小(`GATHER_UB_MAX_DIM_NUM_TD=6`)。 |
135
+ | `ubPerm` | 6 | UB 内轴序(int8),生成 gather index 与循环用。 |
136
+
137
+ ---
138
+
139
+ ## 三、TransposeVCONVTilingData(VCONV_TRANSPOSE 5HD,仅 16bit)
140
+
141
+ 见 [`transpose_vconv_5hd.md`](transpose_vconv_5hd.md)。2D 末轴交换,片上 `TransDataTo5HD` 做 16×16 块转置。
142
+
143
+ 辅助结构 `CoreSplitPara`(核间切分:`AlignBlockFactor`/`BlockFactor`/`BlockCount`/尾块)与 `UbSplitPara`(UB 内切分:主核/尾核的 UB align/factor/count),被下表按 R/C 方向各引用一份。
144
+
145
+ | 字段 | 类型 | 含义 |
146
+ |------|------|------|
147
+ | `AvailableUbSize` | int64 | 可用 UB 字节数。 |
148
+ | `UsedCoreNum` | int64 | 实际用核数。 |
149
+ | `MainCoreLoopCount` / `TailCoreLoopCount` | int64 | 主核 / 尾核的 UB 循环次数。 |
150
+ | `RLen` / `CblkLen` | int64 | 转置矩阵的行(R)/列(C)长度。 |
151
+ | `RAlignBlock` / `CAlignBlock` | int64 | R/C 向 16 对齐后的块数。 |
152
+ | `RAlignBlockElem` / `CAlignBlockElem` | int64 | R/C 对齐后的元素数。 |
153
+ | `IsRSplit` / `IsRCSplit` | bool | 切分模式:仅切 R / R 和 C 都切(都为 false = 仅切 C)。三种模式覆盖不同 UB 容量。 |
154
+ | `rSplitPara` / `cSplitPara` | CoreSplitPara | R/C 方向的核间切分参数。 |
155
+ | `rUbSplitPara` / `cUbSplitPara` | UbSplitPara | R/C 方向的 UB 内切分参数。 |
156
+
157
+ ---
158
+
159
+ ## 四、Transpose021VCONVTilingData(VCONV_021_TRANSPOSE,支持 8/16/32bit)
160
+
161
+ 见 [`transpose_vconv_021.md`](transpose_vconv_021.md)。`perm=[0,2,1]` 保 batch 转置,按 batch 维循环 + `TransDataTo5HD`。
162
+
163
+ 辅助结构 `Transpose021UbSplitPara`(`UbAlignFactor`/`UbFactor`/`UbCount`/`UbTailAlignFactor`/`UbTailFactor`),被 R/C 方向各引用一份。
164
+
165
+ | 字段 | 类型 | 含义 |
166
+ |------|------|------|
167
+ | `AvailableUbSize` | int64 | 可用 UB 字节数。 |
168
+ | `UsedCoreNum` | int64 | 实际用核数。 |
169
+ | `NLen` / `HLen` / `WLen` | int64 | batch(N)/ 后两维 H / W 的长度。 |
170
+ | `HAlignBlockElem` / `WAlignBlockElem` | int64 | H/W 对齐后的元素数。 |
171
+ | `NPerCore` / `NTailCore` | int64 | 按 N 维多核切分时每核 / 尾核的 N 数。 |
172
+ | `UbLoopCount` | int64 | UB 循环次数。 |
173
+ | `UseRConv` | bool | H≥W 时为 true,选 R 为主转置轴(影响 R/C 主轴选择)。 |
174
+ | `UseHSplit` | bool | 是否按 H 维(而非 N 维)做多核切分。 |
175
+ | `HPerCore` / `HTailCore` | int64 | 按 H 切分时每核 / 尾核的 H 数。 |
176
+ | `rUbSplitPara` / `cUbSplitPara` | Transpose021UbSplitPara | R/C 方向的 UB 内切分参数。 |
@@ -0,0 +1,206 @@
1
+ # Transpose 021 TransData 策略性能调优参考
2
+
3
+ - **策略名**:VCONV_021_TRANSPOSE / 021 TransData(基于 `TransDataTo5HD`)
4
+ - **tilingKey**:`10008`
5
+ - **支持数据类型宽度**:8-bit(int8/uint8)、16-bit(half/bfloat16)、32-bit(float/int32)
6
+ - **kernel 类**:`Transpose::KernelTransDataTo5HD021<T>`(`arch35/transpose_transdata_5hd_021.h`)
7
+ - **host tiling**:`transpose_host::Transpose021WithVCONV::DoTiling`(`transpose_tiling_021.cpp/.h`)
8
+ - **命中判定**:`TransposeNddmaTiling::Is021VConvValid`(`transpose_tiling.cpp`)
9
+
10
+ ---
11
+
12
+ ## 一、适用场景
13
+
14
+ ### 1.1 什么是 021 转置
15
+
16
+ 021 指 `perm = [0, 2, 1]`:把一个三维张量 `[N, H, W]` 变换为 `[N, W, H]`。
17
+ 第 0 维(batch/N)保持不变,只交换后两维 H 与 W。它是标准的“逐 batch 的 2D 矩阵转置”,
18
+ 每个 batch 内部就是一个 `H × W → W × H` 的转置,batch 之间彼此独立。
19
+
20
+ 判定入口 `Is021VConvValid` 中的 perm 条件:
21
+
22
+ ```cpp
23
+ // reducedPerm[0]==0 && reducedPerm[1]==2 && reducedPerm[2]==1
24
+ if (!(shapeInfo_.reducedPerm[0] == 0 &&
25
+ shapeInfo_.reducedPerm[DIM_ONE] == VCONV_DIM_NUM /*=2*/ &&
26
+ shapeInfo_.reducedPerm[DIM_TWO] == 1)) {
27
+ return false;
28
+ }
29
+ ```
30
+
31
+ ### 1.2 为什么可以用 VCONV / TransData 加速
32
+
33
+ 朴素的转置是“逐元素散射/聚集”式的搬运,DMA stride 极不友好,带宽利用率低。
34
+ 昇腾提供了向量转置指令 `TransDataTo5HD`(俗称 VCONV / TransData),它在 UB 内一次性完成
35
+ 一个 `16 × blockElem` 分块的转置:以 16 行为一组、按数据块(block)为列粒度做硬件转置,
36
+ 把“逐元素搬运”变成“分块硬件转置 + 规整 DMA”,从而显著提升转置吞吐。
37
+
38
+ 其中每次转置处理的行数固定为 `TRANSELEM_021 = 16`,列粒度 `blockElem` 随位宽变化(一个 32B block 内的元素数):
39
+
40
+ ```cpp
41
+ static constexpr int64_t blockElem = (sizeof(T) == 1) ? 32 : // 8-bit
42
+ (sizeof(T) == 4) ? 8 : // 32-bit
43
+ 16; // 16-bit
44
+ ```
45
+
46
+ ### 1.3 与 5HD 策略(10007)的区别
47
+
48
+ | 项 | 5HD VCONV(tilingKey=10007) | 021 TransData(tilingKey=10008) |
49
+ |---|---|---|
50
+ | perm | 2D 末轴交换 `[1,0]` | 3D 保 batch `[0,2,1]` |
51
+ | 维度 | `dim == 2` | `dim == 3` |
52
+ | 支持位宽 | 仅 16-bit(派发处 `sizeof(T)==sizeof(int16_t)` 才实例化) | **8/16/32-bit 全支持** |
53
+
54
+ 派发入口 `transpose_kernel.cpp`:
55
+
56
+ ```cpp
57
+ } else if (tilingKey == VCONV_021_TRANSPOSE) { // 10008
58
+ // 021 VCONV kernel supports 8/16/32-bit element widths.
59
+ if constexpr (sizeof(T) == sizeof(int8_t) || sizeof(T) == sizeof(int16_t) ||
60
+ sizeof(T) == sizeof(int32_t)) {
61
+ Transpose021VCONVTilingData lt; LoadTiling(tiling, lt);
62
+ Transpose::KernelTransDataTo5HD021<T> op;
63
+ op.Init(x, y, &lt, &pipe);
64
+ op.Process();
65
+ }
66
+ }
67
+ ```
68
+
69
+ 021 策略针对不同位宽在 kernel 内走了不同分支:8-bit 走 `Compute8BitCore`(奇偶行拆分 + high/low half 处理),
70
+ 16/32-bit 走 `ComputeRConvGeneric` / `ComputeCConvGeneric`(32-bit 额外用 `dstStrideFactor=2` 处理跨 block)。
71
+
72
+ ### 1.4 命中条件(`Is021VConvValid`)
73
+
74
+ 除 perm=[0,2,1] 与 `dim==3` 外,还需同时满足:
75
+
76
+ - 位宽为 8 / 16 / 32-bit(`eleLenInBytes` ∈ {1,2,4})。
77
+ - `H > 8` 且 `W > 8`(`DIM_EIGHT`),过滤掉极小边长。
78
+ - `H * W >= HW_MIN_PRODUCT`(转置面积下限)。
79
+ - 有效元素占对齐后面积比例不能太低:`H*W > hAlign*wAlign/2`(`hAlign/wAlign` 按 16 对齐),
80
+ 避免为凑对齐引入过多 padding 浪费。
81
+ - 总字节量 `totalVolumeActual * eleLenInBytes >= 70000`(`SMALL_SHAPE_BYTES_THRES_HOLD_DAV_5102_021`),
82
+ 小 shape 不走此路径(启动/搬运开销占比过高,收益不足)。
83
+
84
+ ### 1.5 为什么能提升性能
85
+
86
+ - 用硬件向量转置指令替代逐元素搬运,UB 内转置吞吐高。
87
+ - CopyIn/CopyOut 均通过 `DataCopyPad` 做规整的分块 DMA,配合 stride 参数直接完成 gap/padding 处理。
88
+ - 多核按 batch(N)或按 H 切分并行,见 1.6。
89
+ - Double buffer(`BUFFER_NUM=2`)流水,搬入/计算/搬出重叠。
90
+ - 命中门槛(面积、字节量、对齐利用率)保证只在收益为正的 shape 上启用。
91
+
92
+ ---
93
+
94
+ ## 二、kernel 执行流程与关键实现
95
+
96
+ ### 2.1 host tiling 关键决策(`transpose_tiling_021.cpp`)
97
+
98
+ `CalcBasicInfo` 计算基本量后有三个关键开关:
99
+
100
+ - **`UseRConv = (HLen >= WLen)`**:H 不小于 W 时以 “R(行/H)为转置主轴” 走 `ComputeRConv`;
101
+ 否则以 “C(列/W)为主轴” 走 `ComputeCConv`。目的是让 `repeatTimes` 落在较大的那一维,提高单次指令效率。
102
+ - **`UseHSplit`**:当 `NLen < 5 && !UseRConv && HLen >= NLen*16` 时启用“按 H 切分多核”,
103
+ 用于 batch 数很少、H 很大的场景把并行度提上去;注意 `CalcUbSplitHSplit` 中 8-bit 直接 `return false`(HSplit 不支持 8-bit)。
104
+ - **UB 切分**:`AvailableUbSize = ubSize/2/BUFFER_NUM`。分 `CalcUbSplitRConv` / `CalcUbSplitCConv` / `CalcUbSplitHSplit`:
105
+ 若整块 `HAlign*WAlign` 能放进 UB 则 `UbLoopCount=1`(不切分);否则沿主轴切成多份 UB loop。
106
+ 若连一个 `TRANSELEM(16) × 对齐边` 都放不下,则 tiling 失败返回 false(回退其它策略)。
107
+
108
+ 多核切分:非 HSplit 时 `CalcNSplitInfo` 按 N 均分(`NPerCore` + 尾核 `NTailCore`);
109
+ HSplit 时 `CalcHSplitInfo` 按 H 对齐后均分(`HPerCore` + `HTailCore`)。`tilingKey` 固定写为 10008,`blockDim = UsedCoreNum`。
110
+
111
+ 最终参数写入 `Transpose021VCONVTilingData`(含 `rUbSplitPara` / `cUbSplitPara` 两组 UB 切分因子)。
112
+
113
+ ### 2.2 Init
114
+
115
+ ```cpp
116
+ srcGlobal / dstGlobal 绑定 GM 输入输出;
117
+ if (UseHSplit) { 按 blockIdx 分配 hStart_/hCount_,nStart_=0, nCount_=NLen }
118
+ else { 按 blockIdx 分配 nStart_/nCount_(区分整核/尾核) }
119
+ pipe->InitBuffer(inQueueSrc, BUFFER_NUM, AvailableUbSize);
120
+ pipe->InitBuffer(outQueueDst, BUFFER_NUM, AvailableUbSize);
121
+ ```
122
+
123
+ 两条 TQue:`inQueueSrc`(VECIN) / `outQueueDst`(VECOUT),各 `BUFFER_NUM=2` 块,形成 double buffer。
124
+
125
+ ### 2.3 Process 主循环
126
+
127
+ ```mermaid
128
+ flowchart TD
129
+ A[Process] --> B{blockIdx >= UsedCoreNum?}
130
+ B -->|是| Z[return 空转核]
131
+ B -->|否| C{UseHSplit?}
132
+ C -->|是| D[for n in 0..nCount_:<br/>ProcessOneBatchHSplit n]
133
+ C -->|否| E[for n in 0..nCount_:<br/>ProcessOneBatch nStart_+n]
134
+ D --> F[每 batch: for ubLoop in UbLoopCount]
135
+ E --> F
136
+ F --> G[CopyIn]
137
+ G --> H[Compute]
138
+ H --> I[CopyOut]
139
+ ```
140
+
141
+ `ProcessOneBatch` / `ProcessOneBatchHSplit` 内部按 `UbLoopCount` 循环,最后一次 loop 使用尾块因子
142
+ (`UbTailFactor` / `UbTailAlignFactor`),其余用整块因子(`UbFactor` / `UbAlignFactor`)。
143
+ 每次 loop 都是 `CopyIn → Compute → CopyOut` 三段式,天然被 double buffer 流水化。
144
+
145
+ ### 2.4 CopyIn:GM → UB
146
+
147
+ 用 `DataCopyPad` + `DataCopyExtParams copyInParams_` 搬入。根据 W 是否对齐(`WLen % wAlignCheck`,
148
+ 8-bit 检查 `blockElem`,其余检查 16)分两条路:
149
+
150
+ - **`CopyInWAligned`**:W 对齐时尽量整段搬(`blockCount=1`),或按行搬(`blockCount=actualValidRows`)设置行间 `srcStride`。
151
+ - **`CopyInWUnaligned`**:W 非对齐时逐行搬有效宽度 `validW`,用 `dstStride` 在 UB 内补齐到对齐宽度(`WAlignBlockElem`)。
152
+
153
+ `UseRConv` 时按 `rUbSplitPara` 偏移并计算 `actualValidRows`(防越界取 `min`);否则按 `cUbSplitPara` 偏移。
154
+
155
+ ### 2.5 Compute:UB 内 TransDataTo5HD 转置
156
+
157
+ `Compute` 按 `UseRConv` 分派到 `ComputeRConv` / `ComputeCConv`;两者再按位宽分派:
158
+
159
+ - **8-bit → `Compute8BitCore`**:关键在于 8-bit 一个 block 有 32 个元素而转置组只有 16 行,
160
+ 故把 32 行拆成 **偶数组 / 奇数组**(`evenUbCount`/`oddUbCount`),并借助 `srcHighHalf`(low/high half)
161
+ 两次遍历完成一个 `32-elem block` 的转置;组间用 `PipeBarrier<PIPE_V>()` 保证依赖顺序。
162
+ - **16-bit → `ComputeRConvGeneric` / `ComputeCConvGeneric`**:构造 `srcList[16]` / `dstList[16]` 地址表,
163
+ 设置 `repeatTimes / srcRepStride / dstRepStride` 后调用 `TransDataTo5HD<T>`,沿 `cAlign`(或 `rAlign`)循环。
164
+ - **32-bit → 同上 Generic 分支但走 `dstStrideFactor=2` 路径**:32-bit 一个 block 只有 8 个元素,
165
+ 转置目的地址需按 `dstStrideFactor` 拆成两半(`dstList[2k]` / `dstList[2k+1]` 分别指向 block 内前后段),
166
+ 正确处理 16 行跨两个 32-bit block 的排布。
167
+
168
+ `ComputeRConv` 与 `ComputeCConv` 的区别在于把 `repeatTimes` 放在 R 还是 C 方向,
169
+ 以及 `srcRepStride/dstRepStride` 的取值(`repeatTimes==1` 时 stride 置 0)。
170
+
171
+ 指令使用示意(16-bit Generic 分支):
172
+
173
+ ```cpp
174
+ TransDataTo5HDParams p;
175
+ p.repeatTimes = r / TRANSELEM_021; // 16 行一组
176
+ p.dstRepStride = (p.repeatTimes == 1) ? 0 : dstStrideFactor;
177
+ p.srcRepStride = (p.repeatTimes == 1) ? 0 : cAlign * TRANSELEM_021;
178
+ for (j = 0; j < cAlign; j++) {
179
+ for (i = 0; i < 16; i++) srcLocalList[i] = srcLocal[i*c + j*blockElem].GetPhyAddr();
180
+ // 组装 dstLocalList[16] ...
181
+ TransDataTo5HD<T>(dstLocalList, srcLocalList, p);
182
+ }
183
+ ```
184
+
185
+ 计算前 `DeQue<T>` 取输入、`AllocTensor<T>` 取输出,计算后 `EnQue` 输出并 `FreeTensor` 释放输入。
186
+
187
+ ### 2.6 CopyOut:UB → GM
188
+
189
+ 同样用 `DataCopyPad` + `copyOutParams_`,按 H、W 是否都对齐分 `CopyOutAligned` / `CopyOutUnaligned`:
190
+
191
+ - 转置后维度变为 `[W, H]`,故 `dstStride` 以 `HLen` 为行跨度回填 GM。
192
+ - `UseRConv` 与否影响 `blockCount/blockLen`(整段 vs 逐列),非对齐时用 `validLen/validCount` 裁掉 padding。
193
+ - HSplit 走独立的 `CopyInHSplit` / `CopyOutHSplit`,按 `hStart_` 定位 GM 的 H 段。
194
+
195
+ ### 2.7 关键技术小结(均以代码为准)
196
+
197
+ - **`TransDataTo5HD` 向量转置指令**:16 行一组的硬件分块转置,是加速核心。
198
+ - **Double buffer**:`BUFFER_NUM=2`,`InitBuffer` 分配双缓冲,CopyIn/Compute/CopyOut 流水重叠。
199
+ - **TQue 管理**:`inQueueSrc`(VECIN) / `outQueueDst`(VECOUT),`AllocTensor/EnQue/DeQue/FreeTensor` 生命周期管理。
200
+ - **`PipeBarrier<PIPE_V>()`**:仅在 8-bit 奇偶组/half 切换处插入,保证 vector 转置的写后读依赖。
201
+ - **R/C 主轴自适应**:`UseRConv = HLen>=WLen`,让 repeat 落在较长维度。
202
+ - **位宽自适应**:`blockElem`(32/16/8)、`dstStrideFactor`(32-bit=2) 按 `sizeof(T)` 编译期确定。
203
+ - **多核切分**:N 切分为主;batch 少而 H 大时切换 H 切分(HSplit,不支持 8-bit)。
204
+ - **`DataCopyPad` + stride**:搬运阶段直接处理对齐 gap 与 padding,避免额外 pad 计算指令。
205
+
206
+ > 注意:文中未出现的技术(如 MTE/L1 缓存、mask、reduce 等)本策略并未使用,请勿据此推断。
@@ -0,0 +1,179 @@
1
+ # Transpose 策略参考:VCONV_TRANSPOSE / 5HD TransData
2
+
3
+ - **策略名**:VCONV_TRANSPOSE(5HD TransData 向量转置)
4
+ - **tilingKey**:`10007`
5
+ - **kernel 类**:`Transpose::KernelTransDataTo5HD<T>`(`arch35/transpose_transdata_5hd.h`)
6
+ - **重要约束**:**仅支持 16bit 元素宽度**(`eleLenInBytes == 2`,如 fp16/bf16/int16)。派发处用 `if constexpr (sizeof(T) == sizeof(int16_t))` 保护;host 侧命中条件也强制 `eleLenInBytes == VCONV_DSIZE(=2)`。
7
+
8
+ ---
9
+
10
+ ## 一、适用场景
11
+
12
+ ### 1.1 什么是 5HD / VCONV 转置
13
+
14
+ 本策略把一次「二维矩阵转置」映射到 AscendC 的向量转置指令 `TransDataTo5HD` 上完成。`TransDataTo5HD` 原本用于 ND 与 5HD(NC1HWC0)之间的格式转换,其硬件本质是在 Vector 单元内对一个 **16 × 16 的元素块**做转置。由于每个 16bit 元素恰好让一个 block(32B)容纳 16 个元素,16×16 的方块转置可以被向量单元一条指令高效吞掉,因此把整块矩阵拆成若干 16×16 子块,逐块调用 `TransDataTo5HD` 即可完成整体转置。
15
+
16
+ 相比走 DMA/NDDMA 的搬运式转置,VCONV 路径把转置计算放在片上 UB 中由 Vector 单元完成,搬入搬出都是**连续或规则跨步**的 `DataCopyPad`,避免了细粒度、非连续的 GM 随机访问,因此在命中场景下带宽利用率更高。
17
+
18
+ ### 1.2 为什么 2D 末轴交换的 16bit 数据能用 VCONV 加速
19
+
20
+ - **16×16 块对齐天然契合 16bit**:`TransDataTo5HD` 一次处理 16 行 × 16 列。16bit 元素下,16 个元素 = 32B = 1 个 UB block,转置后的写出也天然对齐,无需额外的位宽拼接/拆分。这也是它只支持 16bit 的原因。
21
+ - **末轴交换 (perm=[1,0]) 即纯二维转置**:输入 `[R, C]` 输出 `[C, R]`,访问模式规整,能整齐地切成 16×16 网格。
22
+ - **性能收益来源**:
23
+ - 转置在片上完成,GM 侧读写是大块连续搬运(`DataCopyPad` 带规则 stride),而非逐元素散读。
24
+ - 借助 `TQue` 双缓冲(`BUFFER_NUM = 2`),搬入 / 计算 / 搬出三级流水互相掩盖。
25
+ - 多核按 16 行/列块粒度均分,充分利用全部 AI Core。
26
+
27
+ ### 1.3 命中条件(host 侧 `TryVCONVTiling`)
28
+
29
+ 在 `transpose_tiling.cpp` 的 `TryVCONVTiling` 中,同时满足以下条件才进入本策略(`transpose_tiling_5hd.cpp` 的 `DoTiling`):
30
+
31
+ ```cpp
32
+ shapeInfo_.reducedPerm[0] == 1 && shapeInfo_.reducedPerm[1] == 0 && // 二维末轴交换
33
+ shapeInfo_.dim == VCONV_DIM_NUM (== 2) && // reduce 后为 2D
34
+ shapeInfo_.eleLenInBytes == VCONV_DSIZE (== 2) && // 16bit
35
+ shapeInfo_.reducedInShape[0] > DIM_FIVE (> 5) // R 轴长度 > 5
36
+ ```
37
+
38
+ 即:经过 `RemoveAxisV2` / `MergeAxisV2` 归约后是一个二维、末轴交换、16bit、且 R(第 0 轴)长度大于 5 的转置。`R > 5` 用于排除过小的 shape(此类小 shape 交给通用路径更划算)。若 `DoTiling` 因 UB 放不下(见下文 `CalcRCNotFullLoadUbSplitInfo` 的失败分支)返回 false,则回退到其他策略。
39
+
40
+ ---
41
+
42
+ ## 二、Tiling 切分逻辑(host 侧)
43
+
44
+ 记输入为 `[R=RLen, C=CblkLen]`。以下常量:`TRANSELEM = 16`(块边长),`BUFFER_NUM = 2`(双缓冲),`BUFFER_TENSOR_NUM = 2`(输入+输出各一块)。
45
+
46
+ ### 2.1 基础信息 `CalcBasicInfo`
47
+
48
+ ```cpp
49
+ AvailableUbSize = ubSize / BUFFER_TENSOR_NUM / BUFFER_NUM; // 单块可用 UB (in/out 各一块、双 buffer)
50
+ RAlignBlock = CeilDiv(RLen, 16); RAlignBlockElem = RAlignBlock * 16; // R 向上对齐到 16
51
+ CAlignBlock = CeilDiv(CblkLen, 16); CAlignBlockElem = CAlignBlock * 16; // C 向上对齐到 16
52
+ ```
53
+
54
+ 即把 R、C 都向上对齐到 16 的倍数,按 16×16 块组织。
55
+
56
+ ### 2.2 三种切分模式(`CalcBlockAndUbSplitInfo`)
57
+
58
+ 按「哪一维能在 UB 内整列/整行放下」决定核间切分维与 UB 内切分维:
59
+
60
+ | 判断条件 | 核切分维 | UB 全载维 | 标志 |
61
+ |---|---|---|---|
62
+ | `16 * CAlignBlockElem * 2 <= AvailableUbSize` | R 轴切核 (`CalcRSplitInfo`) | C 全载 (`CalcCFullLoadRUbSplitInfo`) | `IsRSplit=true` |
63
+ | 否则若 `16 * RAlignBlockElem * 2 <= AvailableUbSize` | C 轴切核 (`CalcCSplitInfo`) | R 全载 (`CalcRFullLoadCUbSplitInfo`) | `IsRSplit=false` |
64
+ | 否则(两维都放不下一个 16 条带) | R 轴切核 | R、C 均需再切 (`CalcRCNotFullLoadUbSplitInfo`) | `IsRCSplit=true` |
65
+
66
+ - **R-split / C 全载**:一次处理若干整行(R 方向,16 的倍数),C 方向整列全载。若 `BlockFactor 行 × C 全载` 一次装不下 UB,则进一步按 `MainCoreUbFactor` 沿 R 分多个 UB 循环(`MainCoreLoopCount`)。
67
+ - **C-split / R 全载**:对称地,一次处理若干整列,R 全载,必要时沿 C 分 UB 循环。
68
+ - **RC 双切 (`IsRCSplit`)**:R、C 都装不下时,核间按 R 切,UB 内先固定 R 的 `BlockFactor`,再沿 C 用 `MainCoreUbFactor` 分块循环。若连 `BlockFactor(16行) × 16 × 2B` 都超过 `AvailableUbSize`,`CalcRCNotFullLoadUbSplitInfo` 返回 false,`DoTiling` 失败并回退到其它策略。
69
+
70
+ 核间切分(`CalcRSplitInfo` / `CalcCSplitInfo`)以 16 对齐块为单位在 `coreNum` 个核间均分,得到主核 `BlockFactor` 与尾核 `BlockTailFactor`,`UsedCoreNum = BlockCount`。UB 内切分则用 `MainCore*` / `TailCore*` × (`Ub` / `TailUb`) 一套四组因子覆盖「主核/尾核 × 主UB循环/尾UB循环」的所有边界。这些因子最终由 `WriteTilingData` 写入 `TransposeVCONVTilingData`(结构见 `transpose_tiling_data.h`:`rSplitPara/cSplitPara` 为 `CoreSplitPara`,`rUbSplitPara/cUbSplitPara` 为 `UbSplitPara`)。
71
+
72
+ ---
73
+
74
+ ## 三、Kernel 执行流程与关键实现
75
+
76
+ ### 3.1 Init
77
+
78
+ ```cpp
79
+ blockIdx_ = GetBlockIdx();
80
+ fullCoreNum = UsedCoreNum - 1; // [0, fullCoreNum-1] 主核, 其余尾核
81
+ loopCount = (blockIdx_ <= fullCoreNum-1) ? MainCoreLoopCount : TailCoreLoopCount;
82
+ isRsplit = IsRSplit; isRCSplit = IsRCSplit;
83
+ pipe->InitBuffer(inQueueSrc, BUFFER_NUM, AvailableUbSize); // VECIN 双缓冲
84
+ pipe->InitBuffer(outQueueDst, BUFFER_NUM, AvailableUbSize); // VECOUT 双缓冲
85
+ ```
86
+
87
+ 用两条 `TQue`(`TPosition::VECIN` / `VECOUT`),各开 `BUFFER_NUM=2` 块,实现搬入/计算/搬出的 double buffer 流水。
88
+
89
+ ### 3.2 Process 主循环
90
+
91
+ ```mermaid
92
+ flowchart TD
93
+ A[Process] --> B{blockIdx_ >= UsedCoreNum?}
94
+ B -- 是 --> Z[空转返回]
95
+ B -- 否 --> C{blockIdx_ < fullCoreNum?}
96
+ C -- 主核 --> D[loop i in 0..loopCount]
97
+ C -- 尾核 --> E[loop i in 0..loopCount]
98
+ D --> F{i < loopCount-1?}
99
+ F -- 是 --> G[BaseProcess: MainCoreUbFactor]
100
+ F -- 否/尾UB --> H[BaseProcess: MainCoreTailUbFactor]
101
+ E --> I{i < loopCount-1?}
102
+ I -- 是 --> J[BaseProcess: TailCoreUbFactor]
103
+ I -- 否/尾UB --> K[BaseProcess: TailCoreTailUbFactor]
104
+ ```
105
+
106
+ `Process` 依据「主核/尾核」× 「主 UB 循环/尾 UB 循环」四种组合,取对应的 `r/c/rAlign/cAlign` 因子,先 `SetBasePocessData` 算出本次的 GM/UB 偏移,再走 `BaseProcess`。多余核(`blockIdx_ >= UsedCoreNum`)直接返回。
107
+
108
+ ### 3.3 BaseProcess:搬入 → 计算 → 搬出
109
+
110
+ ```cpp
111
+ BaseProcess(process, r, c, rAlign, cAlign) {
112
+ BaseCopyIn(process); // DataCopyPad: GM -> inQueueSrc
113
+ BaseCompute(r, c, rAlign, cAlign);// TransDataTo5HD 转置
114
+ BaseCopyOut(process); // DataCopyPad: outQueueDst -> GM
115
+ }
116
+ ```
117
+
118
+ - **BaseCopyIn**:`AllocTensor` → `SetCopyInParams`(按 `isRCSplit/isRsplit/否` 分派为 `SetRCSplitCopyInParams` / `SetRSplitCopyInParams` / `SetCSplitCopyInParams`,分别设置 `blockCount / blockLen / srcStride`)→ `DataCopyPad(srcLocal, srcGlobal[gmOffset+copyInCoreOffset], Params, padParams)` → `EnQue`。注意 `SetRSplitCopyInParams` 对 `CblkLen % 16 == 0` 走单块连续搬运,否则按行 `blockCount` 搬运。
119
+ - **BaseCopyOut**:对称,`SetCopyOutParams` 分派设置写回的 `blockCount/blockLen/dstStride`,`DataCopyPad` 写回 `dstGlobal`。
120
+
121
+ ### 3.4 核心计算:`TransDataTo5HD` 16×16 块转置
122
+
123
+ `BaseCompute` 按 `r >= c` 选择两条对称路径:
124
+
125
+ ```cpp
126
+ if (r >= c) ComputeRConv(r, c, cAlign); // 沿 C 方向循环转置
127
+ else ComputeCConv(r, c, rAlign); // 沿 R 方向循环转置
128
+ ```
129
+
130
+ **`ComputeRConv`(r ≥ c)**关键实现:
131
+
132
+ ```cpp
133
+ TransDataTo5HDParams p;
134
+ p.repeatTimes = r / 16; // 一次处理 r/16 个 16 行块
135
+ p.dstRepStride = (p.repeatTimes == 1) ? 0 : 1;
136
+ p.srcRepStride = (p.repeatTimes == 1) ? 0 : cAlign * 16;
137
+ for (int j = 0; j < cAlign; j++) { // 沿列方向 16 列一组
138
+ LocalTensor<T> srcLocalList[16], dstLocalList[16];
139
+ for (int i = 0; i < 16; i++)
140
+ srcLocalList[i] = srcLocal[i * c + j * 16]; // 源 16 行地址
141
+ for (int i = 0; i < 16; i++)
142
+ dstLocalList[i] = dstLocal[i * r + j * 16 * r]; // 目的地址(已转置布局)
143
+ TransDataTo5HD(dstLocalList, srcLocalList, p);
144
+ }
145
+ ```
146
+
147
+ - 每次 `TransDataTo5HD` 处理一个 16 列宽、`repeatTimes` 个 16 行块的条带,把该条带内每个 16×16 方块转置。`srcLocalList[16]` / `dstLocalList[16]` 是 16 个行指针(高低半 `dstHighHalf/srcHighHalf` 均 false)。
148
+ - `srcRepStride = cAlign*16` 让 repeat 在源上跳过整行对齐宽度;`dstRepStride = 1` 让转置结果落到目的的连续块位置。目的偏移 `i*r + j*16*r` 体现「转置后行列互换」的地址布局。
149
+ - `ComputeCConv` 与之对称(`repeatTimes = c/16`,`dstRepStride = rAlign*16`,`srcRepStride = 1`,外层沿 `rAlign` 循环)。选择 `r>=c` 与否是为了让 `repeatTimes` 取较大的那一维,减少外层循环次数、提升单条指令的吞吐。
150
+
151
+ 计算完 `outQueueDst.EnQue(dstLocal)` 并 `inQueueSrc.FreeTensor(srcLocal)`,交回给 double buffer 流水。
152
+
153
+ ### 3.5 关键技术小结
154
+
155
+ - **向量转置指令 `TransDataTo5HD`**:片上 16×16 块转置,是本策略性能核心;16bit 元素与 16-block 对齐是其使用前提。
156
+ - **16×16 分块 + 16 对齐**:R、C 向上对齐到 16,按块组织搬运与转置。
157
+ - **Double buffer**:`inQueueSrc` / `outQueueDst` 各 `BUFFER_NUM=2`,搬入/计算/搬出流水掩盖。
158
+ - **`TQue` (VECIN/VECOUT)** 管理 UB 张量生命周期(`AllocTensor/EnQue/DeQue/FreeTensor`)。
159
+ - **`DataCopyPad` 规则搬运**:配合 `CoreSplitPara/UbSplitPara` 的 stride 参数,GM 侧读写为大块规则搬运而非散读。
160
+ - **三种切分(RSplit / CSplit / RCSplit)** 覆盖 C 全载、R 全载、双切三类 UB 容量场景,主核/尾核 + 主UB/尾UB 因子处理所有边界。
161
+
162
+ ---
163
+
164
+ ## 附:tilingKey 与派发
165
+
166
+ `transpose_kernel.cpp` 中:
167
+
168
+ ```cpp
169
+ } else if (tilingKey == VCONV_TRANSPOSE /* 10007 */) {
170
+ if constexpr (sizeof(T) == sizeof(int16_t)) { // 仅 16bit 实例化
171
+ TransposeVCONVTilingData lt; LoadTiling(tiling, lt);
172
+ Transpose::KernelTransDataTo5HD<T> op;
173
+ op.Init(x, y, &lt, &pipe);
174
+ op.Process();
175
+ }
176
+ }
177
+ ```
178
+
179
+ 注意:tilingKey 10008 (`VCONV_021_TRANSPOSE`) 是相邻的 021 三维 VCONV 策略(支持 8/16/32bit),与本文的 10007 是不同 kernel(`KernelTransDataTo5HD021`),不要混淆。