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

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,324 @@
1
+ /**
2
+ * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3
+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4
+ * CANN Open Software License Agreement Version 2.0 (the "License").
5
+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7
+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8
+ * See LICENSE in the root of the software repository for the full text of the License.
9
+ */
10
+
11
+ /* !
12
+ * \file softmax_v2_ara_online.h
13
+ * \brief SoftmaxV2 ARA 布局的 Online Softmax 模板。
14
+ *
15
+ * 数据布局 [A1, R, A0],softmax 沿 R 轴。相比 ARA Recompute(输入读 3 次:max/sum/output),
16
+ * Online Softmax 将 max 与 sum 融合为单遍在线更新(维护 running max / running sum),
17
+ * 输入只需读 2 次(1 遍在线 max+sum,1 遍输出),减少一次 R 全量搬入。
18
+ *
19
+ * 在线更新公式(沿 R 分 chunk,按 A0 列独立维护 running 状态):
20
+ * m_new = max(m_old, chunk_max)
21
+ * corr = exp(m_old - m_new)
22
+ * l_new = l_old * corr + Σ_row exp(x - m_new)
23
+ * 最终 softmax(x) = exp(x - m_final) / l_final
24
+ */
25
+
26
+ #ifndef SOFTMAX_V2_ARA_ONLINE_H
27
+ #define SOFTMAX_V2_ARA_ONLINE_H
28
+
29
+ #include "kernel_tiling/kernel_tiling.h"
30
+
31
+ #include "kernel_operator.h"
32
+ #include "softmax_v2_base.h"
33
+
34
+ namespace SoftmaxV2Ops
35
+ {
36
+ using namespace AscendC;
37
+ using namespace AscendC::MicroAPI;
38
+
39
+ using AscendC::MicroAPI::LoadDist;
40
+ using AscendC::MicroAPI::MaskMergeMode;
41
+ using AscendC::MicroAPI::MaskReg;
42
+ using AscendC::MicroAPI::RegTensor;
43
+ using AscendC::MicroAPI::StoreDist;
44
+
45
+ template <typename T1, typename T2>
46
+ class SoftmaxV2ARAOnline : public SoftmaxV2OpsBase
47
+ {
48
+ static constexpr int32_t BUFFER_NUM = 2;
49
+
50
+ static constexpr uint16_t VECTOR_LENGTH = GetVRegSize();
51
+ static constexpr uint32_t VL_FP32 = VECTOR_LENGTH / sizeof(float);
52
+ static constexpr int64_t BLOCK_SIZE = GetUbBlockSize();
53
+
54
+ public:
55
+ __aicore__ inline SoftmaxV2ARAOnline(){};
56
+
57
+ __aicore__ inline SoftmaxV2ARAOnline(const SoftmaxV2ARAOnlineTilingData* tilingDataIn)
58
+ {
59
+ tilingData_ = tilingDataIn;
60
+ }
61
+
62
+ __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, TPipe* pipeIn)
63
+ {
64
+ pipe_ = pipeIn;
65
+
66
+ xGm_.SetGlobalBuffer((__gm__ T1*)x);
67
+ yGm_.SetGlobalBuffer((__gm__ T2*)y);
68
+
69
+ int64_t xShapeLen = tilingData_->tileA0Len * tilingData_->rChunkFactor;
70
+ pipe_->InitBuffer(xQueue_, BUFFER_NUM, xShapeLen * sizeof(T1));
71
+ pipe_->InitBuffer(yQueue_, BUFFER_NUM, xShapeLen * sizeof(float));
72
+
73
+ pipe_->InitBuffer(xMaxBuf_, tilingData_->tileA0Len * sizeof(float));
74
+ pipe_->InitBuffer(xSumBuf_, tilingData_->tileA0Len * sizeof(float));
75
+ }
76
+
77
+ __aicore__ inline void Process()
78
+ {
79
+ int64_t blockIdx = GetBlockIdx();
80
+ int64_t beginIdx = blockIdx * tilingData_->tilesPerCore;
81
+ int64_t endIdx = beginIdx + tilingData_->tilesPerCore;
82
+ endIdx = endIdx > tilingData_->totalTiles ? tilingData_->totalTiles : endIdx;
83
+
84
+ // pattern is [A1, R, A0]
85
+ for (int64_t curIdx = beginIdx; curIdx < endIdx; curIdx++) {
86
+ int64_t curA0Idx = curIdx % tilingData_->tileA0Outer;
87
+ int64_t curA1Idx = curIdx / tilingData_->tileA0Outer;
88
+
89
+ uint32_t curTileA0Len =
90
+ curA0Idx == (tilingData_->tileA0Outer - 1) ? tilingData_->tileA0Tail : tilingData_->tileA0Len;
91
+
92
+ int64_t xOffset =
93
+ // a1 offset
94
+ curA1Idx * tilingData_->totalRLen * tilingData_->totalA0Len +
95
+ // a0 offset
96
+ curA0Idx * tilingData_->tileA0Len;
97
+
98
+ uint16_t loopA0Num = ops::CeilDiv(curTileA0Len, VL_FP32);
99
+
100
+ // 单遍在线更新 running max / running sum
101
+ CalcOnlineMaxSum(curTileA0Len, xOffset, loopA0Num);
102
+
103
+ // 输出遍:exp(x - max) / sum
104
+ for (int64_t idx = 0; idx < tilingData_->rChunkTotalLoop; idx++) {
105
+ int64_t curTileRLen =
106
+ idx == (tilingData_->rChunkTotalLoop - 1) ? tilingData_->rChunkTail : tilingData_->rChunkFactor;
107
+
108
+ int64_t offset = xOffset + idx * tilingData_->rChunkFactor * tilingData_->totalA0Len;
109
+ CopyInX(offset, curTileRLen, curTileA0Len);
110
+ CalcOutput(curTileRLen, curTileA0Len, loopA0Num);
111
+ CopyOutY(offset, curTileRLen, curTileA0Len);
112
+ }
113
+ }
114
+ }
115
+
116
+ private:
117
+ // 单遍在线 max+sum:按 R chunk 逐块搬入,按 A0 列独立维护 running max / running sum。
118
+ __aicore__ inline void CalcOnlineMaxSum(uint32_t curTileA0Len, int64_t xOffsetStart, uint16_t loopA0Num)
119
+ {
120
+ LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
121
+ LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
122
+ __local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
123
+ __local_mem__ float* xSumLocal = (__local_mem__ float*)xSumTensor.GetPhyAddr();
124
+
125
+ // 初始化 running max = -inf, running sum = 0
126
+ __VEC_SCOPE__
127
+ {
128
+ RegTensor<float> maxReg;
129
+ RegTensor<float> sumReg;
130
+ MaskReg pregMask;
131
+ uint32_t sreg = curTileA0Len;
132
+ for (uint16_t k = 0; k < loopA0Num; k++) {
133
+ pregMask = UpdateMask<float>(sreg);
134
+ Duplicate(maxReg, static_cast<float>(-INFINITY), pregMask);
135
+ Duplicate(sumReg, static_cast<float>(0.0f), pregMask);
136
+ DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, maxReg, pregMask);
137
+ DataCopy(((__local_mem__ float*)xSumLocal) + k * VL_FP32, sumReg, pregMask);
138
+ }
139
+ }
140
+
141
+ uint32_t tileA0Len = tilingData_->tileA0Len;
142
+
143
+ for (int64_t idx = 0; idx < tilingData_->rChunkTotalLoop; idx++) {
144
+ int64_t curTileRLen =
145
+ idx == (tilingData_->rChunkTotalLoop - 1) ? tilingData_->rChunkTail : tilingData_->rChunkFactor;
146
+ uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
147
+ int64_t xOffset = xOffsetStart + idx * tilingData_->rChunkFactor * tilingData_->totalA0Len;
148
+
149
+ CopyInX(xOffset, curTileRLen, curTileA0Len);
150
+ LocalTensor<T1> x = xQueue_.DeQue<T1>();
151
+ __local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
152
+
153
+ __VEC_SCOPE__
154
+ {
155
+ RegTensor<float> xReg;
156
+ RegTensor<float> mOldReg;
157
+ RegTensor<float> lOldReg;
158
+ RegTensor<float> mNewReg;
159
+ RegTensor<float> mLocalReg;
160
+ RegTensor<float> corrReg;
161
+ RegTensor<float> tmpReg;
162
+ RegTensor<float> chunkSumReg;
163
+
164
+ MaskReg pregMask;
165
+ uint32_t sreg = curTileA0Len;
166
+
167
+ for (uint16_t k = 0; k < loopA0Num; k++) {
168
+ pregMask = UpdateMask<float>(sreg);
169
+ // load running state for this A0 column block
170
+ DataCopy<float, LoadDist::DIST_NORM>(mOldReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
171
+ DataCopy<float, LoadDist::DIST_NORM>(lOldReg, (__local_mem__ float*)xSumLocal + k * VL_FP32);
172
+
173
+ // chunk local max
174
+ Duplicate(mLocalReg, static_cast<float>(-INFINITY), pregMask);
175
+ for (uint16_t i = 0; i < curTileRLenVl; i++) {
176
+ uint32_t offset = i * tileA0Len + k * VL_FP32;
177
+ LoadTensorForDtypeT1(xLocal, xReg, pregMask, offset);
178
+ Max(mLocalReg, mLocalReg, xReg, pregMask);
179
+ }
180
+
181
+ // m_new = max(m_old, chunk_max)
182
+ Max(mNewReg, mOldReg, mLocalReg, pregMask);
183
+ // corr = exp(m_old - m_new)
184
+ Sub(corrReg, mOldReg, mNewReg, pregMask);
185
+ Exp(corrReg, corrReg, pregMask);
186
+
187
+ // chunk_sum = Σ_row exp(x - m_new)
188
+ Duplicate(chunkSumReg, static_cast<float>(0.0f), pregMask);
189
+ for (uint16_t i = 0; i < curTileRLenVl; i++) {
190
+ uint32_t offset = i * tileA0Len + k * VL_FP32;
191
+ LoadTensorForDtypeT1(xLocal, xReg, pregMask, offset);
192
+ Sub(tmpReg, xReg, mNewReg, pregMask);
193
+ Exp(tmpReg, tmpReg, pregMask);
194
+ Add(chunkSumReg, chunkSumReg, tmpReg, pregMask);
195
+ }
196
+
197
+ // l_new = l_old * corr + chunk_sum
198
+ Mul(lOldReg, lOldReg, corrReg, pregMask);
199
+ Add(lOldReg, lOldReg, chunkSumReg, pregMask);
200
+
201
+ // store back running state
202
+ DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, mNewReg, pregMask);
203
+ DataCopy(((__local_mem__ float*)xSumLocal) + k * VL_FP32, lOldReg, pregMask);
204
+ }
205
+ }
206
+
207
+ xQueue_.FreeTensor<T1>(x);
208
+ }
209
+ }
210
+
211
+ __aicore__ inline void CopyInX(int64_t xGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
212
+ {
213
+ LocalTensor<T1> xLocal = xQueue_.AllocTensor<T1>();
214
+ DataCopyPadExtParams<T1> dataCopyPadExtParams;
215
+ dataCopyPadExtParams.isPad = false;
216
+ dataCopyPadExtParams.leftPadding = 0;
217
+ dataCopyPadExtParams.rightPadding = 0;
218
+ dataCopyPadExtParams.paddingValue = 0;
219
+ DataCopyExtParams copyInParams;
220
+ copyInParams.blockCount = curTileRLen;
221
+ copyInParams.blockLen = curTileA0Len * sizeof(T1);
222
+ copyInParams.srcStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T1);
223
+ copyInParams.dstStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T1) / BLOCK_SIZE;
224
+ DataCopyPad<T1, PaddingMode::Normal>(xLocal, xGm_[xGmOffset], copyInParams, dataCopyPadExtParams);
225
+
226
+ xQueue_.EnQue(xLocal);
227
+ }
228
+
229
+ __aicore__ inline void CalcOutput(int64_t curTileRLen, uint32_t curTileA0Len, uint16_t loopA0Num)
230
+ {
231
+ LocalTensor<T1> x = xQueue_.DeQue<T1>();
232
+ __local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
233
+
234
+ LocalTensor<T2> y = yQueue_.template AllocTensor<T2>();
235
+ __local_mem__ T2* yLocal = (__local_mem__ T2*)y.GetPhyAddr();
236
+
237
+ LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
238
+ __local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
239
+
240
+ LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
241
+ __local_mem__ float* xSumLocal = (__local_mem__ float*)xSumTensor.GetPhyAddr();
242
+
243
+ uint32_t tileA0Len = tilingData_->tileA0Len;
244
+ uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
245
+ __VEC_SCOPE__
246
+ {
247
+ RegTensor<float> xReg;
248
+ RegTensor<float> yReg;
249
+ RegTensor<float> sumReg;
250
+ RegTensor<float> maxReg;
251
+
252
+ MaskReg pregMask;
253
+ uint32_t sreg = curTileA0Len;
254
+
255
+ for (uint16_t k = 0; k < loopA0Num; k++) {
256
+ pregMask = UpdateMask<float>(sreg);
257
+ DataCopy<float, LoadDist::DIST_NORM>(sumReg, (__local_mem__ float*)xSumLocal + k * VL_FP32);
258
+ DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
259
+ for (uint16_t i = 0; i < curTileRLenVl; i++) {
260
+ uint32_t xOffset = i * tileA0Len + k * VL_FP32;
261
+ LoadTensorForDtypeT1(xLocal, xReg, pregMask, xOffset);
262
+
263
+ Sub(xReg, xReg, maxReg, pregMask);
264
+ Exp(xReg, xReg, pregMask);
265
+ Div(yReg, xReg, sumReg, pregMask);
266
+
267
+ // copy out
268
+ if constexpr (IsSameType<T2, float>::value) {
269
+ DataCopy(((__local_mem__ float*)yLocal) + xOffset, yReg, pregMask);
270
+ } else { // fp16、bf16
271
+ RegTensor<T2> xFp16;
272
+ Cast<T2, float, castTraitFp32ToFp16>(xFp16, yReg, pregMask);
273
+ DataCopy<T2, StoreDist::DIST_PACK_B32>(((__local_mem__ T2*)yLocal) + xOffset, xFp16, pregMask);
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ yQueue_.EnQue(y);
280
+
281
+ xQueue_.FreeTensor<T1>(x);
282
+ }
283
+
284
+ __aicore__ inline void LoadTensorForDtypeT1(__local_mem__ T1* src, RegTensor<float>& dst, MaskReg& preg,
285
+ uint32_t offset)
286
+ {
287
+ if constexpr (IsSameType<T1, float>::value) {
288
+ DataCopy<float, LoadDist::DIST_NORM>(dst, (__local_mem__ float*)src + offset);
289
+ } else { // fp16、bf16
290
+ RegTensor<T1> xFp16;
291
+ DataCopy<T1, LoadDist::DIST_UNPACK_B16>(xFp16, ((__local_mem__ T1*)src + offset));
292
+ Cast<float, T1, castTraitFp16ToFp32>(dst, xFp16, preg);
293
+ }
294
+ }
295
+
296
+ __aicore__ inline void CopyOutY(int64_t yGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
297
+ {
298
+ LocalTensor<T2> y = yQueue_.DeQue<T2>();
299
+ DataCopyExtParams copyInParams;
300
+ copyInParams.blockCount = curTileRLen;
301
+ copyInParams.blockLen = curTileA0Len * sizeof(T2);
302
+ copyInParams.srcStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T2) / BLOCK_SIZE;
303
+ copyInParams.dstStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T2);
304
+ DataCopyPad<T2, PaddingMode::Normal>(yGm_[yGmOffset], y, copyInParams);
305
+ yQueue_.FreeTensor(y);
306
+ }
307
+
308
+ private:
309
+ const SoftmaxV2ARAOnlineTilingData* tilingData_;
310
+
311
+ TPipe* pipe_;
312
+
313
+ TQue<QuePosition::VECIN, 1> xQueue_;
314
+ TQue<QuePosition::VECOUT, 1> yQueue_;
315
+
316
+ TBuf<TPosition::VECCALC> xMaxBuf_;
317
+ TBuf<TPosition::VECCALC> xSumBuf_;
318
+
319
+ GlobalTensor<T2> yGm_;
320
+ GlobalTensor<T1> xGm_;
321
+ };
322
+ } // namespace SoftmaxV2Ops
323
+
324
+ #endif // SOFTMAX_V2_ARA_ONLINE_H