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,950 @@
1
+ /**
2
+ * Copyright (c) 2025 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_base.h
13
+ * \brief
14
+ */
15
+
16
+ #ifndef SOFTMAX_V2_BASE_H
17
+ #define SOFTMAX_V2_BASE_H
18
+
19
+ #include "kernel_tiling/kernel_tiling.h"
20
+ #include "kernel_operator.h"
21
+ #include "kernel_utils.h"
22
+ #include "op_kernel/platform_util.h"
23
+
24
+ using namespace Ops::Base;
25
+ namespace SoftmaxV2Ops
26
+ {
27
+ using namespace AscendC;
28
+
29
+ constexpr static AscendC::MicroAPI::CastTrait castTraitFp16ToFp32 = {
30
+ AscendC::MicroAPI::RegLayout::ZERO,
31
+ AscendC::MicroAPI::SatMode::UNKNOWN,
32
+ AscendC::MicroAPI::MaskMergeMode::ZEROING,
33
+ AscendC::RoundMode::UNKNOWN,
34
+ };
35
+
36
+ constexpr static AscendC::MicroAPI::CastTrait castTraitFp32ToFp16 = {
37
+ AscendC::MicroAPI::RegLayout::ZERO,
38
+ AscendC::MicroAPI::SatMode::NO_SAT,
39
+ AscendC::MicroAPI::MaskMergeMode::ZEROING,
40
+ AscendC::RoundMode::CAST_RINT,
41
+ };
42
+
43
+ constexpr static int64_t CONST_ZERO = 0;
44
+ constexpr static int64_t CONST_ONE = 1;
45
+ constexpr static int64_t CONST_TWO = 2;
46
+ constexpr static int64_t CONST_THREE = 3;
47
+ constexpr static int64_t CONST_FOUR = 4;
48
+ constexpr static int64_t CONST_FIVE = 5;
49
+ constexpr static int64_t CONST_SIX = 6;
50
+ constexpr static int64_t CONST_SEVEN = 7;
51
+ constexpr static int64_t CONST_EIGHT = 8;
52
+ constexpr static int64_t CONST_SIXTY_THREE = 63;
53
+ constexpr static uint32_t VL_FP32 = static_cast<int64_t>(GetVRegSize()) / sizeof(float);
54
+
55
+ class SoftmaxV2OpsBase
56
+ {
57
+ public:
58
+ __aicore__ inline SoftmaxV2OpsBase() : pipe_(nullptr){};
59
+
60
+ protected:
61
+ __aicore__ inline static int64_t FindNearestPower2(const int64_t value);
62
+ __aicore__ inline static int64_t GetCacheID(const int64_t idx);
63
+
64
+ protected:
65
+ template <typename T>
66
+ __aicore__ inline static void CastToFp32From(const LocalTensor<float>& dstTensor, const LocalTensor<T>& srcTensor,
67
+ const int64_t count);
68
+ template <typename T>
69
+ __aicore__ inline static void CastToFp32From(const LocalTensor<float>& dstTensor, const LocalTensor<T>& srcTensor,
70
+ const int64_t rowSize, const int64_t colSize, const int64_t stride);
71
+ template <typename T>
72
+ __aicore__ inline static void CastFromFp32To(const LocalTensor<T>& dstTensor, const LocalTensor<float>& srcTensor,
73
+ const int64_t count);
74
+ template <typename T>
75
+ __aicore__ inline static void CastFromFp32To(const LocalTensor<T>& dstTensor, const LocalTensor<float>& srcTensor,
76
+ const int64_t rowSize, const int64_t colSize, const int64_t stride);
77
+ template <typename T>
78
+ __aicore__ inline static void CopyIn(const LocalTensor<T>& dstTensor, const GlobalTensor<T>& srcTensor,
79
+ const int64_t rowSize, const int64_t colSize, const int64_t dstStride,
80
+ const int64_t srcStride);
81
+ template <typename T>
82
+ __aicore__ inline static void CopyIn(const LocalTensor<T>& dstTensor, const GlobalTensor<T>& srcTensor,
83
+ const int64_t rowSize);
84
+ template <typename T>
85
+ __aicore__ inline static void CopyOut(const GlobalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor,
86
+ const int64_t rowSize);
87
+ template <typename T>
88
+ __aicore__ inline static void CopyOut(const GlobalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor,
89
+ const int64_t rowSize, const int64_t colSize, const int64_t dstStride,
90
+ const int64_t srcStride);
91
+ __aicore__ inline static void CopyUB2UB(const LocalTensor<float>& dstTensor, const LocalTensor<float>& srcTensor,
92
+ const int64_t count);
93
+ __aicore__ inline static void VectorAdd(const LocalTensor<float>& dstTensor, const LocalTensor<float>& src0Tensor,
94
+ const LocalTensor<float>& src1Tensor, const int64_t count);
95
+ __aicore__ inline static void VectorAdd(const LocalTensor<float>& dstTensor, const LocalTensor<float>& src0Tensor,
96
+ const LocalTensor<float>& src1Tensor, const int64_t mSize,
97
+ const int64_t nSize, const int64_t stride);
98
+ __aicore__ inline static void VectorMul(const LocalTensor<float>& dstTensor, const LocalTensor<float>& src0Tensor,
99
+ const LocalTensor<float>& src1Tensor, const int64_t count);
100
+ __aicore__ inline static void NlastBroadcastMul(const LocalTensor<float>& dstTensor,
101
+ const LocalTensor<float>& src0Tensor,
102
+ const LocalTensor<float>& src1Tensor, const int64_t bSize,
103
+ const int64_t aSize);
104
+ __aicore__ inline static void LastReduceSumSmallR(const LocalTensor<float>& dstTensor,
105
+ const LocalTensor<float>& srcTensor, const int64_t aSize,
106
+ const int64_t rSize, const int64_t stride);
107
+ __aicore__ inline static void LastReduceSum(const LocalTensor<float>& dstTensor,
108
+ const LocalTensor<float>& srcTensor,
109
+ const LocalTensor<float>& reduceSumTempTensor, const int64_t aSize,
110
+ const int64_t rSize, const int64_t stride);
111
+ template <uint32_t RSize>
112
+ __aicore__ inline static void NlastReduceSumSmallR(const LocalTensor<float>& dstTensor,
113
+ const LocalTensor<float>& srcTensor, const int64_t aSize,
114
+ const int64_t stride);
115
+ __aicore__ inline static void NlastReduceSumSmallR(const LocalTensor<float>& dstTensor,
116
+ const LocalTensor<float>& srcTensor, const int64_t rSize,
117
+ const int64_t aSize, const int64_t stride);
118
+ template <int32_t TailCount>
119
+ __aicore__ inline static void NlastReduceSumLargeR(const LocalTensor<float>& dstTensor,
120
+ const LocalTensor<float>& srcTensor,
121
+ const LocalTensor<float>& reduceSumTempTensor,
122
+ const int64_t rSize, const int64_t aSize, const int64_t stride);
123
+ __aicore__ inline static void NlastReduceSum(const LocalTensor<float>& dstTensor,
124
+ const LocalTensor<float>& srcTensor,
125
+ const LocalTensor<float>& reduceSumTempTensor, const int64_t rSize,
126
+ const int64_t aSize, const int64_t stride);
127
+ __aicore__ inline static void UpdateCache(const LocalTensor<float>& dstTensor, const LocalTensor<float>& srcTensor,
128
+ const int64_t cacheID, const int64_t stride, const int64_t count);
129
+ __aicore__ inline static void Normalize(const LocalTensor<float>& dstTensor, const LocalTensor<float>& srcTensor,
130
+ const LocalTensor<float>& meanTensor, const LocalTensor<float>& rstdTensor,
131
+ const int64_t rowSize, const int64_t colSize);
132
+
133
+ protected:
134
+ TPipe* pipe_;
135
+ }; // class SoftmaxV2OpsBase
136
+
137
+ // IMPL
138
+ __aicore__ inline int64_t SoftmaxV2OpsBase::FindNearestPower2(const int64_t value)
139
+ {
140
+ if (value <= CONST_ONE) {
141
+ return CONST_ZERO;
142
+ } else if (value <= CONST_TWO) {
143
+ return CONST_ONE;
144
+ } else if (value <= CONST_FOUR) {
145
+ return CONST_TWO;
146
+ } else {
147
+ const int64_t num = value - CONST_ONE;
148
+ const int64_t pow = CONST_SIXTY_THREE - AscendC::ScalarCountLeadingZero(num);
149
+ return (CONST_ONE << pow);
150
+ }
151
+ }
152
+
153
+ __aicore__ inline int64_t SoftmaxV2OpsBase::GetCacheID(const int64_t idx)
154
+ {
155
+ return AscendC::ScalarGetCountOfValue<1>(idx ^ (idx + CONST_ONE)) - CONST_ONE;
156
+ }
157
+
158
+ template <typename T>
159
+ __aicore__ inline void SoftmaxV2OpsBase::CastToFp32From(const LocalTensor<float>& dstTensor,
160
+ const LocalTensor<T>& srcTensor, const int64_t count)
161
+ {
162
+ // CastToFp32From T
163
+ CastToFp32From<T>(dstTensor, srcTensor, CONST_ONE, count, CONST_ZERO);
164
+ }
165
+
166
+ template <typename T>
167
+ __aicore__ inline void SoftmaxV2OpsBase::CastToFp32From(const LocalTensor<float>& dstTensor,
168
+ const LocalTensor<T>& srcTensor, const int64_t rowSize,
169
+ const int64_t colSize, const int64_t stride)
170
+ {
171
+ // CastToFp32From T
172
+ uint16_t outerLoopTimes = static_cast<uint16_t>(rowSize);
173
+ uint16_t innerLoopTimes = static_cast<uint16_t>(
174
+ ops::CeilDiv(static_cast<int64_t>(colSize * sizeof(float)), static_cast<int64_t>(GetVRegSize())));
175
+ uint32_t outerLoopSrcStride = static_cast<uint32_t>(stride * CONST_TWO);
176
+ uint32_t outerLoopDstStride = static_cast<uint32_t>(stride);
177
+ uint32_t innerLoopStride = VL_FP32;
178
+ if constexpr (IsSameType<T, half>::value || IsSameType<T, bfloat16_t>::value) {
179
+ __VEC_SCOPE__
180
+ {
181
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
182
+ __local_mem__ T* src = (__local_mem__ T*)srcTensor.GetPhyAddr();
183
+ uint32_t count;
184
+ AscendC::MicroAPI::RegTensor<float> fp32Reg;
185
+ AscendC::MicroAPI::RegTensor<T> b16Reg;
186
+ AscendC::MicroAPI::MaskReg pMask;
187
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
188
+ count = static_cast<uint32_t>(colSize);
189
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
190
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
191
+ DataCopy<T, AscendC::MicroAPI::LoadDist::DIST_UNPACK_B16>(
192
+ b16Reg, (__local_mem__ T*)src + i * outerLoopSrcStride + j * innerLoopStride);
193
+ Cast<float, T, castTraitFp16ToFp32>(fp32Reg, b16Reg, pMask);
194
+ DataCopy((__local_mem__ float*)dst + i * outerLoopDstStride + j * innerLoopStride, fp32Reg, pMask);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ template <typename T>
202
+ __aicore__ inline void SoftmaxV2OpsBase::CastFromFp32To(const LocalTensor<T>& dstTensor,
203
+ const LocalTensor<float>& srcTensor, const int64_t count)
204
+ {
205
+ // CastFromFp32To T
206
+ CastFromFp32To<T>(dstTensor, srcTensor, CONST_ONE, count, CONST_ZERO);
207
+ }
208
+
209
+ template <typename T>
210
+ __aicore__ inline void SoftmaxV2OpsBase::CastFromFp32To(const LocalTensor<T>& dstTensor,
211
+ const LocalTensor<float>& srcTensor, const int64_t rowSize,
212
+ const int64_t colSize, const int64_t stride)
213
+ {
214
+ // CastFromFp32To T
215
+ uint16_t outerLoopTimes = static_cast<uint16_t>(rowSize);
216
+ uint16_t innerLoopTimes = static_cast<uint16_t>(
217
+ ops::CeilDiv(static_cast<int64_t>(colSize * sizeof(float)), static_cast<int64_t>(GetVRegSize())));
218
+ uint32_t outerLoopSrcStride = static_cast<uint32_t>(stride);
219
+ uint32_t outerLoopDstStride = static_cast<uint32_t>(stride * CONST_TWO);
220
+ uint32_t innerLoopStride = VL_FP32;
221
+ if constexpr (IsSameType<T, half>::value || IsSameType<T, bfloat16_t>::value) {
222
+ __VEC_SCOPE__
223
+ {
224
+ __local_mem__ T* dst = (__local_mem__ T*)dstTensor.GetPhyAddr();
225
+ __local_mem__ float* src = (__local_mem__ float*)srcTensor.GetPhyAddr();
226
+ uint32_t count;
227
+ AscendC::MicroAPI::RegTensor<float> fp32Reg;
228
+ AscendC::MicroAPI::RegTensor<T> b16Reg;
229
+ AscendC::MicroAPI::MaskReg pMask;
230
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
231
+ count = static_cast<uint32_t>(colSize);
232
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
233
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
234
+ DataCopy(fp32Reg, (__local_mem__ float*)src + i * outerLoopSrcStride + j * innerLoopStride);
235
+ Cast<T, float, castTraitFp32ToFp16>(b16Reg, fp32Reg, pMask);
236
+ DataCopy<T, AscendC::MicroAPI::StoreDist::DIST_PACK_B32>(
237
+ (__local_mem__ T*)dst + i * outerLoopDstStride + j * innerLoopStride, b16Reg, pMask);
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+
244
+ template <typename T>
245
+ __aicore__ inline void SoftmaxV2OpsBase::CopyIn(const LocalTensor<T>& dstTensor, const GlobalTensor<T>& srcTensor,
246
+ const int64_t rowSize, const int64_t colSize, const int64_t dstStride,
247
+ const int64_t srcStride)
248
+ {
249
+ // CopyIn
250
+ DataCopyExtParams params;
251
+ params.blockCount = rowSize;
252
+ params.blockLen = colSize * sizeof(T);
253
+ params.srcStride = srcStride * sizeof(T) - params.blockLen;
254
+ params.dstStride = (dstStride * sizeof(T) - ops::Aligned(static_cast<int64_t>(params.blockLen),
255
+ static_cast<int64_t>(GetUbBlockSize()))) /
256
+ GetUbBlockSize();
257
+ DataCopyPadExtParams<T> padParams;
258
+ padParams.isPad = false;
259
+ DataCopyPad(dstTensor, srcTensor, params, padParams);
260
+ }
261
+
262
+ template <typename T>
263
+ __aicore__ inline void SoftmaxV2OpsBase::CopyIn(const LocalTensor<T>& dstTensor, const GlobalTensor<T>& srcTensor,
264
+ const int64_t rowSize)
265
+ {
266
+ // CopyIn
267
+ DataCopyExtParams params;
268
+ params.blockCount = 1;
269
+ params.blockLen = rowSize * sizeof(T);
270
+ DataCopyPadExtParams<T> padParams;
271
+ padParams.isPad = false;
272
+ DataCopyPad(dstTensor, srcTensor, params, padParams);
273
+ }
274
+
275
+ template <typename T>
276
+ __aicore__ inline void SoftmaxV2OpsBase::CopyOut(const GlobalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor,
277
+ const int64_t rowSize)
278
+ {
279
+ // CopyOut
280
+ DataCopyExtParams params;
281
+ params.blockCount = 1;
282
+ params.blockLen = rowSize * sizeof(T);
283
+ DataCopyPad(dstTensor, srcTensor, params);
284
+ }
285
+
286
+ template <typename T>
287
+ __aicore__ inline void SoftmaxV2OpsBase::CopyOut(const GlobalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor,
288
+ const int64_t rowSize, const int64_t colSize, const int64_t dstStride,
289
+ const int64_t srcStride)
290
+ {
291
+ // CopyOut
292
+ DataCopyExtParams params;
293
+ params.blockCount = rowSize;
294
+ params.blockLen = colSize * sizeof(T);
295
+ params.dstStride = dstStride * sizeof(T) - params.blockLen;
296
+ params.srcStride = (srcStride * sizeof(T) - ops::Aligned(static_cast<int64_t>(params.blockLen),
297
+ static_cast<int64_t>(GetUbBlockSize()))) /
298
+ GetUbBlockSize();
299
+ DataCopyPad(dstTensor, srcTensor, params);
300
+ }
301
+
302
+ __aicore__ inline void SoftmaxV2OpsBase::CopyUB2UB(const LocalTensor<float>& dstTensor,
303
+ const LocalTensor<float>& srcTensor, const int64_t count)
304
+ {
305
+ // CopyUB2UB
306
+ DataCopy(
307
+ dstTensor, srcTensor,
308
+ ops::Aligned(static_cast<int64_t>(count), static_cast<int64_t>(GetUbBlockSize() / sizeof(float))));
309
+ }
310
+
311
+ __aicore__ inline void SoftmaxV2OpsBase::VectorAdd(const LocalTensor<float>& dstTensor,
312
+ const LocalTensor<float>& src0Tensor,
313
+ const LocalTensor<float>& src1Tensor, const int64_t count)
314
+ {
315
+ // VectorAdd
316
+ if (count <= 0) {
317
+ return;
318
+ }
319
+ uint16_t loopTimes =
320
+ ops::CeilDiv(static_cast<int64_t>(count * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
321
+ __VEC_SCOPE__
322
+ {
323
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
324
+ __local_mem__ float* src0 = (__local_mem__ float*)src0Tensor.GetPhyAddr();
325
+ __local_mem__ float* src1 = (__local_mem__ float*)src1Tensor.GetPhyAddr();
326
+ uint32_t sreg = static_cast<uint32_t>(count);
327
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
328
+ AscendC::MicroAPI::MaskReg pMask;
329
+ for (uint16_t i = 0; i < loopTimes; ++i) {
330
+ pMask = AscendC::MicroAPI::UpdateMask<float>(sreg);
331
+ DataCopy(aReg, (__local_mem__ float*)src0 + i * VL_FP32);
332
+ DataCopy(bReg, (__local_mem__ float*)src1 + i * VL_FP32);
333
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
334
+ Copy<float, AscendC::MicroAPI::MaskMergeMode::MERGING>(aReg, cReg, pMask);
335
+ DataCopy((__local_mem__ float*)dst + i * VL_FP32, aReg, pMask);
336
+ }
337
+ }
338
+ }
339
+
340
+ __aicore__ inline void SoftmaxV2OpsBase::VectorAdd(const LocalTensor<float>& dstTensor,
341
+ const LocalTensor<float>& src0Tensor,
342
+ const LocalTensor<float>& src1Tensor, const int64_t mSize,
343
+ const int64_t nSize, const int64_t stride)
344
+ {
345
+ // VectorAdd
346
+ uint16_t outerLoopTimes =
347
+ ops::CeilDiv(static_cast<int64_t>(nSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
348
+ uint16_t innerLoopTimes = mSize;
349
+ uint32_t outerLoopStride = VL_FP32;
350
+ uint32_t innerLoopStride = stride;
351
+ __VEC_SCOPE__
352
+ {
353
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
354
+ __local_mem__ float* src0 = (__local_mem__ float*)src0Tensor.GetPhyAddr();
355
+ __local_mem__ float* src1 = (__local_mem__ float*)src1Tensor.GetPhyAddr();
356
+ uint32_t count = nSize;
357
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
358
+ AscendC::MicroAPI::MaskReg pMask;
359
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
360
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
361
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
362
+ DataCopy(aReg, (__local_mem__ float*)src0 + i * outerLoopStride + j * innerLoopStride);
363
+ DataCopy(bReg, (__local_mem__ float*)src1 + i * outerLoopStride + j * innerLoopStride);
364
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
365
+ Copy<float, AscendC::MicroAPI::MaskMergeMode::MERGING>(aReg, cReg, pMask);
366
+ DataCopy((__local_mem__ float*)dst + i * outerLoopStride + j * innerLoopStride, aReg, pMask);
367
+ }
368
+ }
369
+ }
370
+ }
371
+
372
+ __aicore__ inline void SoftmaxV2OpsBase::VectorMul(const LocalTensor<float>& dstTensor,
373
+ const LocalTensor<float>& src0Tensor,
374
+ const LocalTensor<float>& src1Tensor, const int64_t count)
375
+ {
376
+ // VectorMul
377
+ if (count <= 0) {
378
+ return;
379
+ }
380
+ uint16_t loopTimes =
381
+ ops::CeilDiv(static_cast<int64_t>(count * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
382
+ __VEC_SCOPE__
383
+ {
384
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
385
+ __local_mem__ float* src0 = (__local_mem__ float*)src0Tensor.GetPhyAddr();
386
+ __local_mem__ float* src1 = (__local_mem__ float*)src1Tensor.GetPhyAddr();
387
+ uint32_t sreg = static_cast<uint32_t>(count);
388
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
389
+ AscendC::MicroAPI::MaskReg pMask;
390
+
391
+ for (uint16_t i = 0; i < loopTimes; ++i) {
392
+ pMask = AscendC::MicroAPI::UpdateMask<float>(sreg);
393
+ DataCopy(aReg, (__local_mem__ float*)src0 + i * VL_FP32);
394
+ DataCopy(bReg, (__local_mem__ float*)src1 + i * VL_FP32);
395
+ Mul<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
396
+ DataCopy((__local_mem__ float*)dst + i * VL_FP32, cReg, pMask);
397
+ }
398
+ }
399
+ }
400
+
401
+ __aicore__ inline void SoftmaxV2OpsBase::NlastBroadcastMul(const LocalTensor<float>& dstTensor,
402
+ const LocalTensor<float>& src0Tensor,
403
+ const LocalTensor<float>& src1Tensor, const int64_t bSize,
404
+ const int64_t aSize)
405
+ {
406
+ // NlastBroadcastMul
407
+ if (bSize <= 0) {
408
+ return;
409
+ }
410
+ if (aSize <= 0) {
411
+ return;
412
+ }
413
+ uint16_t outerLoopTimes =
414
+ ops::CeilDiv(static_cast<int64_t>(aSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
415
+ uint16_t innerLoopTimes = bSize;
416
+ uint32_t outerLoopStride = VL_FP32;
417
+ uint32_t innerLoopStride = aSize;
418
+ __VEC_SCOPE__
419
+ {
420
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
421
+ __local_mem__ float* src0 = (__local_mem__ float*)src0Tensor.GetPhyAddr();
422
+ __local_mem__ float* src1 = (__local_mem__ float*)src1Tensor.GetPhyAddr();
423
+ uint32_t count = static_cast<uint32_t>(aSize);
424
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
425
+ AscendC::MicroAPI::MaskReg pMask;
426
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
427
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
428
+ DataCopy(bReg, (__local_mem__ float*)src1 + i * outerLoopStride);
429
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
430
+ DataCopy(aReg, (__local_mem__ float*)src0 + i * outerLoopStride + j * innerLoopStride);
431
+ Mul<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
432
+ DataCopy((__local_mem__ float*)dst + i * outerLoopStride + j * innerLoopStride, cReg, pMask);
433
+ }
434
+ }
435
+ }
436
+ }
437
+
438
+ __aicore__ inline void SoftmaxV2OpsBase::LastReduceSumSmallR(const LocalTensor<float>& dstTensor,
439
+ const LocalTensor<float>& srcTensor, const int64_t aSize,
440
+ const int64_t rSize, const int64_t stride)
441
+ {
442
+ // LastReduceSumSmallR
443
+ if (aSize <= 0) {
444
+ return;
445
+ }
446
+ if (rSize <= 0) {
447
+ return;
448
+ }
449
+ if (rSize > CONST_TWO * VL_FP32) {
450
+ return;
451
+ }
452
+
453
+ uint16_t loopTimes = aSize;
454
+ if (rSize <= VL_FP32) {
455
+ __VEC_SCOPE__
456
+ {
457
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
458
+ __local_mem__ float* src = (__local_mem__ float*)srcTensor.GetPhyAddr();
459
+ uint32_t count = static_cast<uint32_t>(rSize);
460
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
461
+ AscendC::MicroAPI::MaskReg pMask = AscendC::MicroAPI::UpdateMask<float>(count);
462
+ AscendC::MicroAPI::UnalignReg UReg;
463
+ for (uint16_t i = 0; i < loopTimes; ++i) {
464
+ DataCopy(aReg, (__local_mem__ float*)src + i * stride);
465
+ ReduceSum(bReg, aReg, pMask);
466
+ AscendC::MicroAPI::DataCopyUnAlign((__local_mem__ float*&)dst, bReg, UReg, 1);
467
+ }
468
+ AscendC::MicroAPI::DataCopyUnAlignPost((__local_mem__ float*&)dst, UReg, 0);
469
+ }
470
+ } else {
471
+ __VEC_SCOPE__
472
+ {
473
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
474
+ __local_mem__ float* src0 = (__local_mem__ float*)srcTensor.GetPhyAddr();
475
+ __local_mem__ float* src1 = (__local_mem__ float*)srcTensor.GetPhyAddr() + VL_FP32;
476
+ uint32_t count = static_cast<uint32_t>(rSize - VL_FP32);
477
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
478
+ AscendC::MicroAPI::UnalignReg UReg;
479
+ AscendC::MicroAPI::MaskReg pMask = AscendC::MicroAPI::UpdateMask<float>(count);
480
+ AscendC::MicroAPI::MaskReg pFull =
481
+ AscendC::MicroAPI::CreateMask<float, AscendC::MicroAPI::MaskPattern::ALL>();
482
+ for (uint16_t i = 0; i < loopTimes; ++i) {
483
+ DataCopy(aReg, (__local_mem__ float*)src0 + i * stride);
484
+ DataCopy(bReg, (__local_mem__ float*)src1 + i * stride);
485
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
486
+ Copy<float, AscendC::MicroAPI::MaskMergeMode::MERGING>(aReg, cReg, pMask);
487
+ ReduceSum(bReg, aReg, pFull);
488
+ AscendC::MicroAPI::DataCopyUnAlign((__local_mem__ float*&)dst, bReg, UReg, 1);
489
+ }
490
+ AscendC::MicroAPI::DataCopyUnAlignPost((__local_mem__ float*&)dst, UReg, 0);
491
+ }
492
+ }
493
+ }
494
+
495
+ __aicore__ inline void SoftmaxV2OpsBase::LastReduceSum(const LocalTensor<float>& dstTensor,
496
+ const LocalTensor<float>& srcTensor,
497
+ const LocalTensor<float>& reduceSumTempTensor,
498
+ const int64_t aSize, const int64_t rSize, const int64_t stride)
499
+ {
500
+ // LastReduceSum
501
+ if (aSize <= 0) {
502
+ return;
503
+ }
504
+ if (rSize <= 0) {
505
+ return;
506
+ }
507
+ if (rSize <= CONST_TWO * VL_FP32) {
508
+ LastReduceSumSmallR(dstTensor, srcTensor, aSize, rSize, stride);
509
+ return;
510
+ }
511
+
512
+ int64_t ceilVLCount =
513
+ ops::CeilDiv(static_cast<int64_t>(rSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
514
+ int64_t floorVLCount =
515
+ ops::FloorDiv(static_cast<int64_t>(rSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
516
+ int64_t foldPoint = FindNearestPower2(ceilVLCount);
517
+
518
+ uint16_t outerLoopTimes = aSize;
519
+ uint16_t tailFoldLoopTimes = ceilVLCount - floorVLCount;
520
+ uint32_t tailFoldElemCount = static_cast<uint32_t>(rSize - floorVLCount * VL_FP32);
521
+ uint16_t mainFoldLoopTimes = floorVLCount - foldPoint;
522
+ uint16_t unFoldLoopTimes = foldPoint + foldPoint - ceilVLCount;
523
+ uint32_t outerLoopStride = stride;
524
+ uint32_t innerLoopStride = VL_FP32;
525
+ uint32_t outerLoopDstStride =
526
+ ops::Aligned(static_cast<int64_t>(foldPoint), static_cast<int64_t>(GetUbBlockSize() / sizeof(float)));
527
+
528
+ int64_t foldSrcBOffset = foldPoint * VL_FP32;
529
+ int64_t tailSrcAOffset = mainFoldLoopTimes * VL_FP32;
530
+ int64_t tailSrcBOffset = floorVLCount * VL_FP32;
531
+ int64_t unFoldSrcOffset = (mainFoldLoopTimes + tailFoldLoopTimes) * VL_FP32;
532
+
533
+ __VEC_SCOPE__
534
+ {
535
+ __local_mem__ float* dst = (__local_mem__ float*)reduceSumTempTensor.GetPhyAddr();
536
+ __local_mem__ float* foldSrcA = (__local_mem__ float*)srcTensor.GetPhyAddr();
537
+ __local_mem__ float* foldSrcB = (__local_mem__ float*)srcTensor.GetPhyAddr() + foldSrcBOffset;
538
+ __local_mem__ float* tailSrcA = (__local_mem__ float*)srcTensor.GetPhyAddr() + tailSrcAOffset;
539
+ __local_mem__ float* tailSrcB = (__local_mem__ float*)srcTensor.GetPhyAddr() + tailSrcBOffset;
540
+ __local_mem__ float* unFoldSrc = (__local_mem__ float*)srcTensor.GetPhyAddr() + unFoldSrcOffset;
541
+ AscendC::MicroAPI::MaskReg pFull = AscendC::MicroAPI::CreateMask<float, AscendC::MicroAPI::MaskPattern::ALL>();
542
+ AscendC::MicroAPI::UnalignReg UReg;
543
+
544
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
545
+ dst = (__local_mem__ float*)reduceSumTempTensor.GetPhyAddr() + i * outerLoopDstStride;
546
+ for (uint16_t j = 0; j < mainFoldLoopTimes; ++j) {
547
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg, dReg;
548
+ DataCopy(aReg, (__local_mem__ float*)foldSrcA + i * outerLoopStride + j * innerLoopStride);
549
+ DataCopy(bReg, (__local_mem__ float*)foldSrcB + i * outerLoopStride + j * innerLoopStride);
550
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pFull);
551
+ ReduceSum(dReg, cReg, pFull);
552
+ AscendC::MicroAPI::DataCopyUnAlign((__local_mem__ float*&)dst, dReg, UReg, 1);
553
+ }
554
+ for (uint16_t j = 0; j < tailFoldLoopTimes; ++j) {
555
+ uint32_t count = static_cast<uint32_t>(tailFoldElemCount);
556
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
557
+ AscendC::MicroAPI::MaskReg pMask = AscendC::MicroAPI::UpdateMask<float>(count);
558
+ DataCopy(aReg, (__local_mem__ float*)tailSrcA + i * outerLoopStride + j * innerLoopStride);
559
+ DataCopy(bReg, (__local_mem__ float*)tailSrcB + i * outerLoopStride + j * innerLoopStride);
560
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, aReg, bReg, pMask);
561
+ Copy<float, AscendC::MicroAPI::MaskMergeMode::MERGING>(aReg, cReg, pMask);
562
+ ReduceSum(bReg, aReg, pFull);
563
+ AscendC::MicroAPI::DataCopyUnAlign((__local_mem__ float*&)dst, bReg, UReg, 1);
564
+ }
565
+ for (uint16_t j = 0; j < unFoldLoopTimes; ++j) {
566
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
567
+ DataCopy(aReg, (__local_mem__ float*)unFoldSrc + i * outerLoopStride + j * innerLoopStride);
568
+ ReduceSum(bReg, aReg, pFull);
569
+ AscendC::MicroAPI::DataCopyUnAlign((__local_mem__ float*&)dst, bReg, UReg, 1);
570
+ }
571
+ AscendC::MicroAPI::DataCopyUnAlignPost((__local_mem__ float*&)dst, UReg, 0);
572
+ }
573
+ }
574
+ LastReduceSumSmallR(dstTensor, reduceSumTempTensor, aSize, foldPoint, outerLoopDstStride);
575
+ }
576
+
577
+ template <uint32_t RSize, int32_t TailCount = -1, int32_t Index = 0, int32_t Depth = 1>
578
+ struct NlastDichotomyAdd {
579
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
580
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
581
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride)
582
+ {
583
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
584
+ __local_mem__ float* srcAOffset = srcA + stride * CONST_TWO;
585
+ __local_mem__ float* srcBOffset = srcB + stride * CONST_TWO;
586
+ if constexpr (TailCount <= 0) {
587
+ NlastDichotomyAdd<(RSize + 1) / CONST_TWO>::LoadAndAccumulate(aReg, srcA, srcAOffset, pMask,
588
+ stride * CONST_TWO);
589
+ NlastDichotomyAdd<RSize / CONST_TWO>::LoadAndAccumulate(bReg, srcB, srcBOffset, pMask, stride * CONST_TWO);
590
+ }
591
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
592
+ }
593
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
594
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
595
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride, uint32_t offset)
596
+ {
597
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
598
+ __local_mem__ float* srcAOffset = srcA + stride * CONST_TWO;
599
+ __local_mem__ float* srcBOffset = srcB + stride * CONST_TWO;
600
+ if constexpr (TailCount <= 0) {
601
+ NlastDichotomyAdd<(RSize + 1) / CONST_TWO>::LoadAndAccumulate(aReg, srcA, srcAOffset, pMask,
602
+ stride * CONST_TWO, offset);
603
+ NlastDichotomyAdd<RSize / CONST_TWO>::LoadAndAccumulate(bReg, srcB, srcBOffset, pMask, stride * CONST_TWO,
604
+ offset);
605
+ } else {
606
+ NlastDichotomyAdd<(RSize + 1) / CONST_TWO, TailCount, Index, Depth * CONST_TWO>::LoadAndAccumulate(
607
+ aReg, srcA, srcAOffset, pMask, stride * CONST_TWO, offset);
608
+ NlastDichotomyAdd<RSize / CONST_TWO, TailCount, Index + Depth, Depth * CONST_TWO>::LoadAndAccumulate(
609
+ bReg, srcB, srcBOffset, pMask, stride * CONST_TWO, offset);
610
+ }
611
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
612
+ }
613
+ };
614
+
615
+ template <int32_t TailCount, int32_t Index, int32_t Depth>
616
+ struct NlastDichotomyAdd<CONST_TWO, TailCount, Index, Depth> {
617
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
618
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
619
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride)
620
+ {
621
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
622
+ DataCopy(aReg, (__local_mem__ float*)srcA);
623
+ DataCopy(bReg, (__local_mem__ float*)srcB);
624
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
625
+ }
626
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
627
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
628
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride, uint32_t offset)
629
+ {
630
+ if constexpr (TailCount <= 0) {
631
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
632
+ DataCopy(aReg, (__local_mem__ float*)srcA);
633
+ DataCopy(bReg, (__local_mem__ float*)srcA + offset);
634
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(aReg, aReg, bReg, pMask);
635
+ DataCopy(bReg, (__local_mem__ float*)srcB);
636
+ DataCopy(cReg, (__local_mem__ float*)srcB + offset);
637
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(bReg, bReg, cReg, pMask);
638
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
639
+ } else {
640
+ if constexpr (Index + Depth < TailCount) {
641
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
642
+ DataCopy(aReg, (__local_mem__ float*)srcA);
643
+ DataCopy(bReg, (__local_mem__ float*)srcA + offset);
644
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(aReg, aReg, bReg, pMask);
645
+ DataCopy(bReg, (__local_mem__ float*)srcB);
646
+ DataCopy(cReg, (__local_mem__ float*)srcB + offset);
647
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(bReg, bReg, cReg, pMask);
648
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
649
+ } else if constexpr (Index < TailCount) {
650
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
651
+ DataCopy(aReg, (__local_mem__ float*)srcA);
652
+ DataCopy(bReg, (__local_mem__ float*)srcA + offset);
653
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(aReg, aReg, bReg, pMask);
654
+ DataCopy(bReg, (__local_mem__ float*)srcB);
655
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
656
+ } else {
657
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
658
+ DataCopy(aReg, (__local_mem__ float*)srcA);
659
+ DataCopy(bReg, (__local_mem__ float*)srcB);
660
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
661
+ }
662
+ }
663
+ }
664
+ };
665
+
666
+ template <>
667
+ struct NlastDichotomyAdd<CONST_TWO> {
668
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
669
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
670
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride)
671
+ {
672
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
673
+ DataCopy(aReg, (__local_mem__ float*)srcA);
674
+ DataCopy(bReg, (__local_mem__ float*)srcB);
675
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
676
+ }
677
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
678
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
679
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride, uint32_t offset)
680
+ {
681
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
682
+ DataCopy(aReg, (__local_mem__ float*)srcA);
683
+ DataCopy(bReg, (__local_mem__ float*)srcA + offset);
684
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(aReg, aReg, bReg, pMask);
685
+ DataCopy(bReg, (__local_mem__ float*)srcB);
686
+ DataCopy(cReg, (__local_mem__ float*)srcB + offset);
687
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(bReg, bReg, cReg, pMask);
688
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(acc, aReg, bReg, pMask);
689
+ }
690
+ };
691
+
692
+ template <>
693
+ struct NlastDichotomyAdd<1> {
694
+ __aicore__ static inline void LoadAndAccumulate(AscendC::MicroAPI::RegTensor<float>& acc,
695
+ __local_mem__ float*& srcA, __local_mem__ float*& srcB,
696
+ AscendC::MicroAPI::MaskReg& pMask, uint32_t stride)
697
+ {
698
+ DataCopy(acc, (__local_mem__ float*)srcA);
699
+ }
700
+ };
701
+
702
+ template <uint32_t RSize>
703
+ __aicore__ inline void SoftmaxV2OpsBase::NlastReduceSumSmallR(const LocalTensor<float>& dstTensor,
704
+ const LocalTensor<float>& srcTensor, const int64_t aSize,
705
+ const int64_t stride)
706
+ {
707
+ // NlastReduceSumSmallR
708
+ uint16_t loopTimes =
709
+ ops::CeilDiv(static_cast<int64_t>(aSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
710
+ if constexpr (RSize == 1) {
711
+ __VEC_SCOPE__
712
+ {
713
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
714
+ __local_mem__ float* src = (__local_mem__ float*)srcTensor.GetPhyAddr();
715
+ uint32_t count = static_cast<uint32_t>(aSize);
716
+ AscendC::MicroAPI::RegTensor<float> aReg;
717
+ AscendC::MicroAPI::MaskReg pMask;
718
+ for (uint16_t i = 0; i < loopTimes; ++i) {
719
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
720
+ DataCopy(aReg, (__local_mem__ float*)src + i * VL_FP32);
721
+ DataCopy((__local_mem__ float*)dst + i * VL_FP32, aReg, pMask);
722
+ }
723
+ }
724
+ } else {
725
+ __VEC_SCOPE__
726
+ {
727
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
728
+ __local_mem__ float* srcA = (__local_mem__ float*)srcTensor.GetPhyAddr();
729
+ __local_mem__ float* srcB = (__local_mem__ float*)srcTensor.GetPhyAddr() + stride;
730
+ uint32_t count = static_cast<uint32_t>(aSize);
731
+ AscendC::MicroAPI::RegTensor<float> aReg;
732
+ AscendC::MicroAPI::MaskReg pMask;
733
+ for (uint16_t i = 0; i < loopTimes; ++i) {
734
+ __local_mem__ float* curSrcA = srcA + i * VL_FP32;
735
+ __local_mem__ float* curSrcB = srcB + i * VL_FP32;
736
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
737
+ NlastDichotomyAdd<RSize>::LoadAndAccumulate(aReg, curSrcA, curSrcB, pMask, stride);
738
+ DataCopy((__local_mem__ float*)dst + i * VL_FP32, aReg, pMask);
739
+ }
740
+ }
741
+ }
742
+ }
743
+
744
+ __aicore__ inline void SoftmaxV2OpsBase::NlastReduceSumSmallR(const LocalTensor<float>& dstTensor,
745
+ const LocalTensor<float>& srcTensor, const int64_t rSize,
746
+ const int64_t aSize, const int64_t stride)
747
+ {
748
+ // NlastReduceSumSmallR
749
+ if (aSize <= CONST_ZERO) {
750
+ return;
751
+ }
752
+ if (rSize == CONST_ONE) {
753
+ NlastReduceSumSmallR<CONST_ONE>(dstTensor, srcTensor, aSize, stride);
754
+ } else if (rSize == CONST_TWO) {
755
+ NlastReduceSumSmallR<CONST_TWO>(dstTensor, srcTensor, aSize, stride);
756
+ } else if (rSize == CONST_THREE) {
757
+ NlastReduceSumSmallR<CONST_THREE>(dstTensor, srcTensor, aSize, stride);
758
+ } else if (rSize == CONST_FOUR) {
759
+ NlastReduceSumSmallR<CONST_FOUR>(dstTensor, srcTensor, aSize, stride);
760
+ } else if (rSize == CONST_FIVE) {
761
+ NlastReduceSumSmallR<CONST_FIVE>(dstTensor, srcTensor, aSize, stride);
762
+ } else if (rSize == CONST_SIX) {
763
+ NlastReduceSumSmallR<CONST_SIX>(dstTensor, srcTensor, aSize, stride);
764
+ } else if (rSize == CONST_SEVEN) {
765
+ NlastReduceSumSmallR<CONST_SEVEN>(dstTensor, srcTensor, aSize, stride);
766
+ } else if (rSize == CONST_EIGHT) {
767
+ NlastReduceSumSmallR<CONST_EIGHT>(dstTensor, srcTensor, aSize, stride);
768
+ }
769
+ }
770
+
771
+ template <int32_t TailCount>
772
+ __aicore__ inline void SoftmaxV2OpsBase::NlastReduceSumLargeR(const LocalTensor<float>& dstTensor,
773
+ const LocalTensor<float>& srcTensor,
774
+ const LocalTensor<float>& reduceSumTempTensor,
775
+ const int64_t rSize, const int64_t aSize,
776
+ const int64_t stride)
777
+ {
778
+ // NlastReduceSumLargeR
779
+ constexpr static uint32_t COMPRESSION = 8;
780
+ int64_t foldPoint = FindNearestPower2(rSize);
781
+ uint16_t outerLoopTimes =
782
+ ops::CeilDiv(static_cast<int64_t>(aSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
783
+ uint16_t mainFoldLoopTimes =
784
+ ops::FloorDiv(static_cast<int64_t>(rSize - foldPoint), static_cast<int64_t>(COMPRESSION));
785
+ uint16_t tailFoldLoopTimes =
786
+ ops::CeilDiv(static_cast<int64_t>(rSize - foldPoint), static_cast<int64_t>(COMPRESSION)) - mainFoldLoopTimes;
787
+ uint16_t unFoldLoopTimes = (foldPoint / COMPRESSION) -
788
+ ops::CeilDiv(static_cast<int64_t>(rSize - foldPoint), static_cast<int64_t>(COMPRESSION));
789
+ uint32_t foldOffset = foldPoint * stride;
790
+ uint32_t srcStride = COMPRESSION * stride;
791
+ uint32_t unFoldSrcOffset =
792
+ ops::CeilDiv(static_cast<int64_t>(rSize - foldPoint), static_cast<int64_t>(COMPRESSION)) * COMPRESSION * stride;
793
+ uint32_t unFoldDstOffset =
794
+ ops::CeilDiv(static_cast<int64_t>(rSize - foldPoint), static_cast<int64_t>(COMPRESSION)) * stride;
795
+ uint32_t outerLoopStride = VL_FP32;
796
+ uint32_t innerLoopStride = stride;
797
+ uint32_t tailFoldVLCount =
798
+ rSize - ops::FloorDiv(static_cast<int64_t>(rSize), static_cast<int64_t>(COMPRESSION)) * COMPRESSION;
799
+ __VEC_SCOPE__
800
+ {
801
+ uint32_t count = static_cast<uint32_t>(aSize);
802
+ AscendC::MicroAPI::RegTensor<float> aReg;
803
+ AscendC::MicroAPI::MaskReg pMask;
804
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
805
+ pMask = plt_b32(count, POST_UPDATE);
806
+ for (uint16_t j = 0; j < mainFoldLoopTimes; ++j) {
807
+ __local_mem__ float* dst =
808
+ (__local_mem__ float*)reduceSumTempTensor.GetPhyAddr() + i * outerLoopStride + j * innerLoopStride;
809
+ __local_mem__ float* srcA =
810
+ (__local_mem__ float*)srcTensor.GetPhyAddr() + i * outerLoopStride + j * srcStride;
811
+ __local_mem__ float* srcB =
812
+ (__local_mem__ float*)srcTensor.GetPhyAddr() + stride + i * outerLoopStride + j * srcStride;
813
+ NlastDichotomyAdd<COMPRESSION>::LoadAndAccumulate(aReg, srcA, srcB, pMask, stride, foldOffset);
814
+ DataCopy((__local_mem__ float*)dst, aReg, pMask);
815
+ }
816
+ for (uint16_t j = 0; j < tailFoldLoopTimes; ++j) {
817
+ __local_mem__ float* dst = (__local_mem__ float*)reduceSumTempTensor.GetPhyAddr() +
818
+ i * outerLoopStride + mainFoldLoopTimes * innerLoopStride;
819
+ __local_mem__ float* srcA =
820
+ (__local_mem__ float*)srcTensor.GetPhyAddr() + i * outerLoopStride + mainFoldLoopTimes * srcStride;
821
+ __local_mem__ float* srcB = (__local_mem__ float*)srcTensor.GetPhyAddr() + stride +
822
+ i * outerLoopStride + mainFoldLoopTimes * srcStride;
823
+ NlastDichotomyAdd<COMPRESSION, TailCount>::LoadAndAccumulate(aReg, srcA, srcB, pMask, stride,
824
+ foldOffset);
825
+ DataCopy((__local_mem__ float*)dst, aReg, pMask);
826
+ }
827
+ for (uint16_t j = 0; j < unFoldLoopTimes; ++j) {
828
+ __local_mem__ float* dst = (__local_mem__ float*)reduceSumTempTensor.GetPhyAddr() + unFoldDstOffset +
829
+ i * outerLoopStride + j * innerLoopStride;
830
+ __local_mem__ float* srcA = (__local_mem__ float*)srcTensor.GetPhyAddr() + unFoldSrcOffset +
831
+ i * outerLoopStride + j * srcStride;
832
+ __local_mem__ float* srcB = (__local_mem__ float*)srcTensor.GetPhyAddr() + unFoldSrcOffset + stride +
833
+ i * outerLoopStride + j * srcStride;
834
+ NlastDichotomyAdd<COMPRESSION>::LoadAndAccumulate(aReg, srcA, srcB, pMask, stride);
835
+ DataCopy((__local_mem__ float*)dst, aReg, pMask);
836
+ }
837
+ }
838
+ }
839
+ NlastReduceSumSmallR(dstTensor, reduceSumTempTensor, (foldPoint / COMPRESSION), aSize, stride);
840
+ }
841
+
842
+ __aicore__ inline void SoftmaxV2OpsBase::NlastReduceSum(const LocalTensor<float>& dstTensor,
843
+ const LocalTensor<float>& srcTensor,
844
+ const LocalTensor<float>& reduceSumTempTensor,
845
+ const int64_t rSize, const int64_t aSize, const int64_t stride)
846
+ {
847
+ // NlastReduceSum
848
+ if (rSize <= 0) {
849
+ return;
850
+ }
851
+ if (aSize <= 0) {
852
+ return;
853
+ }
854
+ if (rSize <= CONST_EIGHT) {
855
+ NlastReduceSumSmallR(dstTensor, srcTensor, rSize, aSize, stride);
856
+ return;
857
+ }
858
+
859
+ constexpr static uint32_t COMPRESSION = 8;
860
+ int32_t tailCount =
861
+ rSize - ops::FloorDiv(static_cast<int64_t>(rSize), static_cast<int64_t>(COMPRESSION)) * COMPRESSION;
862
+ if (tailCount == CONST_ZERO) {
863
+ NlastReduceSumLargeR<CONST_ZERO>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
864
+ } else if (tailCount == CONST_ONE) {
865
+ NlastReduceSumLargeR<CONST_ONE>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
866
+ } else if (tailCount == CONST_TWO) {
867
+ NlastReduceSumLargeR<CONST_TWO>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
868
+ } else if (tailCount == CONST_THREE) {
869
+ NlastReduceSumLargeR<CONST_THREE>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
870
+ } else if (tailCount == CONST_FOUR) {
871
+ NlastReduceSumLargeR<CONST_FOUR>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
872
+ } else if (tailCount == CONST_FIVE) {
873
+ NlastReduceSumLargeR<CONST_FIVE>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
874
+ } else if (tailCount == CONST_SIX) {
875
+ NlastReduceSumLargeR<CONST_SIX>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
876
+ } else if (tailCount == CONST_SEVEN) {
877
+ NlastReduceSumLargeR<CONST_SEVEN>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
878
+ } else if (tailCount == CONST_EIGHT) {
879
+ NlastReduceSumLargeR<CONST_EIGHT>(dstTensor, srcTensor, reduceSumTempTensor, rSize, aSize, stride);
880
+ }
881
+ }
882
+
883
+ __aicore__ inline void SoftmaxV2OpsBase::UpdateCache(const LocalTensor<float>& dstTensor,
884
+ const LocalTensor<float>& srcTensor, const int64_t cacheID,
885
+ const int64_t stride, const int64_t count)
886
+ {
887
+ // UpdateCache
888
+ uint16_t outerLoopTimes =
889
+ ops::CeilDiv(static_cast<int64_t>(count * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
890
+ uint16_t innerLoopTimes = cacheID;
891
+ uint32_t outerLoopStride = VL_FP32;
892
+ uint32_t innerLoopStride = stride;
893
+ __VEC_SCOPE__
894
+ {
895
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
896
+ __local_mem__ float* cah = (__local_mem__ float*)dstTensor.GetPhyAddr() + cacheID * stride;
897
+ __local_mem__ float* src = (__local_mem__ float*)srcTensor.GetPhyAddr();
898
+ uint32_t sreg = static_cast<uint32_t>(count);
899
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg;
900
+ AscendC::MicroAPI::MaskReg pMask;
901
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
902
+ pMask = AscendC::MicroAPI::UpdateMask<float>(sreg);
903
+ DataCopy(aReg, (__local_mem__ float*)src + i * outerLoopStride);
904
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
905
+ DataCopy(bReg, (__local_mem__ float*)dst + i * outerLoopStride + j * innerLoopStride);
906
+ Add<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(aReg, aReg, bReg, pMask);
907
+ }
908
+ DataCopy((__local_mem__ float*)cah + i * outerLoopStride, aReg, pMask);
909
+ }
910
+ }
911
+ }
912
+
913
+ __aicore__ inline void SoftmaxV2OpsBase::Normalize(const LocalTensor<float>& dstTensor,
914
+ const LocalTensor<float>& srcTensor,
915
+ const LocalTensor<float>& meanTensor,
916
+ const LocalTensor<float>& rstdTensor, const int64_t rowSize,
917
+ const int64_t colSize)
918
+ {
919
+ // Normalize
920
+ uint16_t outerLoopTimes = rowSize;
921
+ uint16_t innerLoopTimes =
922
+ ops::CeilDiv(static_cast<int64_t>(colSize * sizeof(float)), static_cast<int64_t>(GetVRegSize()));
923
+ uint32_t outerLoopStride = colSize;
924
+ uint32_t innerLoopStride = VL_FP32;
925
+ __VEC_SCOPE__
926
+ {
927
+ __local_mem__ float* dst = (__local_mem__ float*)dstTensor.GetPhyAddr();
928
+ __local_mem__ float* src = (__local_mem__ float*)srcTensor.GetPhyAddr();
929
+ __local_mem__ float* mean = (__local_mem__ float*)meanTensor.GetPhyAddr();
930
+ __local_mem__ float* rstd = (__local_mem__ float*)rstdTensor.GetPhyAddr();
931
+ uint32_t count;
932
+ AscendC::MicroAPI::RegTensor<float> aReg, bReg, cReg;
933
+ AscendC::MicroAPI::RegTensor<float> meanReg, rstdReg;
934
+ AscendC::MicroAPI::MaskReg pMask;
935
+ for (uint16_t i = 0; i < outerLoopTimes; ++i) {
936
+ count = static_cast<uint32_t>(colSize);
937
+ DataCopy<float, AscendC::MicroAPI::LoadDist::DIST_BRC_B32>(meanReg, (__local_mem__ float*)mean + i);
938
+ DataCopy<float, AscendC::MicroAPI::LoadDist::DIST_BRC_B32>(rstdReg, (__local_mem__ float*)rstd + i);
939
+ for (uint16_t j = 0; j < innerLoopTimes; ++j) {
940
+ pMask = AscendC::MicroAPI::UpdateMask<float>(count);
941
+ DataCopy(aReg, (__local_mem__ float*)src + i * outerLoopStride + j * innerLoopStride);
942
+ Sub<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(bReg, aReg, meanReg, pMask);
943
+ Mul<float, AscendC::MicroAPI::MaskMergeMode::ZEROING>(cReg, bReg, rstdReg, pMask);
944
+ DataCopy((__local_mem__ float*)dst + i * outerLoopStride + j * innerLoopStride, cReg, pMask);
945
+ }
946
+ }
947
+ }
948
+ }
949
+ } // namespace SoftmaxV2Ops
950
+ #endif