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.
- package/README.md +183 -2
- package/THIRD_PARTY_NOTICES.md +85 -0
- package/cordis.patch.yml +3 -0
- package/doctor/LICENSE +202 -0
- package/doctor/NOTICE +12 -0
- package/doctor/README.md +18 -0
- package/lib/client.js +94437 -0
- package/lib/index.d.ts +722 -0
- package/lib/index.js +33711 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +171 -4
- package/skills/asc-tools/tool-ops-tune/INSTALL.md +52 -0
- package/skills/asc-tools/tool-ops-tune/LICENSE +38 -0
- package/skills/asc-tools/tool-ops-tune/README.md +167 -0
- package/skills/asc-tools/tool-ops-tune/SKILL.md +93 -0
- package/skills/asc-tools/tool-ops-tune/agent/AGENTS.md +195 -0
- package/skills/asc-tools/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
- package/skills/asc-tools/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
- package/skills/asc-tools/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
- package/skills/asc-tools/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
- package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
- package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
- package/skills/asc-tools/tool-ops-tune/docs/ops-tune-design.md +404 -0
- package/skills/asc-tools/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +730 -0
- 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
- package/skills/asc-tools/tool-ops-tune/evals/evals.json +242 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/SKILL.md +146 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_board.sh +458 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1102 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/isolation_test.py +452 -0
- package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/SKILL.md +76 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/index.md +9 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +87 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
- package/skills/asc-tools/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
- package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
- package/skills/asc-tools/tool-ops-tune/ops-report/SKILL.md +77 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/run_evals.py +963 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +535 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +466 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/delta_compare.py +278 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/render_html.py +304 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
- package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/verdict.py +1094 -0
- package/skills/asc-tools/tool-ops-tune/scripts/diff_audit.py +281 -0
- package/skills/asc-tools/tool-precision-debug/LICENSE +38 -0
- package/skills/asc-tools/tool-precision-debug/README.md +190 -0
- package/skills/asc-tools/tool-precision-debug/scripts/install.sh +475 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/LICENSE +38 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/SKILL.md +136 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/evals/evals.json +932 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/baseline.md +69 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/checkpoint-design.md +82 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/dumptensor.md +83 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/hypothesis-experiment.md +114 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/index.md +20 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/localization.md +85 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/numerical-modeling.md +94 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/operator-modeling.md +116 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/progressive-error-analysis.md +86 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reporting.md +140 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reproducibility.md +121 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/semantic-bisection.md +72 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/sensitive-points.md +146 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fp16-promotion-boundary.md +46 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fused-rmsnorm-gelu-residual.md +162 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/index.md +16 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/integer-float-collision.md +44 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/partial-statistics-merge.md +30 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/softplus-v2-grad-family.md +156 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/sync-dataflow-handshake.md +89 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/tail-valid-region-state.md +30 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/thnn-fused-gru-bias-reduction.md +73 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/index.md +34 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/accumulation-order.md +108 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/algorithm-parameter-contract.md +118 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/buffer-lifetime-alias.md +133 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/cast-rounding.md +76 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/complex-operator-boundary.md +48 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/data-movement-alignment.md +104 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/golden-host-contract.md +84 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index-address-ownership.md +57 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index.md +32 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/multicore-ownership.md +117 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/pipeline-sync-visibility.md +146 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/precision-mode-approximation.md +90 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/shape-boundary-contract.md +57 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/special-values.md +122 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/tiling-tail-state.md +146 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/broadcast-transpose.md +64 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/convolution.md +60 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/dynamic-quant.md +47 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/index.md +18 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/matmul-mmad.md +131 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/normalization.md +145 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/reduction.md +167 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/softplus-v2-grad.md +58 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/sort-merge.md +65 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/index.md +18 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/kernel-debug-data.md +133 -0
- package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/msobjdump.md +150 -0
- package/skills/cann-doctor/SKILL.md +15 -0
- package/skills/catalog.json +79 -0
- package/skills/mattpocock/GLOSSARY.md +30 -0
- package/skills/mattpocock/LICENSE +21 -0
- package/skills/mattpocock/README.md +258 -0
- package/skills/mattpocock/SCOPE.md +35 -0
- package/skills/mattpocock/docs/agents/triage-labels.md +15 -0
- package/skills/mattpocock/docs/engineering/ask-matt.md +91 -0
- package/skills/mattpocock/docs/engineering/code-review.md +101 -0
- package/skills/mattpocock/docs/engineering/codebase-design.md +88 -0
- package/skills/mattpocock/docs/engineering/diagnosing-bugs.md +94 -0
- package/skills/mattpocock/docs/engineering/domain-modeling.md +86 -0
- package/skills/mattpocock/docs/engineering/grill-with-docs.md +82 -0
- package/skills/mattpocock/docs/engineering/implement-spec.md +86 -0
- package/skills/mattpocock/docs/engineering/implement.md +97 -0
- package/skills/mattpocock/docs/engineering/improve-codebase-architecture.md +113 -0
- package/skills/mattpocock/docs/engineering/pr.md +79 -0
- package/skills/mattpocock/docs/engineering/prototype.md +67 -0
- package/skills/mattpocock/docs/engineering/research.md +73 -0
- package/skills/mattpocock/docs/engineering/resolving-merge-conflicts.md +53 -0
- package/skills/mattpocock/docs/engineering/retro.md +81 -0
- package/skills/mattpocock/docs/engineering/setup-matt-pocock-skills.md +94 -0
- package/skills/mattpocock/docs/engineering/tdd.md +94 -0
- package/skills/mattpocock/docs/engineering/to-spec.md +81 -0
- package/skills/mattpocock/docs/engineering/to-tickets.md +99 -0
- package/skills/mattpocock/docs/engineering/triage.md +109 -0
- package/skills/mattpocock/docs/engineering/wayfinder.md +103 -0
- package/skills/mattpocock/docs/engineering/wizard.md +96 -0
- package/skills/mattpocock/docs/productivity/grill-me.md +76 -0
- package/skills/mattpocock/docs/productivity/grilling.md +87 -0
- package/skills/mattpocock/docs/productivity/handoff.md +76 -0
- package/skills/mattpocock/docs/productivity/teach.md +97 -0
- package/skills/mattpocock/docs/productivity/to-questionnaire.md +78 -0
- package/skills/mattpocock/docs/productivity/wait-what.md +36 -0
- package/skills/mattpocock/docs/productivity/writing-for-agents.md +70 -0
- package/skills/mattpocock/scripts/link-skills.sh +62 -0
- package/skills/mattpocock/scripts/list-skills.sh +7 -0
- package/skills/mattpocock/scripts/sync-plugin-version.mjs +41 -0
- package/skills/mattpocock/skills/deprecated/README.md +3 -0
- package/skills/mattpocock/skills/engineering/README.md +34 -0
- package/skills/mattpocock/skills/engineering/ask-matt/PHASE-BOUNDARIES.md +55 -0
- package/skills/mattpocock/skills/engineering/ask-matt/SKILL.md +97 -0
- package/skills/mattpocock/skills/engineering/ask-matt/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/code-review/SKILL.md +89 -0
- package/skills/mattpocock/skills/engineering/code-review/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/codebase-design/DEEPENING.md +37 -0
- package/skills/mattpocock/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/skills/mattpocock/skills/engineering/codebase-design/SKILL.md +114 -0
- package/skills/mattpocock/skills/engineering/codebase-design/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/diagnosing-bugs/SKILL.md +138 -0
- package/skills/mattpocock/skills/engineering/diagnosing-bugs/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
- package/skills/mattpocock/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
- package/skills/mattpocock/skills/engineering/domain-modeling/GLOSSARY-FORMAT.md +60 -0
- package/skills/mattpocock/skills/engineering/domain-modeling/SKILL.md +74 -0
- package/skills/mattpocock/skills/engineering/domain-modeling/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/grill-with-docs/SKILL.md +7 -0
- package/skills/mattpocock/skills/engineering/grill-with-docs/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/implement/SKILL.md +17 -0
- package/skills/mattpocock/skills/engineering/implement/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/implement-spec/SKILL.md +42 -0
- package/skills/mattpocock/skills/engineering/implement-spec/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/skills/mattpocock/skills/engineering/improve-codebase-architecture/SKILL.md +71 -0
- package/skills/mattpocock/skills/engineering/improve-codebase-architecture/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/pr/CREDITS.md +3 -0
- package/skills/mattpocock/skills/engineering/pr/SKILL.md +170 -0
- package/skills/mattpocock/skills/engineering/pr/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/prototype/LOGIC.md +67 -0
- package/skills/mattpocock/skills/engineering/prototype/SKILL.md +26 -0
- package/skills/mattpocock/skills/engineering/prototype/UI.md +112 -0
- package/skills/mattpocock/skills/engineering/prototype/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/research/SKILL.md +12 -0
- package/skills/mattpocock/skills/engineering/research/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/retro/SKILL.md +44 -0
- package/skills/mattpocock/skills/engineering/retro/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/SKILL.md +120 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +50 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
- package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/skills/mattpocock/skills/engineering/tdd/SKILL.md +38 -0
- package/skills/mattpocock/skills/engineering/tdd/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/tdd/mocking.md +59 -0
- package/skills/mattpocock/skills/engineering/tdd/tests.md +77 -0
- package/skills/mattpocock/skills/engineering/to-spec/SKILL.md +75 -0
- package/skills/mattpocock/skills/engineering/to-spec/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/to-tickets/SKILL.md +105 -0
- package/skills/mattpocock/skills/engineering/to-tickets/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/triage/AGENT-BRIEF.md +207 -0
- package/skills/mattpocock/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
- package/skills/mattpocock/skills/engineering/triage/SKILL.md +112 -0
- package/skills/mattpocock/skills/engineering/triage/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/wayfinder/SKILL.md +128 -0
- package/skills/mattpocock/skills/engineering/wayfinder/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/engineering/wizard/SKILL.md +44 -0
- package/skills/mattpocock/skills/engineering/wizard/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/engineering/wizard/template.sh +223 -0
- package/skills/mattpocock/skills/in-progress/README.md +17 -0
- package/skills/mattpocock/skills/in-progress/chief-of-staff/SKILL.md +75 -0
- package/skills/mattpocock/skills/in-progress/chief-of-staff/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/claude-handoff/SKILL.md +18 -0
- package/skills/mattpocock/skills/in-progress/claude-handoff/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/loop-me/SKILL.md +32 -0
- package/skills/mattpocock/skills/in-progress/loop-me/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/SKILL.md +102 -0
- package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
- package/skills/mattpocock/skills/in-progress/software-factory/EXAMPLE-TASKS.md +80 -0
- package/skills/mattpocock/skills/in-progress/software-factory/GIT-HOSTS.md +84 -0
- package/skills/mattpocock/skills/in-progress/software-factory/OBSERVABILITY-PLATFORMS.md +75 -0
- package/skills/mattpocock/skills/in-progress/software-factory/RUNNERS.md +94 -0
- package/skills/mattpocock/skills/in-progress/software-factory/SKILL.md +98 -0
- package/skills/mattpocock/skills/in-progress/software-factory/TICKET-TRACKERS.md +85 -0
- package/skills/mattpocock/skills/in-progress/writing-beats/SKILL.md +67 -0
- package/skills/mattpocock/skills/in-progress/writing-beats/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/writing-fragments/SKILL.md +79 -0
- package/skills/mattpocock/skills/in-progress/writing-fragments/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/in-progress/writing-shape/SKILL.md +79 -0
- package/skills/mattpocock/skills/in-progress/writing-shape/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/misc/README.md +8 -0
- package/skills/mattpocock/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
- package/skills/mattpocock/skills/misc/git-guardrails-claude-code/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
- package/skills/mattpocock/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
- package/skills/mattpocock/skills/misc/migrate-to-shoehorn/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/misc/scaffold-exercises/SKILL.md +106 -0
- package/skills/mattpocock/skills/misc/scaffold-exercises/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/misc/setup-pre-commit/SKILL.md +91 -0
- package/skills/mattpocock/skills/misc/setup-pre-commit/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/productivity/README.md +20 -0
- package/skills/mattpocock/skills/productivity/grill-me/SKILL.md +7 -0
- package/skills/mattpocock/skills/productivity/grill-me/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/productivity/grilling/SKILL.md +30 -0
- package/skills/mattpocock/skills/productivity/grilling/agents/openai.yaml +3 -0
- package/skills/mattpocock/skills/productivity/handoff/SKILL.md +16 -0
- package/skills/mattpocock/skills/productivity/handoff/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
- package/skills/mattpocock/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/skills/mattpocock/skills/productivity/teach/MISSION-FORMAT.md +31 -0
- package/skills/mattpocock/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
- package/skills/mattpocock/skills/productivity/teach/SKILL.md +140 -0
- package/skills/mattpocock/skills/productivity/teach/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/productivity/to-questionnaire/SKILL.md +54 -0
- package/skills/mattpocock/skills/productivity/to-questionnaire/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/productivity/wait-what/SKILL.md +7 -0
- package/skills/mattpocock/skills/productivity/wait-what/agents/openai.yaml +5 -0
- package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL-MECHANICS.md +22 -0
- package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL.md +81 -0
- package/skills/mattpocock/skills/productivity/writing-for-agents/agents/openai.yaml +3 -0
- package/skills/task-agents/operator-development/Agent.md +71 -0
- package/skills/task-agents/operator-development/skills.json +120 -0
- package/skills/task-agents/operator-development/stages.schema.json +532 -0
- package/skills/task-agents/performance-optimization/Agent.md +78 -0
- package/skills/task-agents/performance-optimization/skills.json +64 -0
- package/skills/task-agents/response-protocol.md +35 -0
- package/skills/task-agents/sidebar-contracts.schema.json +4168 -0
- package/skills/task-agents/sidebar-selection.schema.json +971 -0
- package/skills/task-agents/visuals/components.json +283 -0
- package/skills/task-agents/visuals/contracts.schema.json +3628 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 实现①:NDDMA 搬入即广播
|
|
2
|
+
|
|
3
|
+
> 主文档:[broadcast_design.md](broadcast_design.md) | 参考代码:[`code/broadcast_tiling_common.h`](code/broadcast_tiling_common.h)(`MakeNddmaParams` / `BroadcastNddma`)
|
|
4
|
+
|
|
5
|
+
## 思路
|
|
6
|
+
|
|
7
|
+
用多维 DMA(NDDMA)一次搬运,把广播轴的源 stride 置 0 → DMA 引擎在 GM→UB 过程中自动复制。**不占 Vector 单元**(只走 MTE2)。
|
|
8
|
+
|
|
9
|
+
## 适用
|
|
10
|
+
|
|
11
|
+
有广播轴、广播轴落在 UB tile **内**(切分轴或其下的尾轴),且**不满足 ③ 的条件**:
|
|
12
|
+
- 大 dtype(FP32/INT32 等,不在 {INT8,UINT8,FP16,BF16,INT16,UINT16});
|
|
13
|
+
- 或 B8/B16 但尾轴**非对齐**。
|
|
14
|
+
|
|
15
|
+
判定走 ① 还是 ② 看 `outputStrides[ubSplitAxis] != inputStrides[ubSplitAxis]`——这表示 **UB tile 内 split 轴跨度不一致**(切分轴广播,或切分轴连续但其下尾轴广播,如 `[M,1]→[M,N]`),此时走 ① DMA 复制;tile 内完全连续(广播轴全在外层)则退化为 ②。
|
|
16
|
+
|
|
17
|
+
## Kernel 写法
|
|
18
|
+
|
|
19
|
+
```cpp
|
|
20
|
+
// 每核外循环(节选,完整见 code/broadcast_add_kernel.cpp)
|
|
21
|
+
for (int64_t loop = 0; loop < ubLoopNum; loop++) {
|
|
22
|
+
if (loop != 0) UpdateAxesIndices(axes, outputDims, ubSplitAxis, ubOuter);
|
|
23
|
+
int64_t rows = (axes[ubSplitAxis] == ubOuter - 1) ? ubTail : ubFormer;
|
|
24
|
+
int64_t off = GetGmOffset(axes, inputStrides[i], ubSplitAxis, ubFormer);
|
|
25
|
+
LocalTensor<T> ub = que.AllocTensor<T>();
|
|
26
|
+
BroadcastNddma(xGm[off], ub, outputDims, outputStrides, inputStrides[i],
|
|
27
|
+
shapeLen, ubSplitAxis, /*ubSplitSize=*/rows); // ← code/broadcast_tiling_common.h
|
|
28
|
+
que.EnQue(ub);
|
|
29
|
+
// ... 计算 + CopyOut
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`BroadcastNddma` 内部(`code/broadcast_tiling_common.h`):
|
|
34
|
+
|
|
35
|
+
```cpp
|
|
36
|
+
if (outputStrides[ubSplitAxis] != inputStrides[ubSplitAxis]) { // tile 内 split 轴跨度不一致 → ①
|
|
37
|
+
auto params = MakeNddmaParams<T>(...); // 广播轴 loopSrcStride=0
|
|
38
|
+
static constexpr AscendC::MultiCopyConfig cfg = {false, 0, 0, false}; // 必须 static:模板参为 const&
|
|
39
|
+
AscendC::DataCopy<T, NDDMA_DIM, cfg>(ub, gm, params); // 多维 DMA
|
|
40
|
+
} else { // tile 内完全连续 → 落 ②
|
|
41
|
+
AscendC::DataCopyPad(ub, gm, ext, pad);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
参数装配 `MakeNddmaParams`:从尾轴往前填 `NDDMA_DIM(=5)` 个轴,广播轴的 `loopSrcStride` 天然为 0(因 `inputStrides[广播轴]=0`)→ 引擎复制;非广播轴填真实 stride。高位不足补 `loopSize=1` 的轴。
|
|
46
|
+
|
|
47
|
+
## 注意
|
|
48
|
+
|
|
49
|
+
- `NDDMA_DIM = 5`:单次多维 DMA 最多 5 维。`rank = shapeLen - ubSplitAxis > 5` 时 `MakeNddmaParams` 的 `axisInsideUb` 会变负越界。官方 atvoss 走 with-loop NDDMA(按融合轴拆,`BroadcastNddmaWithLoop`);**本样例未实现 with-loop,因此 Host 选型在 rank>5 时回退 ③ BRC_UB**(见 `broadcast_add_tiling.cpp` 的 rank 兜底)。
|
|
50
|
+
- 广播轴 `loopSrcStride = 0` 是复制关键;非广播轴填真实 stride。
|
|
51
|
+
- `MultiCopyParams` 的 `constValue` 仅 pad 场景用,正常广播取 0。
|
|
52
|
+
- 与 ② 共用同一段 kernel:是否进 ① 由运行期 `outputStrides[ubSplitAxis] != inputStrides[ubSplitAxis]`(tile 内 split 轴跨度不一致)决定,不等同于"切分轴是广播轴"。
|
|
53
|
+
- `cfg` 必须是 `static constexpr`:`DataCopy` 第三模板参为 `const MultiCopyConfig&`,需静态存储期,局部 `constexpr` 编不过。
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# 实现④:OneDim 合轴塌一维快路径(标量广播)
|
|
2
|
+
|
|
3
|
+
> 主文档:[broadcast_design.md](broadcast_design.md) | 原语:[`code/broadcast_tiling_common.h`](code/broadcast_tiling_common.h)(`TryOneDim` / `ComputeOneDimTiling` / `OneDimCalcCore` / `OneDimLoadInput`)
|
|
4
|
+
> 端到端样例:[Host](code/onedim_add_tiling.cpp) + [Kernel](code/onedim_add_kernel.cpp)(`z = x + y`,y 为标量)
|
|
5
|
+
|
|
6
|
+
## 思路
|
|
7
|
+
|
|
8
|
+
很多广播在**合轴**(把相邻、广播状态一致的轴乘到一起)后会塌成一维:此时每个输入要么是**满 shape 的连续大块**,要么是**纯标量**(一个值)。这类场景没必要套多维 NDDMA 参数装配、也不必调 UB `Broadcast` 指令——
|
|
9
|
+
|
|
10
|
+
- **满 shape 输入**:一维连续,逐块 `DataCopyPad` 搬入即可;
|
|
11
|
+
- **标量输入**:**首块用 `Duplicate` 把那一个值铺满 UB,后续块直接复用**,完全不走逐块 DMA。
|
|
12
|
+
|
|
13
|
+
这是 `z = x + lr`、`z = x * scale`、`alpha·x + y` 这类「标量参与 elementwise」以及同 shape elementwise 的最快写法。固定成本也最低:tiling 退化成一维(只需 1D 总长 / 块大小 / 核数),切分让 kernel 运行期自己推。
|
|
14
|
+
|
|
15
|
+
> 对标 atvoss `SCH_MODE_ONE_DIM_ADVANCE`(schMode 202):tiling 极简(`dimLen/tileNum/blockNum/scalarFlag`)、kernel 运行期派生 `ubOuter/ubTail/blockFormer/blockTail`,省去结构体拷贝与多维下标还原。atvoss 在入出参 >4 或 DAG 带 Var 标量属性时退回普通 `SCH_MODE_ONE_DIM`(201,Host 预切分),本指导只吸收 Advance 形态——纯 AscendC 下没有 Var 概念,运行期标量属性由算子自行经 tiling 传入即可。
|
|
16
|
+
|
|
17
|
+
## 适用
|
|
18
|
+
|
|
19
|
+
合轴后能塌成一维,即**每个输入都满足「纯标量」或「满 shape 连续」之一**:
|
|
20
|
+
|
|
21
|
+
- ✅ `z = x + scalar`(标量广播);
|
|
22
|
+
- ✅ `z = x op y`,x、y 同 shape(无广播,纯 elementwise);
|
|
23
|
+
- ✅ 多输入混合:部分满 shape、部分标量。
|
|
24
|
+
- ❌ `[M,1] → [M,N]`、`[1,N] → [M,N]` 这类**部分轴广播**:合轴后仍是多维,**不属本路径**,回到 ①②③ 选型。
|
|
25
|
+
|
|
26
|
+
判定见 `TryOneDim`:逐输入算元素总数,`==1` 记为标量(置 `scalarFlag` 对应位),`==dimLen` 是满 shape,二者皆非则不能塌一维。
|
|
27
|
+
|
|
28
|
+
## Host:选型 + 极简 Tiling
|
|
29
|
+
|
|
30
|
+
OneDim 是在三类选型**之前**的前置分流:先 `TryOneDim`,命中就走 OneDim,否则才进 §1.3 的 `PickBroadcastMode`。
|
|
31
|
+
|
|
32
|
+
```cpp
|
|
33
|
+
// 节选,完整见 code/onedim_add_tiling.cpp。在通用切分 / PickBroadcastMode 之前先试 OneDim
|
|
34
|
+
int64_t dimLen; int32_t scalarFlag;
|
|
35
|
+
if (TryOneDim(td, dimLen, scalarFlag)) { // 合轴塌一维(每输入满 or 标量)
|
|
36
|
+
OneDimTilingData tiling;
|
|
37
|
+
ComputeOneDimTiling(tiling, dimLen, scalarFlag, dtSize, coreNum, ubSize, /*aliveBuf=*/IN_NUM + 1);
|
|
38
|
+
// 写 tiling 进 tilingData,tilingKey 标记走 OneDim 分支
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// 否则:ComputeTiling(...) + 逐输入 PickBroadcastMode(...)(见 broadcast_design.md §1)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`ComputeOneDimTiling`(`code/broadcast_tiling_common.h`)只算三个量,**不预切分**:
|
|
45
|
+
|
|
46
|
+
```cpp
|
|
47
|
+
tileNum = AlignDown(ubSize / (aliveBuf * dtSize * DB_LOOP), alignEle); // 单块元素数
|
|
48
|
+
ubOuter = ceil(dimLen / tileNum); // 共几块
|
|
49
|
+
blockNum = min(coreNum, ubOuter); // 块数不足核数则减核(小 shape 自适应)
|
|
50
|
+
// dimLen / tileNum / blockNum / scalarFlag 即全部 tiling;ubTail/blockFormer/blockTail 交给 kernel
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
> 极简 TilingData 是 Advance 形态的精髓:搬运/切分细节全在 kernel 运行期由这几个标量推出,tiling 体积小、下发开销低。
|
|
54
|
+
|
|
55
|
+
## Kernel 写法
|
|
56
|
+
|
|
57
|
+
每核循环参数由 `OneDimCalcCore` 运行期推导;标量输入用单块 `TBuf`(首块 `Duplicate` 一次、后续复用),满 shape 输入用 `TQue` 双缓冲。
|
|
58
|
+
|
|
59
|
+
```cpp
|
|
60
|
+
// 节选,完整见 code/onedim_add_kernel.cpp。z = x + y,x 满 shape、y 可能是标量(scalarFlag bit1)
|
|
61
|
+
__aicore__ inline void Process() {
|
|
62
|
+
bool xScalar = ot_.scalarFlag & (1 << 0);
|
|
63
|
+
bool yScalar = ot_.scalarFlag & (1 << 1);
|
|
64
|
+
OneDimCoreParam cp = OneDimCalcCore(ot_.dimLen, ot_.tileNum, ot_.blockNum); // baseOffset/loops/tailLen
|
|
65
|
+
int64_t off = cp.baseOffset;
|
|
66
|
+
for (int64_t loop = 0; loop < cp.loops; loop++) {
|
|
67
|
+
int64_t len = (loop == cp.loops - 1) ? cp.tailLen : ot_.tileNum; // 最后一块可非对齐
|
|
68
|
+
|
|
69
|
+
LocalTensor<T> xl = xScalar ? xBuf_.Get<T>() : qx_.AllocTensor<T>();
|
|
70
|
+
OneDimLoadInput(xl, xGm_, off, len, xScalar, /*firstTile=*/loop == 0); // 标量仅首块 Duplicate
|
|
71
|
+
if (!xScalar) qx_.EnQue(xl);
|
|
72
|
+
LocalTensor<T> yl = yScalar ? yBuf_.Get<T>() : qy_.AllocTensor<T>();
|
|
73
|
+
OneDimLoadInput(yl, yGm_, off, len, yScalar, loop == 0);
|
|
74
|
+
if (!yScalar) qy_.EnQue(yl);
|
|
75
|
+
|
|
76
|
+
LocalTensor<T> xv = xScalar ? xl : qx_.DeQue<T>();
|
|
77
|
+
LocalTensor<T> yv = yScalar ? yl : qy_.DeQue<T>();
|
|
78
|
+
LocalTensor<T> zv = qz_.AllocTensor<T>();
|
|
79
|
+
AscendC::Add(zv, xv, yv, len);
|
|
80
|
+
qz_.EnQue(zv);
|
|
81
|
+
if (!xScalar) qx_.FreeTensor(xv);
|
|
82
|
+
if (!yScalar) qy_.FreeTensor(yv);
|
|
83
|
+
|
|
84
|
+
LocalTensor<T> zo = qz_.DeQue<T>();
|
|
85
|
+
AscendC::DataCopyExtParams ext{1, (uint32_t)(len * sizeof(T)), 0, 0, 0};
|
|
86
|
+
AscendC::DataCopyPad(zGm_[off], zo, ext); // 一维连续写回
|
|
87
|
+
qz_.FreeTensor(zo);
|
|
88
|
+
off += ot_.tileNum;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`OneDimLoadInput` 内部(`code/broadcast_tiling_common.h`):
|
|
94
|
+
|
|
95
|
+
```cpp
|
|
96
|
+
if (isScalar) {
|
|
97
|
+
if (firstTile) AscendC::Duplicate(dst, gm.GetValue(0), len); // 标量值铺满 UB;之后块复用同一块
|
|
98
|
+
} else {
|
|
99
|
+
DataCopyPadCompact(gm[offset], dst, len); // 满输入:一维连续搬,非对齐 Pad 兜底
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 注意
|
|
104
|
+
|
|
105
|
+
- **标量不进双缓冲队列**:标量首块铺满后整轮复用,应放单块 `TBuf`;若误塞进 depth=2 的 `TQue` 并每轮 Alloc,会丢掉"只填一次"的收益,还要处理 ping/pong 两块各填一次。
|
|
106
|
+
- **标量首块的 `len`**:首块用 `Duplicate(dst, val, len)` 铺当前块长度即可;后续块直接复用 `dst`,无需重铺(各块长度只有最后一块可能更短,复用块多出的尾部不参与计算/写回,无害)。
|
|
107
|
+
- **尾块非对齐**:一维总长 `dimLen` 常非 `alignEle` 倍数,最后一块 `tailLen` 非对齐——`DataCopyPad` 自动兜底,计算指令 `count` 传真实 `len` 即可(同 [advanced_tiling.md](advanced_tiling.md) §3)。
|
|
108
|
+
- **小 shape 减核**:`ubOuter < coreNum` 时 `ComputeOneDimTiling` 把 `blockNum` 降到 `ubOuter`,避免空核;`OneDimCalcCore` 的 `blockFormer/blockTail` 据此自洽。
|
|
109
|
+
- **UB 预算**:标量块按 1 份(非双缓冲)、满输入/输出按双缓冲计入 `aliveBuf`;示例取 `IN_NUM+1` 为保守上界。
|
|
110
|
+
- **double**:`GetValue`/`Duplicate` 标量对 double 需按位转 int64 处理(同 atvoss 对 `double` 的 reinterpret),其余 dtype 直接用。
|
|
111
|
+
|
|
112
|
+
## 与 ①②③ 的关系
|
|
113
|
+
|
|
114
|
+
OneDim 是**合轴塌一维时的前置快路径**,优先级高于三类选型——命中即用,命中不了才进 `PickBroadcastMode`。三类处理的是"合轴后仍多维"的部分轴广播(`[M,1]`/`[1,N]` 等)。决策树见 [broadcast_design.md](broadcast_design.md) §3。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 实现③:UB 内 Broadcast 指令
|
|
2
|
+
|
|
3
|
+
> 主文档:[broadcast_design.md](broadcast_design.md) | 参考代码:[`code/broadcast_tiling_common.h`](code/broadcast_tiling_common.h)(`UbBroadcast` / `FillUbShape`)
|
|
4
|
+
|
|
5
|
+
## 思路
|
|
6
|
+
|
|
7
|
+
先把紧凑源 `DataCopyPad` 搬进 UB,再用 `AscendC::Broadcast` 矢量指令在 UB 内展开到目标 shape。占 Vector 单元,但对**尾轴对齐 + 小字节类型**吞吐最高。还是唯一能广播**中间计算结果**的实现(① ② 只能广播 GM 输入)。
|
|
8
|
+
|
|
9
|
+
## 适用
|
|
10
|
+
|
|
11
|
+
**前提:tile 内要有 UB Broadcast 能展开的维(`dShape>sShape`)。** 两种会出 nan 的反例(cann-bench Maximum case 18 实测):
|
|
12
|
+
1. 广播轴**严格在外层**(`brcInTile=false`):UB 展不了外层轴 → 必须走 ②(offset 寻址)。
|
|
13
|
+
2. 广播轴是切分轴**但 `ubFormer==1`**:tile 内仅 1 行,`dShape==sShape` 空广播 → 必须走 ① NDDMA。
|
|
14
|
+
|
|
15
|
+
即需 `inTileExpandable`(切分轴以下某轴广播,或切分轴广播且 `ubFormer>1`)。满足后任一成立即用 ③:
|
|
16
|
+
- 尾轴对齐且 dtype ∈ {INT8, UINT8, FP16, BF16, INT16, UINT16}(B8/B16);
|
|
17
|
+
- 或 BigNLast:非尾轴广播且尾轴字节 ≥ `nddma dcache/2`(源码注释 ~4096B);
|
|
18
|
+
- 或广播的是上游计算结果而非 GM 输入。
|
|
19
|
+
|
|
20
|
+
## Kernel 写法
|
|
21
|
+
|
|
22
|
+
```cpp
|
|
23
|
+
// 节选,完整见 code/broadcast_add_kernel.cpp
|
|
24
|
+
LocalTensor<T> src = bufSrc_.Get<T>();
|
|
25
|
+
// 源长度按"源 shape"算,不能用展开后的输出 tile 长度(否则 [M,1] 尾轴广播会多搬 N 倍)
|
|
26
|
+
int64_t srcLen = UbSrcLen(inputStrides[i], inputDims[i], ubSplitAxis, shapeLen, rows);
|
|
27
|
+
DataCopyPadCompact(yGm[off], src, srcLen); // ① 紧凑搬入
|
|
28
|
+
UbBroadcast(dst, src, outputDims, inputDims[i], ubSplitAxis, shapeLen, rows); // ② UB 内展开
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`UbBroadcast` 内部(`code/broadcast_tiling_common.h`):
|
|
32
|
+
|
|
33
|
+
```cpp
|
|
34
|
+
uint32_t dShape[8], sShape[8];
|
|
35
|
+
FillUbShape(dShape, sShape, outputDims, inDims, ubSplitAxis, shapeLen, curRows); // 首轴随主/尾块变
|
|
36
|
+
int64_t rank = shapeLen - ubSplitAxis;
|
|
37
|
+
// ★退化守卫:所有 dShape==sShape(无可展开维,如尾块 rows==1)→ 直接 UB→UB 拷贝,否则空广播出 nan
|
|
38
|
+
bool anyExpand = false; int64_t cnt = 1;
|
|
39
|
+
for (int k = 0; k < rank; k++) { if (dShape[k] > sShape[k]) anyExpand = true; cnt *= dShape[k]; }
|
|
40
|
+
if (!anyExpand) { // 无可展开维 → dtype 无关 UB→UB 拷贝
|
|
41
|
+
int32_t alignEle = 32 / sizeof(T);
|
|
42
|
+
int32_t cntAlign = ((int32_t)cnt + alignEle - 1) / alignEle * alignEle; // 向上对齐,buffer=elemNum 不越界
|
|
43
|
+
AscendC::DataCopy(dst, src, cntAlign); return;
|
|
44
|
+
}
|
|
45
|
+
AscendC::BroadcastTiling bt;
|
|
46
|
+
AscendC::GetBroadcastTilingInfo<T>(rank, dShape, sShape, false, bt);
|
|
47
|
+
AscendC::Broadcast<T>(dst, src, dShape, sShape, &bt); // ← UB 矢量广播指令
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## rank(R)
|
|
51
|
+
|
|
52
|
+
- `R = shapeLen - ubSplitAxis`(UB tile 内参与广播的维数)。
|
|
53
|
+
- 静态已知且 ≤4 → 可用编译期 `Broadcast<T, R>` / `GetBroadcastTilingInfo<T, R>`,性能更好;
|
|
54
|
+
- 动态或超阈值 → 运行期 `Broadcast<T>`(如样例,R 作为运行期实参)。
|
|
55
|
+
- 尾块需把 `dstShape[0]`/`srcShape[0]` 改成 `ubTail` / 源尾块长度(`FillUbShape` 已按 `curRows` 处理)。
|
|
56
|
+
|
|
57
|
+
## 中间结果广播
|
|
58
|
+
|
|
59
|
+
若广播的是上游计算节点的输出(不是 GM 输入),**跳过 `DataCopyPadCompact`**,直接对上游 UB tensor 调 `UbBroadcast`。这是 ③ 相对 ① ② 的独占能力。
|
|
60
|
+
|
|
61
|
+
## 注意
|
|
62
|
+
|
|
63
|
+
- **退化守卫**:`UbBroadcast` 内先检查是否存在 `dShape>sShape` 的维;若无(如尾块 `rows==1` 或选型漏判),直接 `DataCopy(dst,src,对齐cnt)` 做 dtype 无关的 UB→UB 拷贝(不用 `Adds`,避免 int64 等不支持),而非调 `Broadcast`,防空广播出 nan。这是兜底,正确选型应优先在 host 侧避免(见上"前提")。
|
|
64
|
+
- UB 预算要**多留一块紧凑源 buffer**(样例的 `bufSrc_`):③ 是 src + dst 两块,① 只需一块。tiling 的 `aliveBuf` 要含这块。
|
|
65
|
+
- **每个走 ③ 的输入要各自一块 `bufSrc`**:若多个输入都可能 ③(如 binary 的 x1/x2 都广播),共用一块 `TBuf` 会 RAW 冒险(第二个输入的 `DataCopyPadCompact` 覆盖第一个的紧凑源)。binary 算子应配 `bufSrc1_/bufSrc2_`,`aliveBuf` 相应增大(cann-bench Maximum 落地经验)。
|
|
66
|
+
- `GetBroadcastTilingInfo` 的 rank 必须与 `Broadcast` 调用一致。
|
|
67
|
+
- src/dst shape 的首轴是 UB 切分轴方向的行数,后续轴是尾轴及以下;广播轴在 src 上填 1。
|
package/skills/asc-tools/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# DataCopy Optimization 优化设计
|
|
2
|
+
|
|
3
|
+
## 1. 优化目标
|
|
4
|
+
|
|
5
|
+
数据搬运(DataCopy)是 Ascend C 算子中最基础也最频繁的操作。Naive 实现通常采用简单的逐块搬运,未充分利用硬件 DMA 引擎的带宽潜力,导致:
|
|
6
|
+
|
|
7
|
+
- **非对齐访问惩罚**:数据未按设备最优粒度对齐时,DMA 效率大幅下降。以 Ascend 910B 实测为例,32B 对齐的带宽约为 512B 对齐的 70%,不同设备的最优对齐值需实测确认。
|
|
8
|
+
- **小批量多次搬运**:循环内每次迭代独立 DataCopy,DMA 启动开销累积。
|
|
9
|
+
- **格式转换额外开销**:ND→NZ 格式转换需要独立的 TransData 算子,增加一次 L1 读写往返。
|
|
10
|
+
- **非连续内存访问低效**:Scatter/Gather 场景下逐元素访问无法利用 SIMD 并行性。
|
|
11
|
+
- **内存访问模式未优化**:跨步访问(strided access)导致大量小传输(< 256B),DMA 设置成本占主导。
|
|
12
|
+
|
|
13
|
+
本优化通过 DataCopyPad 自动对齐、ND2NZ 融合格式转换、Scatter/Gather 向量化、批量 DataCopy 合并、按设备最优粒度的 GM 对齐等手段,将数据搬运效率最大化。
|
|
14
|
+
|
|
15
|
+
| 指标 | naive | optimized | 收益 |
|
|
16
|
+
|------|-------|-----------|------|
|
|
17
|
+
| 对齐访问带宽 | 未按最优粒度对齐: ~70% | 按设备最优粒度对齐 | 带宽提升最高 30%(Ascend 910B 实测) |
|
|
18
|
+
| DMA 启动次数 | loopCount 次 | 1 次(批量合并) | 显著降低指令发射开销 |
|
|
19
|
+
| ND→NZ 转换 | 独立 TransData 算子 | 搬运时融合完成 | 省去一次 L1 读写往返 |
|
|
20
|
+
| Scatter/Gather | 逐元素 GetValue/SetValue | 向量化 Gather/Scatter 指令 | 性能提升 5-20 倍 |
|
|
21
|
+
| 非连续列提取 | 搬运全部数据后裁剪 | blockLen+srcStride 一次提取 | 减少无效数据搬运 |
|
|
22
|
+
|
|
23
|
+
> 适用算子族:`conversion` 族所有涉及数据搬运、格式转换、内存布局重排的变体,如 `transpose`、`concat`、`split`、`gather`、`scatter`、`nd2nz` 等。
|
|
24
|
+
|
|
25
|
+
## 2. 架构概览
|
|
26
|
+
|
|
27
|
+
### 2.1 存储层级与数据流
|
|
28
|
+
|
|
29
|
+
DataCopy 优化覆盖数据从 GM 到 UB/L1 的全链路:通过 DataCopyPad 实现非对齐数据自动填充对齐;通过 Nd2NzParams 在搬运时融合 ND→NZ 格式转换;通过 DataCopyExtParams 的 blockLen+srcStride 实现非连续列一次提取;通过批量合并减少 DMA 启动次数;通过 Gather/Scatter 偏移表实现向量化离散访问;通过按设备最优粒度的 GM 对齐(如 Ascend 910B 为 512B)最大化带宽利用率。
|
|
30
|
+
|
|
31
|
+
### 2.2 优化策略矩阵
|
|
32
|
+
|
|
33
|
+
| 场景 | 优化策略 | 核心 API / 参数 |
|
|
34
|
+
|------|---------|----------------|
|
|
35
|
+
| 非对齐数据搬运 | DataCopyPad 自动填充 | `DataCopyPadExtParams{isPad, leftPadding, rightPadding, paddingValue}` |
|
|
36
|
+
| ND→NZ 格式转换 | 搬运时融合 | `Nd2NzParams{nValue, dValue, srcDValue, dstNzC0Stride, dstNzNStride}` |
|
|
37
|
+
| 非连续列提取 | blockLen + srcStride | `DataCopyExtParams{blockCount, blockLen, srcStride, dstStride}` |
|
|
38
|
+
| 批量输出合并 | 循环内累积,循环外统一写回 | 累积到 UB,循环结束后一次性 DataCopy |
|
|
39
|
+
| 向量化 Gather | 预计算偏移表 + Gather 指令 | `Gather(dst, src, offsetTable, 0, count)` |
|
|
40
|
+
| 向量化 Scatter | 索引计算 + DataCopyPad | `inputStride0_ / inputStride1_` 非连续寻址 |
|
|
41
|
+
| GM 带宽最大化 | 按设备最优粒度对齐(如 512B) | `AlignUp(offset, 512)` |
|
|
42
|
+
|
|
43
|
+
### 2.3 DMA 效率阈值
|
|
44
|
+
|
|
45
|
+
以下阈值基于 Ascend 910B 实测经验,不同设备的 DMA 控制器、总线宽度和缓存行大小不同,具体数值需参考对应硬件手册或实测确认。
|
|
46
|
+
|
|
47
|
+
| 传输大小 | 效率 | 说明 |
|
|
48
|
+
|---------|------|------|
|
|
49
|
+
| < 32 bytes | 极低 | 对齐开销占主导 |
|
|
50
|
+
| 32-256 bytes | 差 | DMA 设置成本显著 |
|
|
51
|
+
| 256-4096 bytes | 中等 | 大多数场景可接受 |
|
|
52
|
+
| > 4096 bytes | 好 | 总线带宽充分利用 |
|
|
53
|
+
| > 65536 bytes | 极佳 | 接近峰值吞吐 |
|
|
54
|
+
|
|
55
|
+
## 3. 关键参数配置
|
|
56
|
+
|
|
57
|
+
```cpp
|
|
58
|
+
// DataCopyExtParams 结构(多维批量传输)
|
|
59
|
+
struct DataCopyExtParams {
|
|
60
|
+
uint16_t blockCount; // 块数量
|
|
61
|
+
uint32_t blockLen; // 每块字节数
|
|
62
|
+
uint32_t srcStride; // 源地址块间步长(字节)
|
|
63
|
+
uint32_t dstStride; // 目的地址块间步长(字节)
|
|
64
|
+
uint32_t reserved; // 保留
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// DataCopyPadExtParams 结构(自动填充)
|
|
68
|
+
template <typename T>
|
|
69
|
+
struct DataCopyPadExtParams {
|
|
70
|
+
bool isPad; // 是否启用填充
|
|
71
|
+
uint8_t leftPadding; // 左侧填充字节数
|
|
72
|
+
uint8_t rightPadding; // 右侧填充字节数(最大 255)
|
|
73
|
+
T paddingValue; // 填充值
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Nd2NzParams 结构(ND→NZ 格式转换)
|
|
77
|
+
struct Nd2NzParams {
|
|
78
|
+
uint32_t nValue; // N 维大小
|
|
79
|
+
uint32_t dValue; // D 维大小
|
|
80
|
+
uint32_t srcDValue; // 源 D 维步长
|
|
81
|
+
uint32_t dstNzC0Stride; // 目的 NZ C0 维步长(需对齐:fp16 为 16,fp8 为 32)
|
|
82
|
+
uint32_t dstNzNStride; // 目的 NZ N 维步长
|
|
83
|
+
};
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 3.1 对齐参数计算
|
|
87
|
+
|
|
88
|
+
| 数据类型 | 32B 对齐元素数 | 512B 对齐元素数 | 说明 |
|
|
89
|
+
|---------|--------------|----------------|------|
|
|
90
|
+
| FP32 | 8 | 128 | 地址/长度需为 8 的倍数 |
|
|
91
|
+
| FP16/BF16 | 16 | 256 | 地址/长度需为 16 的倍数 |
|
|
92
|
+
| INT8 | 32 | 512 | 地址/长度需为 32 的倍数 |
|
|
93
|
+
|
|
94
|
+
```cpp
|
|
95
|
+
// 32B 对齐
|
|
96
|
+
uint32_t align32 = (size + 31) / 32 * 32; // 或 CeilAlign(size, 32)
|
|
97
|
+
// 按设备最优粒度对齐(如 Ascend 910B 为 512B)
|
|
98
|
+
uint32_t align512 = (offset + 511) / 512 * 512;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3.2 Padding 限制
|
|
102
|
+
|
|
103
|
+
- `rightPadding` 为 `uint8_t`,最大补零 255 字节
|
|
104
|
+
- `blockLen` 单位为字节,需注意数据类型大小转换
|
|
105
|
+
- 补零后的数据参与后续计算,需确保补零不影响算法正确性(如 ReduceSum 场景补零安全,但 ReduceMax 可能受影响)
|
|
106
|
+
|
|
107
|
+
## 4. 核心计算循环
|
|
108
|
+
|
|
109
|
+
### 4.1 naive 版本(优化前)
|
|
110
|
+
|
|
111
|
+
```cpp
|
|
112
|
+
// 阶段 1:简单 DataCopy,无对齐处理
|
|
113
|
+
AscendC::DataCopy(xLocal, xGm[offset], this->tileSize);
|
|
114
|
+
|
|
115
|
+
// 阶段 2:ND→NZ 需要独立 TransData 算子
|
|
116
|
+
AscendC::DataCopy(l1Tensor, gmTensor, size);
|
|
117
|
+
TransData(l1Tensor, nzTensor, ...); // 额外算子
|
|
118
|
+
|
|
119
|
+
// 阶段 3:循环内每次独立 DataCopy 写回
|
|
120
|
+
for (int i = 0; i < loopCount; i++) {
|
|
121
|
+
Compute();
|
|
122
|
+
DataCopy(gm[offset], ub, size); // 每次 16 个元素
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 阶段 4:逐元素 Scatter 写入
|
|
126
|
+
for (int64_t i = 0; i < loadCount; i++) {
|
|
127
|
+
IndexType idx0 = indLocal.GetValue(i * INDICES_LAST_DIM);
|
|
128
|
+
IndexType idx1 = indLocal.GetValue(i * INDICES_LAST_DIM + 1);
|
|
129
|
+
int64_t gmOffset = idx0 * inputStride0_ + idx1 * inputStride1_;
|
|
130
|
+
// 逐行搬出,每次只搬 1 行
|
|
131
|
+
DataCopy(inputGm_[gmOffset], updLocal[i * updateRowElements_], updateDimSize_);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// 阶段 5:逐元素 Gather 读取
|
|
135
|
+
for (uint32_t j = 0; j < idxGatherDim; j++) {
|
|
136
|
+
int32_t gatherIdx = idxLocal.GetValue(idxRowOffset + j);
|
|
137
|
+
float value = xLocal.GetValue(xRowOffset + gatherIdx);
|
|
138
|
+
yLocal.SetValue(yRowOffset + j, value);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 阶段 6:非连续列提取——搬运全部数据后裁剪
|
|
142
|
+
DataCopy(fullLocal, gmSrc, fullSize); // 搬运全部数据
|
|
143
|
+
for (int i = 0; i < rows; i++) {
|
|
144
|
+
ExtractColumn(local[i], fullLocal[i], colStart, colLen); // UB 上裁剪
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 4.2 optimized 版本(优化后)
|
|
149
|
+
|
|
150
|
+
```cpp
|
|
151
|
+
// === Variant A: DataCopyPad 自动对齐填充 ===
|
|
152
|
+
uint32_t attenMaskSizeAlign = Align(info.s2dealNum, 32U);
|
|
153
|
+
DataCopyExtParams dataCopyParams;
|
|
154
|
+
dataCopyParams.blockCount = s1EndIdx - s1StartIdx;
|
|
155
|
+
dataCopyParams.blockLen = info.s2dealNum;
|
|
156
|
+
dataCopyParams.srcStride = info.attenMaskStride - info.s2dealNum;
|
|
157
|
+
dataCopyParams.dstStride = 0;
|
|
158
|
+
DataCopyPadExtParams<bool> padParams{true, 0,
|
|
159
|
+
static_cast<uint8_t>(attenMaskSizeAlign - info.s2dealNum), 0};
|
|
160
|
+
DataCopyPad(attenMaskUb, srcGmAddr[maskOffset], dataCopyParams, padParams);
|
|
161
|
+
|
|
162
|
+
// === Variant B: ND→NZ 融合格式转换 ===
|
|
163
|
+
template<typename INPUT_T>
|
|
164
|
+
__aicore__ inline void CopyToL1Nd2Nz(const LocalTensor<INPUT_T> &l1Tensor,
|
|
165
|
+
const GlobalTensor<INPUT_T> &gmTensor,
|
|
166
|
+
uint32_t nValue, uint32_t dValue, uint32_t srcDValue) {
|
|
167
|
+
Nd2NzParams gm2L1Nd2NzParams;
|
|
168
|
+
gm2L1Nd2NzParams.nValue = nValue;
|
|
169
|
+
gm2L1Nd2NzParams.dValue = dValue;
|
|
170
|
+
gm2L1Nd2NzParams.srcDValue = srcDValue;
|
|
171
|
+
gm2L1Nd2NzParams.dstNzC0Stride = (nValue + 15) >> 4 << 4; // fp16 对齐 16
|
|
172
|
+
gm2L1Nd2NzParams.dstNzNStride = 1;
|
|
173
|
+
DataCopy(l1Tensor, gmTensor, gm2L1Nd2NzParams);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// === Variant C: 批量 DataCopy 合并输出 ===
|
|
177
|
+
LocalTensor<int32_t> nInt32Out = outputQue2.template AllocTensor<int32_t>();
|
|
178
|
+
for (uint32_t i = 0; i < loopCount; i++) {
|
|
179
|
+
DealBmm1ResBaseBlock(info, nInt32Out, ...); // 不包含 DataCopy
|
|
180
|
+
}
|
|
181
|
+
outputQue2.EnQue(nInt32Out);
|
|
182
|
+
outputQue2.DeQue<int32_t>();
|
|
183
|
+
uint32_t dealRowCount = (loopCount - 1) * gSplitSize + tailSplitSize;
|
|
184
|
+
DataCopy(nUpdateGm[...], nInt32Out, dealRowCount); // 一次性写回
|
|
185
|
+
|
|
186
|
+
// === Variant D: 预计算偏移表 + Gather 提取 ===
|
|
187
|
+
// Init 阶段预计算(只执行一次)
|
|
188
|
+
for (uint32_t i = 0; i < V1_BASE_T; i++) {
|
|
189
|
+
for (uint32_t j = 0; j < N_; j++)
|
|
190
|
+
preOffsetBuf_.SetValue(offset1++, curOffset * sizeof(P));
|
|
191
|
+
curOffset += N_;
|
|
192
|
+
for (uint32_t j = 0; j < N_; j++)
|
|
193
|
+
postOffsetBuf_.SetValue(offset2++, curOffset * sizeof(P));
|
|
194
|
+
curOffset += nSquare;
|
|
195
|
+
}
|
|
196
|
+
// 后续通过 Gather 提取
|
|
197
|
+
Gather(hPreBuff_, matmulRes_, preOffsetBuf_, 0, lenT * N_);
|
|
198
|
+
Gather(hPostBuff_, matmulRes_, postOffsetBuf_, 0, lenT * N_);
|
|
199
|
+
|
|
200
|
+
// === Variant E: Stride 非连续列提取 ===
|
|
201
|
+
DataCopyExtParams copyParams{
|
|
202
|
+
static_cast<uint16_t>(ubFactor),
|
|
203
|
+
static_cast<uint32_t>(RMS_NORM_LENGTH * sizeof(KV_DTYPE)),
|
|
204
|
+
static_cast<uint32_t>(ROPE_LENGTH * sizeof(KV_DTYPE)),
|
|
205
|
+
0, 0};
|
|
206
|
+
DataCopyPad(xLocal, kvGm[kvGlobalMemoryOffset], copyParams, padParams);
|
|
207
|
+
|
|
208
|
+
// === Variant F: GM 按设备最优粒度对齐带宽优化 ===
|
|
209
|
+
// 以下数据为 Ascend 910B 实测结果,不同设备的最优对齐粒度可能不同。
|
|
210
|
+
uint32_t offset = AlignUp(rawOffset, 512); // 910B 上 512B 为最优粒度
|
|
211
|
+
DataCopy(ubTensor, gmTensor[offset], dataSize);
|
|
212
|
+
// 实测带宽对比(GM→UB,Ascend 910B):
|
|
213
|
+
// 按最优粒度(512B)对齐: ~100% 带宽效率
|
|
214
|
+
// 256B 对齐: ~90% 带宽效率
|
|
215
|
+
// 32B 对齐: ~70% 带宽效率(最差情况)
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## 5. 从 naive 到 datacopy_optimization 的关键修改点
|
|
219
|
+
|
|
220
|
+
| 修改项 | naive(优化前) | datacopy_optimization(优化后) |
|
|
221
|
+
|--------|---------------|-------------------------------|
|
|
222
|
+
| 非对齐搬运 | 简单 DataCopy(可能非对齐) | DataCopyPad 自动填充对齐 |
|
|
223
|
+
| ND→NZ 转换 | 独立 TransData 算子 | 搬运时融合 Nd2NzParams |
|
|
224
|
+
| 循环输出 | 每次迭代独立 DataCopy | 循环内累积,循环外统一写回 |
|
|
225
|
+
| Scatter 写入 | 逐元素 SetValue | 向量化 DataCopyPad 逐行写出 |
|
|
226
|
+
| Gather 读取 | 逐元素 GetValue | 预计算偏移表 + Gather 指令 |
|
|
227
|
+
| 非连续列提取 | 搬运全部后裁剪 | blockLen+srcStride 一次提取 |
|
|
228
|
+
| GM 地址对齐 | 无特殊处理 | 按设备最优粒度对齐最大化带宽 |
|
|
229
|
+
| DMA 传输大小 | 多次小传输(< 256B) | 合并为大传输(> 4096B) |
|
|
230
|
+
|
|
231
|
+
## 6. 注意事项 / 约束
|
|
232
|
+
|
|
233
|
+
1. **DataCopyPad rightPadding 限制**:`rightPadding` 为 `uint8_t`,最大补零 255 字节。超过此限制需手动分块处理。
|
|
234
|
+
|
|
235
|
+
2. **补零数据的安全性**:补零后的数据参与后续计算,需确保补零不影响算法正确性。例如 ReduceSum 场景补零安全(0 不影响求和),但 ReduceMax 可能受影响(0 可能改变最大值)。
|
|
236
|
+
|
|
237
|
+
3. **ND2NZ 对齐要求**:`dstNzC0Stride` 需按数据类型对齐——fp16 为 16 元素,fp8 为 32 元素。不同数据类型对齐基数不同,需条件编译。
|
|
238
|
+
|
|
239
|
+
4. **DataCopyParams stride 为 uint16_t**:最大 65535;超限需切换到 `DataCopyExtParams`。
|
|
240
|
+
|
|
241
|
+
5. **Scatter 逐行写出 MTE3 效率低**:每次只搬 1 行,适合 update 行数较少的场景。行数多时考虑批量处理或重组数据布局。
|
|
242
|
+
|
|
243
|
+
6. **Gather 偏移表 UB 占用**:偏移表占用 UB 空间(元素数 × 4 字节),子张量数量多时占用显著。offset 必须是字节偏移且 Gather 要求源数据在 UB 中连续。
|
|
244
|
+
|
|
245
|
+
7. **GM 按设备最优粒度对齐**:Kernel 入参(包括 Workspace/Tiling)地址通常已保证对齐,开发者需关注偏移量是否保持该设备的最优对齐粒度(如 Ascend 910B 为 512B,其他设备需查阅手册或实测确认)。
|
|
246
|
+
|
|
247
|
+
8. **DMA 效率阈值**:传输大小 < 256B 时 DMA 设置成本显著;> 4096B 时总线带宽充分利用。避免过度 tiling 导致每次 DMA 传输过小。具体阈值因设备 DMA 控制器特性而异,需参考对应硬件手册。
|
|
248
|
+
|
|
249
|
+
9. **列提取时 srcStride 和 blockLen 必须满足 32B 对齐**:每次提取一个子字段需多次搬运调用。
|
|
250
|
+
|
|
251
|
+
10. **批量 DataCopy 的 UB 空间管理**:循环内累积需要额外 UB 空间,需确保总占用小于 UB 容量。首次迭代可能有额外判断逻辑。
|
|
252
|
+
|
|
253
|
+
## 7. 常见问题与解决方案
|
|
254
|
+
|
|
255
|
+
### Q1: DataCopyPad 的 padding 值如何设置?
|
|
256
|
+
|
|
257
|
+
```cpp
|
|
258
|
+
// 一般场景:补零
|
|
259
|
+
DataCopyPadExtParams<T> padParams{true, 0, rightPadding, 0};
|
|
260
|
+
|
|
261
|
+
// 需要特定填充值的场景(如 mask 填充)
|
|
262
|
+
DataCopyPadExtParams<T> padParams{true, 0, rightPadding, MASK_VALUE};
|
|
263
|
+
|
|
264
|
+
// 不启用填充(数据已对齐)
|
|
265
|
+
DataCopyPadExtParams<T> padParams{false, 0, 0, 0};
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Q2: ND2NZ 转换时不同数据类型的对齐基数?
|
|
269
|
+
|
|
270
|
+
| 数据类型 | C0 对齐基数 | 计算公式 |
|
|
271
|
+
|---------|-----------|---------|
|
|
272
|
+
| FP16 | 16 元素 | `(nValue + 15) >> 4 << 4` |
|
|
273
|
+
| FP8 | 32 元素 | `(nValue + 31) >> 5 << 5` |
|
|
274
|
+
|
|
275
|
+
### Q3: 批量 DataCopy 合并时如何处理尾块?
|
|
276
|
+
|
|
277
|
+
```cpp
|
|
278
|
+
uint32_t dealRowCount = (loopCount - 1) * gSplitSize + tailSplitSize;
|
|
279
|
+
DataCopy(nUpdateGm[...], nInt32Out, dealRowCount);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
尾块大小 `tailSplitSize` 通常小于标准块 `gSplitSize`,需在 Host 侧 tiling 时计算并传递。
|
|
283
|
+
|
|
284
|
+
### Q4: Gather 偏移表如何预计算?
|
|
285
|
+
|
|
286
|
+
偏移表在 `Init` 阶段只计算一次,后续迭代复用:
|
|
287
|
+
```cpp
|
|
288
|
+
// Init 阶段
|
|
289
|
+
for (uint32_t i = 0; i < V1_BASE_T; i++) {
|
|
290
|
+
for (uint32_t j = 0; j < N_; j++)
|
|
291
|
+
preOffsetBuf_.SetValue(offset1++, curOffset * sizeof(P));
|
|
292
|
+
curOffset += N_;
|
|
293
|
+
// ...
|
|
294
|
+
}
|
|
295
|
+
// Process 阶段(每次迭代)
|
|
296
|
+
Gather(hPreBuff_, matmulRes_, preOffsetBuf_, 0, lenT * N_);
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Q5: 如何诊断 DMA 效率问题?
|
|
300
|
+
|
|
301
|
+
Profiling 关注以下指标:
|
|
302
|
+
- `aiv_mte2_time` / `aiv_mte3_time` 异常高 → 检查对齐和传输大小
|
|
303
|
+
- 带宽利用率低 → 检查是否大量小传输(< 256B)
|
|
304
|
+
- 大量 DMA 操作 → 检查是否可合并为批量传输
|
|
305
|
+
|
|
306
|
+
## 8. 选型决策与自检清单
|
|
307
|
+
|
|
308
|
+
### 8.1 选型决策
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
if (算子涉及数据搬运或格式转换):
|
|
312
|
+
→ 启用 datacopy_optimization
|
|
313
|
+
|
|
314
|
+
if (数据未对齐 32B):
|
|
315
|
+
→ 使用 DataCopyPad 自动填充
|
|
316
|
+
|
|
317
|
+
if (需要 ND→NZ 格式转换):
|
|
318
|
+
→ 使用 Nd2NzParams 搬运时融合转换
|
|
319
|
+
|
|
320
|
+
if (循环内多次 DataCopy 写回):
|
|
321
|
+
→ 合并为批量 DataCopy,循环外统一写回
|
|
322
|
+
|
|
323
|
+
if (需要按索引提取子张量):
|
|
324
|
+
→ 预计算偏移表 + Gather 指令
|
|
325
|
+
|
|
326
|
+
if (需要非连续列提取):
|
|
327
|
+
→ 使用 blockLen + srcStride 一次提取
|
|
328
|
+
|
|
329
|
+
if (多核并行访问 GM):
|
|
330
|
+
→ 确保按设备最优粒度对齐,必要时错位访问或行切分
|
|
331
|
+
|
|
332
|
+
if (传输大小 < 256B):
|
|
333
|
+
→ 考虑合并传输或调整 tiling 策略
|
|
334
|
+
else:
|
|
335
|
+
→ 标准 DataCopy 即可
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 8.2 自检清单
|
|
339
|
+
|
|
340
|
+
- [ ] 所有数据搬运满足 32B 对齐,未对齐时使用 DataCopyPad
|
|
341
|
+
- [ ] GM 地址偏移保持设备最优对齐粒度(如 512B)以最大化带宽,不同设备需实测确认
|
|
342
|
+
- [ ] ND→NZ 转换使用 `Nd2NzParams`,`dstNzC0Stride` 按数据类型对齐
|
|
343
|
+
- [ ] 循环内多次 DataCopy 已合并为批量输出
|
|
344
|
+
- [ ] Gather 偏移表在 Init 阶段预计算,Process 阶段复用
|
|
345
|
+
- [ ] Scatter 逐行写出时评估 MTE3 效率,行数多时考虑优化
|
|
346
|
+
- [ ] DataCopyPad 的 `rightPadding` ≤ 255 字节
|
|
347
|
+
- [ ] 补零数据不影响算法正确性(ReduceMax 场景特别注意)
|
|
348
|
+
- [ ] `DataCopyParams` 的 stride ≤ 65535,超限使用 `DataCopyExtParams`
|
|
349
|
+
- [ ] 传输大小 > 256B(以 Ascend 910B 为例),避免大量小 DMA 传输,不同设备阈值可能不同
|
|
350
|
+
- [ ] UB 空间预算充足,批量累积不超出容量
|
|
351
|
+
- [ ] 精度校验通过:与 naive 实现对比,数据一致性 100%
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# 公共优化能力(跨算子族)
|
|
2
|
+
|
|
3
|
+
| 优化类型 | 适用场景 | 文档 |
|
|
4
|
+
|---------|---------|------|
|
|
5
|
+
| 尾块处理(Tail Block) | 数据量不能被 tile 整除 | `common/tail_block_design.md` |
|
|
6
|
+
| 数据搬运(DataCopy) | 非对齐、小批量多次搬运 | `common/datacopy_optimization_design.md` |
|
|
7
|
+
| UB/TBuf 常驻复用与 Bank 冲突规避 | 多 tile 重复从 GM 搬运、冗余 MTE2 | `common/ub_resident_design.md` |
|
|
8
|
+
|
|
9
|
+
> 三篇为跨族公共优化能力的入口索引;正文按各篇结构建设(M1.5 补全)。
|