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
package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# matmul 小数据块合并载入(Scale / 小矩阵 Access Coalescing)优化设计
|
|
2
|
+
|
|
3
|
+
## 1. 优化目标
|
|
4
|
+
|
|
5
|
+
解决 matmul 族(尤其是 **MXFP4 / MXFP8 量化变体**)在 L1 搬入路径上 **单次 MTE2 搬运量过小(< 20 KB)** 导致的 **访存带宽利用不足** 问题。将 K 方向上被 `baseK`/`kL1` 切碎的若干片 Scale(或其他小侧随路数据)**合并成一次大搬运**,使 MTE2 的**带宽利用率**从典型的 50%–70% 拉回到 80%+ 的健康区间,同时削减等价指令条数与 MTE2 段气泡。
|
|
6
|
+
|
|
7
|
+
适用面比"仅 Scale"更广:任何在 kernel 内被反复从 GM 搬进 L1、单次数据量显著小于 20 KB、且在 K 方向上"内容相邻 + 读模式一致"的侧输入(Scale、Bias、小 LUT、少量常量张量等)都可以套同一思路(本文档统一称"**小数据块合并载入**",英文 *small-block MTE2 coalescing* 或 *access coalescing*)。
|
|
8
|
+
|
|
9
|
+
> **20 KB 物理根因**:昇腾 AI Core 的 MTE2 发射单元对 "发起一次 GM→L1 搬运" 有固定头开销(地址建立、Burst 描述符、DMA 通道配置)。单次搬运量达到约 20 KB 左右时,头开销被数据时间摊薄到 < 5%;若单次低于 20 KB,头开销占比显著拉高,表现为 *cycles/byte* 远高于 HBM 理论峰值。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 2. 架构概览
|
|
14
|
+
|
|
15
|
+
### 2.1 未优化路径(每 `kL1` 轮都搬一块 scale)
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
for iter0 in range(kL1Iter): # K 轴外层
|
|
19
|
+
MTE2: GM → L1 A[kL1] (baseM·kL1 bytes) ~ 32 KB ✔ 够大
|
|
20
|
+
MTE2: GM → L1 B[kL1] (kL1·baseN bytes) ~ 32 KB ✔ 够大
|
|
21
|
+
MTE2: GM → L1 scaleA[baseK] (baseM·kL1/32 bytes) ~ 2 KB ✘ 太小
|
|
22
|
+
MTE2: GM → L1 scaleB[baseK] (kL1/32·baseN bytes) ~ 2 KB ✘ 太小
|
|
23
|
+
MTE1: L1 → L0 + CUBE
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
每个 `kL1` 迭代都发一次小 scale 搬运,`kL1Iter = K / kL1` 轮下总计发出 `2 × kL1Iter` 次小搬运。MTE2 段有大量短指令 + 指令间小气泡,带宽利用率拉低。
|
|
27
|
+
|
|
28
|
+
### 2.2 优化路径(合并 `scaleKL1Ratio` 个 kL1 的 scale 一次性载入)
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
scaleKL1 = scaleKL1Ratio × kL1 # 例如 16 × BASE_K,或直接置为 K
|
|
32
|
+
for iter0 in range(kL1Iter):
|
|
33
|
+
if iter0 % scaleKL1Ratio == 0: # 每 scaleKL1Ratio 轮才发一次 scale
|
|
34
|
+
MTE2: GM → L1 scaleA[scaleKL1] (baseM·scaleKL1/32 bytes) ~ 32 KB ✔ 够大
|
|
35
|
+
MTE2: GM → L1 scaleB[scaleKL1] (scaleKL1/32·baseN bytes) ~ 32 KB ✔ 够大
|
|
36
|
+
MTE2: GM → L1 A[kL1]
|
|
37
|
+
MTE2: GM → L1 B[kL1]
|
|
38
|
+
MTE1: L1 → L0 + CUBE
|
|
39
|
+
# L0 侧按 scaleKL1IterOffset = (iter0 % scaleKL1Ratio) × kL1 从同一块 scaleL1 里取
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
极端情形(`scaleKL1 = K` 且 L1 放得下)下整段 kernel 只在 `iter0=0` 发一次 scale,后续所有迭代只有 A/B 的大 MTE2。等价地把原来 `2 × kL1Iter` 次小 MTE2 压缩成 `2 × kL1Iter / scaleKL1Ratio` 次大 MTE2;单位数据量不变,但单次负载翻倍到 20 KB 以上。
|
|
43
|
+
|
|
44
|
+
### 2.3 事件同步模型
|
|
45
|
+
|
|
46
|
+
在 pingpong 事件模型(`pingpong_design.md` §2.3)基础上新增一对 "scale 独立 pingpong" 事件,与 A/B 的 L1 pingpong **事件 ID 分离**:
|
|
47
|
+
|
|
48
|
+
| 事件类型 | 含义 | 新增用途(scale 合并) |
|
|
49
|
+
|---------|------|------------------|
|
|
50
|
+
| `MTE1_MTE2(SCALE_BUFFER_FLAG_0)` | scaleA/B 在 L1 双缓冲 ping 释放 | 当前 L0 已消费完前一份 merged scale,准许 MTE2 覆写 ping |
|
|
51
|
+
| `MTE1_MTE2(SCALE_BUFFER_FLAG_1)` | scaleA/B 在 L1 双缓冲 pong 释放 | 同上,pong |
|
|
52
|
+
| `MTE2_MTE1`(仍复用 A/B 轨) | A/B 搬入就绪 → L1→L0 | 合并后不变 |
|
|
53
|
+
|
|
54
|
+
关键点:**scale 的 pingpong 周期拉长到 `scaleKL1Ratio × kL1Iter` 而非 `kL1Iter`**。只要 `SCALE_BUFFER_NUM = 2`(ping/pong)就足够覆盖所有稳态轮次。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 3. 关键参数配置
|
|
59
|
+
|
|
60
|
+
```cpp
|
|
61
|
+
constexpr uint32_t BASE_M = 128; // 典型量化 matmul baseM
|
|
62
|
+
constexpr uint32_t BASE_N = 128;
|
|
63
|
+
constexpr uint32_t BASE_K = 512;
|
|
64
|
+
constexpr uint32_t L1_BUFFER_NUM = 2; // A/B 的 K 覆盖倍数(沿用 pingpong)
|
|
65
|
+
constexpr uint32_t PINGPONG_NUM = 2; // A/B 的 L1 pingpong
|
|
66
|
+
constexpr uint32_t SCALE_L1_BUFFER_NUM = 16; // *** 本优化核心 *** scale 相对 A/B 的 K 覆盖倍数
|
|
67
|
+
constexpr uint32_t SCALE_BUFFER_NUM = 2; // scale 的 L1 pingpong 仍是 2
|
|
68
|
+
|
|
69
|
+
// Host Tiling
|
|
70
|
+
params.l1Params.kL1 = BASE_K * L1_BUFFER_NUM; // A/B 的 kL1
|
|
71
|
+
params.l1Params.scaleKL1 = BASE_K * SCALE_L1_BUFFER_NUM; // scale 的 scaleKL1 = 16 × BASE_K
|
|
72
|
+
params.l1Params.l1BufNum = PINGPONG_NUM;
|
|
73
|
+
// 要求:scaleKL1 是 kL1 的整数倍(scaleKL1Ratio_ = scaleKL1 / kL1 ≥ 2 整数)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 3.1 `SCALE_L1_BUFFER_NUM` 的选取规则
|
|
77
|
+
|
|
78
|
+
`scaleKL1` 过小则带宽没救回来;过大则 L1 放不下或把 A/B 的 pingpong 空间吃掉。按以下顺序搜索:
|
|
79
|
+
|
|
80
|
+
1. **计算单次 scale 合并搬运量**:
|
|
81
|
+
$$ \text{Bytes}_{\text{scaleA}} = \text{baseM} \times \frac{\text{scaleKL1}}{32} \times |\text{dtype}_{\text{scale}}| $$
|
|
82
|
+
目标:`Bytes_scaleA ≥ 20 KB`(带宽拐点)。以 `baseM = 128, |dtype_scale| = 1 B` 为例:
|
|
83
|
+
- `scaleKL1 = 512`(即 `SCALE_L1_BUFFER_NUM = 1`):2 KB ✘
|
|
84
|
+
- `scaleKL1 = 1024`(`=2`):4 KB ✘
|
|
85
|
+
- `scaleKL1 = 5120`(`=10`):20 KB ✔(**最低门槛**)
|
|
86
|
+
- `scaleKL1 = 8192`(`=16`):32 KB ✔(**推荐**,兼容 K=8192 的整块覆盖)
|
|
87
|
+
- `scaleKL1 = K`("一次装完"):理想值;L1 容得下时首选
|
|
88
|
+
|
|
89
|
+
2. **L1 预算校验**:
|
|
90
|
+
$$
|
|
91
|
+
\text{L1 used} = \underbrace{(\text{aL1OneBuffer}+\text{bL1OneBuffer}) \times L_1\text{BufferNum} \times \text{PINGPONG\_NUM}}_{\text{A/B 正常 pingpong}}
|
|
92
|
+
+ \underbrace{(\text{scaleAL1OneBuffer}+\text{scaleBL1OneBuffer}) \times \text{SCALE\_BUFFER\_NUM}}_{\text{scale 合并后 pingpong}}
|
|
93
|
+
\le L1\text{Size} \ (524288\ B)
|
|
94
|
+
$$
|
|
95
|
+
`scaleXL1OneBuffer = baseX × CeilDiv(scaleKL1, MXFP_DIVISOR_SIZE_LOCAL) × MXFP_MULTI_BASE_SIZE_LOCAL`。溢出时回退 `SCALE_L1_BUFFER_NUM`(通常 16 → 8 → 4 → 2)直到成立。
|
|
96
|
+
|
|
97
|
+
3. **`scaleKL1` 必须是 `kL1` 的整数倍**(`scaleKL1Ratio_ = scaleKL1 / kL1`)。否则 `iter0 % scaleKL1Ratio_ == 0` 的判定会丢 scale 对齐,精度出错。
|
|
98
|
+
|
|
99
|
+
### 3.2 `scaleKL1Ratio_` 字段
|
|
100
|
+
|
|
101
|
+
Device 侧新增私有状态:
|
|
102
|
+
|
|
103
|
+
```cpp
|
|
104
|
+
uint64_t scaleKL1Ratio_; // = scaleKL1_ / kL1_
|
|
105
|
+
|
|
106
|
+
// Init()
|
|
107
|
+
scaleKL1Ratio_ = scaleKL1_ / kL1_;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
用于两个关键判定:
|
|
111
|
+
- **Scale 搬运触发**:`if (iter0 % scaleKL1Ratio_ == 0) { 发一次 scale MTE2; }`
|
|
112
|
+
- **Scale L0 取数偏移**:`scaleKL1IterOffset = (iter0 % scaleKL1Ratio_) × kL1_`;L0 侧按该偏移从 merged scaleL1 中切对应片给 MMAD。
|
|
113
|
+
|
|
114
|
+
### 3.3 L1 布局(与 pingpong 布局解耦)
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
L1 地址空间(L1_SIZE = 524 KB):
|
|
118
|
+
┌───────────────────────────────────────────────────────────────────────────┐
|
|
119
|
+
│ A_ping │ A_pong │ B_ping │ B_pong │ scaleA_ping │ scaleA_pong │ scaleB_ping │ scaleB_pong │
|
|
120
|
+
│ (kL1) │ (kL1) │ (kL1) │ (kL1) │ (scaleKL1) │ (scaleKL1) │ (scaleKL1) │ (scaleKL1) │
|
|
121
|
+
└───────────────────────────────────────────────────────────────────────────┘
|
|
122
|
+
↑ ↑
|
|
123
|
+
A/B 每 iter0 轮换 scaleA/B 每 scaleKL1Ratio_ × iter0 轮换
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- A/B 的 pingpong 周期仍然是 `kL1` 粒度(保留 pingpong 重叠 MTE2 / MTE1+CUBE)
|
|
127
|
+
- scaleA/B 的 pingpong 周期被**拉长到** `scaleKL1Ratio_ × kL1`;L1 pingpong 同样是 2 份就够
|
|
128
|
+
|
|
129
|
+
偏移公式(见 `block_mmad_mx_base.h::Init`):
|
|
130
|
+
|
|
131
|
+
```cpp
|
|
132
|
+
l1BufferAOffset_[bufferId] = halfOffset + aL1OneBuffer_ * (bufferId >> 1);
|
|
133
|
+
l1BufferBOffset_[bufferId] = halfOffset + aL1OneBuffer_ * (l1BufNum_ >> 1)
|
|
134
|
+
+ bL1OneBuffer_ * (bufferId >> 1);
|
|
135
|
+
l1BufferScaleAOffset_[bufferId] = l1BufferBOffset_[bufferId] + bL1OneBuffer_ * (l1BufNum_ >> 1);
|
|
136
|
+
l1BufferScaleBOffset_[bufferId] = l1BufferScaleAOffset_[bufferId] + scaleAL1OneBuffer_;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 4. 关键代码实施点
|
|
142
|
+
|
|
143
|
+
本节给出从 pingpong(`kL1 = scaleKL1`)基线演进到 scale 合并载入需要改的**五处**:
|
|
144
|
+
|
|
145
|
+
### 4.1 Host launcher:导出 `scaleKL1 = BASE_K × SCALE_L1_BUFFER_NUM`
|
|
146
|
+
|
|
147
|
+
```cpp
|
|
148
|
+
constexpr uint32_t SCALE_L1_BUFFER_NUM = 16; // 新增
|
|
149
|
+
params.l1Params.scaleKL1 = BASE_K * SCALE_L1_BUFFER_NUM; // 原先 = BASE_K × L1_BUFFER_NUM
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 4.2 BlockMmad::Init:缓存 `scaleKL1Ratio_`
|
|
153
|
+
|
|
154
|
+
```cpp
|
|
155
|
+
scaleKL1Ratio_ = scaleKL1_ / kL1_; // 新增私有成员
|
|
156
|
+
// L1 偏移计算改为按 scaleKL1 而非 kL1 来算 scaleXL1OneBuffer
|
|
157
|
+
scaleAL1OneBuffer_ = baseM_ * CeilDiv(scaleKL1_, MXFP_DIVISOR_SIZE_LOCAL) * MXFP_MULTI_BASE_SIZE_LOCAL;
|
|
158
|
+
scaleBL1OneBuffer_ = baseN_ * CeilDiv(scaleKL1_, MXFP_DIVISOR_SIZE_LOCAL) * MXFP_MULTI_BASE_SIZE_LOCAL;
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 4.3 scale MTE2 搬运由"每轮"改为"每 ratio 轮"
|
|
162
|
+
|
|
163
|
+
```cpp
|
|
164
|
+
for (uint64_t iter0 = 0; iter0 < kL1Iter_; ++iter0) {
|
|
165
|
+
// ...
|
|
166
|
+
if (iter0 % scaleKL1Ratio_ == 0) { // 原先无此判定
|
|
167
|
+
uint64_t scaleKL1Offset = iter0 * kL1_;
|
|
168
|
+
uint64_t curScaleKL1 = scaleKL1_;
|
|
169
|
+
if (scaleKL1Offset + curScaleKL1 > k_) { // 末段裁剪
|
|
170
|
+
curScaleKL1 = k_ - scaleKL1Offset;
|
|
171
|
+
}
|
|
172
|
+
// 发一次合并后的 scaleA MTE2
|
|
173
|
+
AscendC::Te::Copy(CopyScaleGM2L1, tensorScaleAL1Buf, gmBlockScaleA);
|
|
174
|
+
// 发一次合并后的 scaleB MTE2
|
|
175
|
+
AscendC::Te::Copy(CopyScaleGM2L1, tensorScaleBL1Buf, gmBlockScaleB);
|
|
176
|
+
}
|
|
177
|
+
// A/B 的 MTE2 每轮都发(不变)
|
|
178
|
+
// ...
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 4.4 L0 取数按合并后的 scaleL1 加偏移
|
|
183
|
+
|
|
184
|
+
`IterateL0()` 内部 scale → L0 拷贝的起点由 `(0, kL0Offset)` 改为 `(0, scaleKL1IterOffset + kL0Offset)`,其中:
|
|
185
|
+
|
|
186
|
+
```cpp
|
|
187
|
+
uint64_t scaleKL1IterOffset = (iter0 % scaleKL1Ratio_) * kL1_;
|
|
188
|
+
|
|
189
|
+
AscendC::Te::Copy(
|
|
190
|
+
CopyL12L0MxScaleA, tensorScaleAL0, tensorBlockScaleAL1,
|
|
191
|
+
AscendC::Te::MakeCoord(0, scaleKL1IterOffset + kL0Offset)); // 关键偏移
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
B 侧同理(坐标维度反过来)。**漏加这个偏移会直接导致精度错误**(不同 K 段用同一份 scale 反量化)。
|
|
195
|
+
|
|
196
|
+
### 4.5 Scale pingpong 释放条件
|
|
197
|
+
|
|
198
|
+
`SetFlag<MTE1_MTE2>(SCALE_BUFFER_FLAG_*)` 不再每轮发,而是仅在"本 merged scaleL1 的所有 `scaleKL1Ratio_` 轮 L0 拷贝都完成后"发:
|
|
199
|
+
|
|
200
|
+
```cpp
|
|
201
|
+
AscendC::SetFlag<AscendC::HardEvent::MTE1_MTE2>(l1BufId); // A/B 的每轮释放(不变)
|
|
202
|
+
if ((iter0 + 1) % scaleKL1Ratio_ == 0 || iter0 == kL1Iter_ - 1) {
|
|
203
|
+
AscendC::SetFlag<AscendC::HardEvent::MTE1_MTE2>(SCALE_BUFFER_FLAG_0 + scaleL1BufId);
|
|
204
|
+
scaleLoopCnt_++;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**漏掉"末轮强制释放"(`iter0 == kL1Iter_ - 1`)会导致 K 不是 `scaleKL1` 整数倍时 AIV 永远 Wait**。
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 5. 适用场景与适用性校验
|
|
213
|
+
|
|
214
|
+
### 5.1 典型 Shape 特征(由策略专家判定)
|
|
215
|
+
|
|
216
|
+
- **短 `baseK` 侧量化**:`baseM × baseK / 32 × |dtype_scale| < 20 KB`。最典型是 MXFP4 + `baseM=128, baseK=512` → scale 段 2 KB。
|
|
217
|
+
- **K 向循环次数较多**:`kL1Iter = K / kL1 ≥ 4`。否则根本没有足够的重复次数让合并收益显现。
|
|
218
|
+
- **L1 预算尚有余裕**:A/B pingpong 占完后剩余空间可容下 `SCALE_BUFFER_NUM × (scaleAL1OneBuffer + scaleBL1OneBuffer)`(以 `scaleKL1 = 16 × baseK` 计通常 < 65 KB,远小于 L1 余量)。
|
|
219
|
+
|
|
220
|
+
### 5.2 不适用的情形(禁用条件)
|
|
221
|
+
|
|
222
|
+
- `baseM × scaleKL1 / 32` 已经 ≥ 20 KB 但搬运仍不快:此时瓶颈在 B/B_scale 侧或 HBM 通道,合并 scale 救不动,需改查 HBM 带宽或改走 A-Full-Load。
|
|
223
|
+
- 量化 group size 非 32 且使单份 scale 已经足够大:合并无收益。
|
|
224
|
+
- L1 容不下 `SCALE_BUFFER_NUM × scaleXL1OneBuffer`:先回退 `SCALE_L1_BUFFER_NUM`(16→8→4→2),到 2 仍放不下说明 A/B pingpong 本身已经吃满 L1,此时本优化不可用。
|
|
225
|
+
- StreamK 分支:StreamK 已经把 K 切成 `kCnt` 段分给不同核,每段的 `skSingleCoreK` 通常已经 ≥ 2048,scale 段天然不再小;且 StreamK 的 `l1BufferNum` 固定为 2、`scaleKL1` 受 workspace 拓扑约束,**不与本优化叠加**。
|
|
226
|
+
|
|
227
|
+
### 5.3 与其他优化的关系
|
|
228
|
+
|
|
229
|
+
| 叠加对象 | 是否兼容 | 说明 |
|
|
230
|
+
|---------|----------|------|
|
|
231
|
+
| pingpong 双缓冲(`pingpong_design.md`) | ✅ **强兼容** | scale 合并只改 scale 那对 buffer 的 pingpong 周期,A/B pingpong 不动 |
|
|
232
|
+
| SWAT 负载均衡(`swat_design.md`) | ✅ 兼容 | SWAT 改的是 GetTileIdx 调度,不动 K 方向的 scaleKL1 |
|
|
233
|
+
| StreamK(`streamk_design.md`) | ❌ **互斥** | StreamK 强制 `l1BufferNum=2`、切 K 分段后 scale 段已经够大 |
|
|
234
|
+
| A-Full-Load(`modeling_reference.md` §2.2)| ✅ 兼容 | A 全载只影响 A 的 L1 布局,scale 段仍然在 K 方向被重复搬运,合并同样受益 |
|
|
235
|
+
| L1 bank 冲突对半布局(step 5) | ✅ 兼容 | 本优化在同一对半布局下只改 scale 的 buffer 数量与偏移 |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 6. 常见问题与解决方案
|
|
240
|
+
|
|
241
|
+
| 问题 | 现象 | 解决 |
|
|
242
|
+
|------|------|------|
|
|
243
|
+
| **精度错误(最常见)** | 输出 C 局部明显偏离 golden;尾部 K 段错得更严重 | 检查 `scaleKL1IterOffset = (iter0 % scaleKL1Ratio_) × kL1_` 是否在 L0 拷贝的 `MakeCoord` 里加上;尾轮 `curScaleKL1 = k_ - scaleKL1Offset` 是否正确裁剪 |
|
|
244
|
+
| **AIV/AIC hang** | K 不是 `scaleKL1` 整数倍时卡死 | 检查末轮 flag 释放:`if ((iter0+1) % scaleKL1Ratio_ == 0 || iter0 == kL1Iter_ - 1)` 的 `||` 必须保留 |
|
|
245
|
+
| **L1 溢出** | 编译期或运行期报 L1 overflow | 回退 `SCALE_L1_BUFFER_NUM`(16→8→4→2);或先校验 §3.1 的 L1 预算公式 |
|
|
246
|
+
| **合并后性能反而劣化** | MTE2 时间下降有限甚至上升 | 检查是否 MTE2 总量本来就够大(A/B 已 32 KB+);合并只对 <20KB 的小块有效 |
|
|
247
|
+
| **`scaleKL1 % kL1 ≠ 0`** | `iter0 % scaleKL1Ratio_` 永远非 0 或错位 | 强制 `scaleKL1 = ratio × kL1`,Host Tiling 在搜索 `SCALE_L1_BUFFER_NUM` 时保证整除 |
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 7. 预期收益
|
|
252
|
+
|
|
253
|
+
| 指标 | 优化前(SCALE_L1_BUFFER_NUM=2)| 优化后(SCALE_L1_BUFFER_NUM=16)| 变化 |
|
|
254
|
+
|------|------|------|------|
|
|
255
|
+
| 单次 scale MTE2 搬运量 | 1024 B | 8192–32768 B | +10× |
|
|
256
|
+
| scale MTE2 次数 | `2 × kL1Iter` | `2 × kL1Iter / 16` | ÷16 |
|
|
257
|
+
| MTE2 段时间(`[128, 8192, 4096]`)| 34.4 μs | 31.27 μs | **−9%** |
|
|
258
|
+
| Task 总时间 | 39.53 μs | 36.76 μs | **−7%** |
|
|
259
|
+
| MTE2 带宽利用率 | ~50–60% | ~80%+ | **+25 pp** |
|
|
260
|
+
|
|
261
|
+
典型收益区间:**5%–15% 端到端 Task 时间缩短**,受 K 长度、`baseK`/`baseM`、Scale dtype 大小影响。K 越长、`baseK` 越小、scale 在 L1 的占比越低时收益越大。
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 8. 泛化:不止 Scale —— 小数据块合并载入的一般化
|
|
266
|
+
|
|
267
|
+
以下场景可套同一模板(`合并 ratio × 原始覆盖`):
|
|
268
|
+
|
|
269
|
+
| 场景 | 小数据来源 | 合并后字段 | 预期收益 |
|
|
270
|
+
|------|------|------|------|
|
|
271
|
+
| MXFP4/MXFP8 量化 matmul 的 scaleA/scaleB | group_size=32 下,单 baseK 段 scale 只有 2 KB | `scaleKL1 = SCALE_L1_BUFFER_NUM × kL1` | 本文主体场景 |
|
|
272
|
+
| Matmul with bias(小 bias 向量)| bias 大小 `N` 或 `M`,单次切片可能 < 4 KB | 一次性全载 bias 到 L1 | 1–5% 次要 |
|
|
273
|
+
| 分组量化 GroupMatmul / MoE 专家权重的小 LUT | 每组的 routing 索引表 < 1 KB | 一次性载入 expert-routing 表 | 若 LUT 访问频繁,2–5% |
|
|
274
|
+
| RNN / Attention 的 mask / pos_embed 小张量 | 切片后单次 < 8 KB | 合并到一次 MTE2 | 视 K 循环次数 |
|
|
275
|
+
| 动态 shape 算子的 "尾片" 搬运 | 尾片普遍短 | Host 端融合尾片,kernel 端一次搬完 | 5–10%(尾部分带宽型场景)|
|
|
276
|
+
|
|
277
|
+
共用前提:
|
|
278
|
+
1. 小块数据在 K 向(或主循环轴)上**内容相邻、模式一致**(否则合并不能复用);
|
|
279
|
+
2. L1 / UB 有余量;
|
|
280
|
+
3. 小块数据是**只读**或**累加型**(不存在写竞争)。
|
|
281
|
+
|
|
282
|
+
在"是否启用合并"门禁校验阶段,**只需验证第 2 与第 3 条 + 单次原始搬运量 < 20 KB**;第 1 条通常由算子结构自然保证。
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
# matmul StreamK 调度模式技术文档
|
|
2
|
+
|
|
3
|
+
## 1. 背景
|
|
4
|
+
|
|
5
|
+
在昇腾 AI 处理器上执行矩阵乘(MatMul)时,传统的 Data-Parallel(DP)分核只在 M、N 两个维度切块,把 `mCnt × nCnt` 个基块分给 `aicNum` 个核。这种切分在以下两类场景会出现明显的核间负载不均:
|
|
6
|
+
|
|
7
|
+
1. **MN 欠并行(小 M、小 N、长 K)**:当 `mCnt × nCnt` 明显小于 `aicNum` 时,相当多的核根本没有原 tile 可分,整个 kernel 被少数几个核拖到 K 向串行耗时。例如 `M=N=512, K=16384, baseM=baseN=256`:`mCnt·nCnt = 4`,而 24 个核只有 4 个在工作。
|
|
8
|
+
2. **末轮空闲核(MN 不整除 aicNum)**:`totalCnt = mCnt·nCnt` 不是 `aicNum` 的整数倍时,稳态区各核均匀跑,但最后一轮只有前 `tailMNCnt = totalCnt % aicNum` 个核有活。SWAT 的「末轮二维再切分」在末轮 tile 数量少、或 `baseM/baseN` 已经接近 CUBE 单元粒度时会失去收益(子块太小、CUBE 启动开销反超),此时需要另一条思路。
|
|
9
|
+
|
|
10
|
+
**StreamK** 就是为这两类场景设计的调度策略:**把空闲的核拉去参与 K 维累加**,让原本不参与计算的核也分担 `k` 方向的一部分 MMA,然后通过一块 workspace 做跨核 K 累加归约。结果是:**原本 4 个核的活被拆成 `4 × (K 切分数)` 份,接近满核利用率**。
|
|
11
|
+
|
|
12
|
+
StreamK 有两种子模式,由 host tiling 根据 shape 自动选择:
|
|
13
|
+
|
|
14
|
+
| 子模式 | 触发条件(简化) | 切分方式 |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| **Stream-K (SK)** | `mCnt·nCnt ≤ aicNum/2` 且 `K ≥ 4096 (FP16 列)` | 所有 MN 块都做 K 切分(`kCnt = aicNum / (mCnt·nCnt)`) |
|
|
17
|
+
| **DP + Stream-K (DP+SK)** | `mCnt·nCnt ≥ aicNum` 且 `mCnt·nCnt % aicNum ≠ 0` 且余数 ≤ `aicNum/2` 且 `K ≥ 8192/FP16` | 稳态轮按 DP 走(K 不切);仅**最后一整轮**的 tail tile 做 K 切分 |
|
|
18
|
+
|
|
19
|
+
两种模式共用一套 kernel 实现(`matmul_a16w16_kernel_streamk.h`)和 scheduler(`matmul_a16w16_block_scheduler_streamk.h`),只靠 tiling 参数与 `CheckIsSkScene(tileIdx)` 区分。
|
|
20
|
+
|
|
21
|
+
## 2. 架构概览
|
|
22
|
+
|
|
23
|
+
### 2.1 存储层级与数据流
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
GM (A, B)
|
|
27
|
+
│
|
|
28
|
+
│ MTE2 (AIC 核,按本核分到的 {mIdx, nIdx, kIdx} 子片)
|
|
29
|
+
▼
|
|
30
|
+
L1 Buffer [A_ping | A_pong | B_ping | B_pong] ← L1_BUFFER_NUM = 2
|
|
31
|
+
│
|
|
32
|
+
│ MTE1 (L1 → L0A/L0B,按 L0 pingpong 切半)
|
|
33
|
+
▼
|
|
34
|
+
L0A / L0B Buffer [half_0 | half_1]
|
|
35
|
+
│
|
|
36
|
+
│ CUBE (MMA 累加 L0A × L0B → L0C,unitFlag 控制是否 FINAL_ACCUMULATION)
|
|
37
|
+
▼
|
|
38
|
+
L0C Buffer
|
|
39
|
+
│
|
|
40
|
+
├── SK 场景(本核只是 K 的一段):CopyL0C2GM → Workspace[tileIdx-based offset]
|
|
41
|
+
│ (FP32,避免中间累加精度损失)
|
|
42
|
+
└── DP 场景(本核拿到完整 K):CopyL0C2GM → GM[C]
|
|
43
|
+
|
|
44
|
+
↓ CrossCoreSetFlag<AIC_SYNC_AIV_MODE_4>
|
|
45
|
+
↓ (SK 的 tile 写完 workspace 后通知 AIV)
|
|
46
|
+
↓
|
|
47
|
+
AIV 核
|
|
48
|
+
│
|
|
49
|
+
│ MTE2:把 workspace 上同一 tile 的 K 各段 (共 kCnt 段) 搬到 UB
|
|
50
|
+
│ Vector:逐段 Add 累加到第 0 段
|
|
51
|
+
│ Cast:FP32 → FP16/BF16
|
|
52
|
+
│ MTE3:写回 GM[C]
|
|
53
|
+
▼
|
|
54
|
+
GM (C)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 2.2 SK 与 DP+SK 的区别
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
SK (mCnt·nCnt ≤ aicNum/2) DP+SK (mCnt·nCnt ≥ aicNum, 非整除)
|
|
61
|
+
|
|
62
|
+
每个 MN tile 都被 kCnt 个核切 K 累加 稳态轮:MN tile 完整落到单核(DP 路径)
|
|
63
|
+
末轮 :剩余 tailMNCnt 个 tile 各自被 kCnt 切 K
|
|
64
|
+
┌──── tile0 (K 被切 kCnt 段) ────┐ ┌ 稳态 ┐┌ 稳态 ┐ ... ┌ SK末轮 ┐
|
|
65
|
+
│ core0 core1 ... core_{kCnt-1} │ │core0 ││core1 │ ... │ 切K │
|
|
66
|
+
└───────────────────────────────┘ └──────┘└──────┘ └───────┘
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 2.3 事件同步模型(共用)
|
|
70
|
+
|
|
71
|
+
| 事件类型 | 含义 | 用途 |
|
|
72
|
+
|---------|------|------|
|
|
73
|
+
| `MTE1_MTE2`(id 0/1) | MTE1 完成 → 允许 MTE2 覆写 L1[A_buf] | A 侧 L1 pingpong 释放 |
|
|
74
|
+
| `MTE1_MTE2`(id 2/3) | 同上 | B 侧 L1 pingpong 释放(与 A 分离 event id 避免紧耦合) |
|
|
75
|
+
| `MTE2_MTE1` | MTE2 完成 → 允许 MTE1 读 L1 | A、B 数据就绪 |
|
|
76
|
+
| `M_MTE1` | CUBE 完成 → 允许 MTE1 覆写 L0 | L0 pingpong 释放 |
|
|
77
|
+
| `MTE1_M` | MTE1 完成 → 允许 CUBE | L0 数据就绪 |
|
|
78
|
+
| `AIC_SYNC_AIV_MODE_4`(PIPE_FIX)| AIC 写完 workspace → 通知 AIV 累加 | **StreamK 专用**:跨 AIC/AIV 同步,让 AIV 等所有 K 分段都写完再开始归约 |
|
|
79
|
+
| `MTE3_MTE2`(ZERO_FLAG) | DP 场景 AIV 复用 UB 前等 MTE3 完成 | 避免 UB 数据竞争 |
|
|
80
|
+
|
|
81
|
+
**关键差异**:StreamK 的同步比 pingpong/SWAT 多一层 **跨核 AIC→AIV 的 CrossCoreSetFlag**,因为 SK 的最终输出(FP16/BF16 的 C 矩阵)必须等所有 K 分段的 FP32 部分和全部写入 workspace 后由 AIV 完成归约+cast。
|
|
82
|
+
|
|
83
|
+
## 3. 关键参数配置
|
|
84
|
+
|
|
85
|
+
```cpp
|
|
86
|
+
// 核心常量(matmul_a16w16_block_mmad_streamk.h & scheduler)
|
|
87
|
+
constexpr uint64_t L1_BUFFER_NUM = 2; // L1 双缓冲
|
|
88
|
+
constexpr uint64_t HALF_L0_SIZE = L0A_SIZE / DOUBLE_BUFFER_COUNT;
|
|
89
|
+
constexpr uint16_t L1_EVENT_ID_OFFSET = 2; // A、B 用不同 event id 区间
|
|
90
|
+
constexpr uint16_t BLOCK_BASE_M = 256; // L0/workspace 对齐粒度
|
|
91
|
+
constexpr uint16_t BLOCK_BASE_N = 256;
|
|
92
|
+
constexpr uint64_t WINDOW_LEN = 4; // serpentine 行窗口(与 SWAT 共享)
|
|
93
|
+
|
|
94
|
+
// Host tiling 侧(matmul_a16w16_tiling_streamk.h)决定:
|
|
95
|
+
struct RunInfo {
|
|
96
|
+
uint64_t usedCoreNum; // 实际使用的 AIC 核数 = aicNum
|
|
97
|
+
uint64_t baseM, baseN; // 通常 = 256
|
|
98
|
+
uint64_t baseK; // = 128 / sizeof(FP16) = 64,受 L0A 容量约束
|
|
99
|
+
uint64_t kL1; // = baseK * stepKa,被 STEPKA_THRESHOLD=4 截断
|
|
100
|
+
uint64_t skSingleCoreK; // ★ StreamK 核心:单核 K 维负责的长度
|
|
101
|
+
uint64_t tailInfo.kCnt; // ★ K 切分数 = aicNum / (mCnt·nCnt) 或 = aicNum / tailMNCnt
|
|
102
|
+
uint64_t depthA1, depthB1; // L1 深度,depthA1 = stepKa * DB_SIZE
|
|
103
|
+
uint64_t stepKa, stepKb; // 互相倍数对齐,上限 4
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 3.1 L1 内存布局
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
L1 地址空间(FP16 路径):
|
|
111
|
+
[A_ping | A_pong | B_ping | B_pong]
|
|
112
|
+
|
|
113
|
+
偏移计算(见 block_mmad_streamk.h::operator()):
|
|
114
|
+
aL1OneBuffer_ = mL1 * kL1
|
|
115
|
+
bL1Init_ = aL1OneBuffer_ * L1_BUFFER_NUM // B 区起点
|
|
116
|
+
bL1OneBuffer_ = nL1 * kL1
|
|
117
|
+
|
|
118
|
+
offsetAL1 = aL1OneBuffer_ * l1BufId * sizeof(TypeA)
|
|
119
|
+
offsetBL1 = (bL1Init_ + bL1OneBuffer_ * l1BufId) * sizeof(TypeB)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
注意:StreamK 与 pingpong 的 L1 布局**一致**(都是 A_ping/A_pong/B_ping/B_pong),差别仅在 kL1 取值与 K 的切片长度。
|
|
123
|
+
|
|
124
|
+
### 3.2 Workspace 布局
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
GetWorkSpace() = aicNum * BLOCK_BASE_M * BLOCK_BASE_N * sizeof(FP32) // 部分和累加空间
|
|
128
|
+
+ RPC_WORKSIZE * MB_SIZE // 跨核通信
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
每个核在 SK 场景下写入的 workspace 偏移:
|
|
132
|
+
|
|
133
|
+
```cpp
|
|
134
|
+
offsetWorkspace = (((tileIdx % usedCoreNum) / skKTileNum) * skKTileNum
|
|
135
|
+
+ Get<MNK_K>(singleCoreCoord))
|
|
136
|
+
* BLOCK_BASE_M * BLOCK_BASE_N;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
- `(tileIdx % usedCoreNum) / skKTileNum` → 本 tile 在末轮里的 MN 序号(用作归约基址)
|
|
140
|
+
- `Get<MNK_K>(singleCoreCoord)` → 本核负责的 K 段序号(0..kCnt-1)
|
|
141
|
+
|
|
142
|
+
AIV 归约时按「同一 MN 基址下 kCnt 段连续 FP32 存储」读取,Add 累加后 cast 回 FP16/BF16 写入 C。
|
|
143
|
+
|
|
144
|
+
### 3.3 SK Preload(DP+SK 专属优化)
|
|
145
|
+
|
|
146
|
+
DP+SK 模式下,最后一轮的 SK 子任务依赖 workspace 写入 + AIV 归约,延迟较长。Preload 机制把**末轮某些 tile 的 AIC 工作提前到倒数第二轮**执行(交换 `tileIdx` 与 `tileIdx + usedCoreNum`),使得 AIC 在末轮时同时写 workspace(for 本轮 tile)和前一轮已写好 workspace 的 tile 正好在归约完成,掩盖归约延迟:
|
|
147
|
+
|
|
148
|
+
```cpp
|
|
149
|
+
// see matmul_a16w16_kernel_streamk.h::operator()
|
|
150
|
+
if (!bs.CheckIsSkScene(0)) { // 仅 DP+SK 启用(纯 SK 不需要)
|
|
151
|
+
int64_t tailSKTotalTileNum = ((mTileNum * nTileNum) % usedCoreNum) * skKTileNum;
|
|
152
|
+
// 条件:末轮前一轮的 tailSK 数量内
|
|
153
|
+
if (前一轮后段属于 tail) swap(tileIdx, tileIdx ± usedCoreNum);
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 4. 核心计算循环
|
|
158
|
+
|
|
159
|
+
### 4.1 外层调度(kernel 顶层)
|
|
160
|
+
|
|
161
|
+
```cpp
|
|
162
|
+
// matmul_a16w16_kernel_streamk.h
|
|
163
|
+
for (tileIdx = curBlockIdx; tileIdx < tileNum; tileIdx += usedCoreNum) {
|
|
164
|
+
// [DP+SK 才执行] SK Preload 交换
|
|
165
|
+
tmpTileIdx = SkPreloadSwap(tileIdx);
|
|
166
|
+
|
|
167
|
+
singleCoreShape = bs.GetSingleCoreShape(tmpTileIdx); // serpentine + 尾修正
|
|
168
|
+
singleCoreCoord = bs.GetSingleCoreCoord(tmpTileIdx);
|
|
169
|
+
kSingleCore = bs.GetCurKSingleCore(tmpTileIdx); // SK 场景返回 skSingleCoreK,DP 返回 k
|
|
170
|
+
|
|
171
|
+
gmBlockA = gmA[mPos * mL1 : +mL1, kPos * kSingleCore : +kSingleCore];
|
|
172
|
+
gmBlockB = gmB[kPos * kSingleCore : +kSingleCore, nPos * nL1 : +nL1];
|
|
173
|
+
gmBlockC = gmC[mPos * mL1 : +mL1, nPos * nL1 : +nL1];
|
|
174
|
+
gmWorkSpace = workspace[offsetWorkspace ...];
|
|
175
|
+
|
|
176
|
+
blockMmadOp(gmBlockC, gmBlockA, gmBlockB, gmWorkSpace,
|
|
177
|
+
singleCoreShape, kIdx, bs.CheckIsSkScene(tmpTileIdx));
|
|
178
|
+
// ↑ 决定落 workspace (SK) 还是落 C (DP)
|
|
179
|
+
|
|
180
|
+
if (tmpTileIdx + usedCoreNum >= tileNum) {
|
|
181
|
+
AscendC::CrossCoreSetFlag<AIC_SYNC_AIV_MODE_4, PIPE_FIX>(AIC_SYNC_AIV_FLAG);
|
|
182
|
+
AscendC::CrossCoreSetFlag<..>(AIC_SYNC_AIV_FLAG + FLAG_ID_MAX);
|
|
183
|
+
// ↑ 最后一轮结束,通知 AIV 可以开始归约
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 4.2 内层 K 流水(block_mmad)
|
|
189
|
+
|
|
190
|
+
```cpp
|
|
191
|
+
// block_mmad_streamk.h::operator()(伪代码)
|
|
192
|
+
for (iter0 = 0; iter0 < curKL1Iter; ++iter0) { // K 在 L1 级的迭代
|
|
193
|
+
l1BufId = abL1LoopCnt_ & 1;
|
|
194
|
+
|
|
195
|
+
// A 侧(event id 0/1)
|
|
196
|
+
WaitFlag<MTE1_MTE2>(l1BufId);
|
|
197
|
+
CopyGM2L1(A → L1[offsetAL1]);
|
|
198
|
+
SetFlag<MTE2_MTE1>(l1BufId);
|
|
199
|
+
WaitFlag<MTE2_MTE1>(l1BufId);
|
|
200
|
+
|
|
201
|
+
// B 侧(event id 2/3,独立于 A 避免紧耦合)
|
|
202
|
+
WaitFlag<MTE1_MTE2>(l1BufId + L1_EVENT_ID_OFFSET);
|
|
203
|
+
CopyGM2L1(B → L1[offsetBL1]);
|
|
204
|
+
SetFlag<MTE2_MTE1>(l1BufId + L1_EVENT_ID_OFFSET);
|
|
205
|
+
|
|
206
|
+
// 内层 L0 pingpong
|
|
207
|
+
for (iter1 = 0; iter1 < kL0Iter; ++iter1) {
|
|
208
|
+
l0Offset = HALF_L0_SIZE * (l0PingPong_ & 1);
|
|
209
|
+
WaitFlag<M_MTE1>(l0PingPong_ & 1);
|
|
210
|
+
CopyL12L0(A → L0A[l0Offset]);
|
|
211
|
+
if (iter1 == 0) WaitFlag<MTE2_MTE1>(l1BufId + L1_EVENT_ID_OFFSET); // B 只等一次
|
|
212
|
+
CopyL12L0(B → L0B[l0Offset]);
|
|
213
|
+
SetFlag<MTE1_M>(l0PingPong_ & 1);
|
|
214
|
+
WaitFlag<MTE1_M>(l0PingPong_ & 1);
|
|
215
|
+
|
|
216
|
+
unitFlag = (iter0+1==curKL1Iter && iter1+1==kL0Iter)
|
|
217
|
+
? FINAL_ACCUMULATION : NON_FINAL_ACCUMULATION;
|
|
218
|
+
cmatrixInitVal = (iter0==0 && iter1==0); // 首次累加初始化 L0C
|
|
219
|
+
Mmad(tensorL0C, tensorAL0, tensorBL0, unitFlag, cmatrixInitVal);
|
|
220
|
+
|
|
221
|
+
SetFlag<M_MTE1>(l0PingPong_ & 1);
|
|
222
|
+
l0PingPong_++;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (iter0 + 1 == curKL1Iter) {
|
|
226
|
+
// 根据 checkIsSkScene 决定输出目的地
|
|
227
|
+
if (checkIsSkScene) Copy L0C → workspace (FP32, FINAL_ACCUMULATION);
|
|
228
|
+
else Copy L0C → gmC (FP16/BF16, FINAL_ACCUMULATION);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
SetFlag<MTE1_MTE2>(l1BufId);
|
|
232
|
+
SetFlag<MTE1_MTE2>(l1BufId + L1_EVENT_ID_OFFSET);
|
|
233
|
+
abL1LoopCnt_++;
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 4.3 AIV 归约路径
|
|
238
|
+
|
|
239
|
+
```cpp
|
|
240
|
+
if ASCEND_IS_AIV {
|
|
241
|
+
// 仅最后一轮的 tail tile 需要 AIV(kCnt 次累加)
|
|
242
|
+
if (curBlockIdxInAiv >= lastLoopTotalCnt * GetTaskRation()) {
|
|
243
|
+
WaitFlag<CrossCore>(AIC_SYNC_AIV_FLAG);
|
|
244
|
+
SyncAll();
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
WaitFlag<CrossCore>(AIC_SYNC_AIV_FLAG);
|
|
248
|
+
SyncAll();
|
|
249
|
+
BlockEpilogueStreamK epilogue;
|
|
250
|
+
epilogue.Init(...); // 计算本 AIV 负责的 mBurstBase、offsetWorkspace、offsetCGm
|
|
251
|
+
epilogue(); // for i in kCnt: Add(ub, ub[i*burstLen]); Cast FP32→FP16; DataCopyPad → C
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## 5. 从 pingpong / SWAT 升级到 StreamK 的关键修改点
|
|
256
|
+
|
|
257
|
+
| 修改项 | pingpong / SWAT (优化前) | StreamK (优化后) |
|
|
258
|
+
|--------|------------------------|-----------------|
|
|
259
|
+
| 分核维度 | 仅 M、N 切分(DP) | M、N + **K 切分** |
|
|
260
|
+
| 并行度 | `min(mCnt·nCnt, aicNum)` | `min(mCnt·nCnt·kCnt, aicNum)` |
|
|
261
|
+
| Workspace | 不需要(或仅用于 L1 tiling) | **必需**:`aicNum × 256² × sizeof(FP32) + RPC` |
|
|
262
|
+
| 输出路径 | AIC 直接 CopyL0C2GM → C(FP16/BF16) | SK tile:AIC → workspace(FP32);AIV 归约 + cast → C |
|
|
263
|
+
| AIV 启用 | 仅用于 ND2NZ / 量化类特殊处理 | **必需**:末轮 kCnt 段累加归约 |
|
|
264
|
+
| 跨核同步 | AIC/AIV 可独立调度 | **必需** `CrossCoreSetFlag<AIC_SYNC_AIV_MODE_4>` 确保 workspace 就绪 |
|
|
265
|
+
| `unitFlag` 控制 | 始终 `FINAL_ACCUMULATION` | 按 `iter0+iter1` 判断:非末次为 `NON_FINAL_ACCUMULATION` |
|
|
266
|
+
| `cmatrixInitVal` | 仅首个 tile 初始化 | 每个 SK 段首次 MMA 都要初始化 L0C(因段间不累加) |
|
|
267
|
+
| `baseK` | 64 或 128 | 固定 `128 / sizeof(FP16) = 64`(保 L0 双缓冲) |
|
|
268
|
+
| `kL1` 上限 | 按 L1_BUFFER_NUM 推导 | **额外加 `STEPKA_THRESHOLD=4` 上限**,避免 SK 段过长挤掉 pingpong |
|
|
269
|
+
| 调度器 | `SwatScheduler` / `PingpongScheduler` | **新增** `BlockSchedulerA16W16StreamK`,带 `skKTileNum`、`totalMNTileNumInDP`、`CheckIsSkScene` |
|
|
270
|
+
| Epilogue | 无 / 简单 cast | **新增** `BlockEpilogueStreamK`:支持从 workspace 逐段 Add + Cast + DataCopyPad |
|
|
271
|
+
|
|
272
|
+
## 6. 注意事项
|
|
273
|
+
|
|
274
|
+
1. **只对特定 shape 有收益**:host tiling `IsCapable()` 会拒绝非目标 shape(SK 需 K≥4096 FP16 列 & mn≤核数/2;DP+SK 需 M/N 256 对齐 & K≥8192/FP16 & 余数≤核数/2)。不在目标区间的 shape 走 StreamK 反而会因 workspace 归约开销劣化,应退回 pingpong / SWAT。
|
|
275
|
+
2. **Workspace 容量开销**:约 `aicNum × 128KB = 3MB+`(FP32),需确认 HBM 预算。
|
|
276
|
+
3. **精度影响**:SK 路径的部分和在 workspace 用 FP32 保存,AIV 归约完成后再 cast 回 FP16/BF16,**精度等价或优于**纯 FP16 归约(减少了中间 round)。
|
|
277
|
+
4. **cmatrixInitVal 陷阱**:每个 SK 分段(每次 `blockMmadOp` 调用)都是独立的 L0C 累加序列,必须 `cmatrixInitVal = (iter0==0 && iter1==0)`;若误写为「全局首次」,则第二个段开始 L0C 会错误累加上个段的结果。
|
|
278
|
+
5. **SK Preload 仅适用 DP+SK**:纯 SK 模式下 `CheckIsSkScene(0) == true`,preload 分支跳过;否则会打乱稳态轮的 tile 分布,导致 workspace 偏移错位。
|
|
279
|
+
6. **末轮 unitFlag 处理**:`iter0 + 1 == curKL1Iter && iter1 + 1 == kL0Iter` 必须 `FINAL_ACCUMULATION`,否则 CUBE 不发出「L0C 就绪」的 block 级同步,FIXP 无法开始搬出。
|
|
280
|
+
7. **serpentine 行窗口继承**:scheduler 里仍用 `WINDOW_LEN=4` 做行窗口 + 奇数行反向(见 `UpdateMNTileIdx`),保证 B 流在片上的复用,不要因引入 K 切分而把这一层打掉。
|
|
281
|
+
|
|
282
|
+
## 7. 实施常见问题与解决方案
|
|
283
|
+
|
|
284
|
+
### 问题 1:Workspace 偏移计算错误,AIV 累加出来是错值
|
|
285
|
+
|
|
286
|
+
**现象**:精度校验失败,输出的 C 矩阵某些 tile 全 0 或重复叠加。
|
|
287
|
+
|
|
288
|
+
**原因**:offsetWorkspace 必须按「**末轮中 MN tile 的 index**」而非 `tileIdx` 直接算:
|
|
289
|
+
|
|
290
|
+
```cpp
|
|
291
|
+
// 错误写法(使用全局 tileIdx)
|
|
292
|
+
offsetWorkspace = tileIdx * BLOCK_BASE_M * BLOCK_BASE_N;
|
|
293
|
+
|
|
294
|
+
// 正确写法(先取末轮 MN 序号)
|
|
295
|
+
offsetWorkspace = (((tileIdx % usedCoreNum) / skKTileNum) * skKTileNum
|
|
296
|
+
+ Get<MNK_K>(singleCoreCoord))
|
|
297
|
+
* BLOCK_BASE_M * BLOCK_BASE_N;
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 问题 2:AIV 等待超时 / 跨核同步 flag 不匹配
|
|
301
|
+
|
|
302
|
+
**现象**:运行 hang,或 AIV 在 SyncAll 处长时间停顿。
|
|
303
|
+
|
|
304
|
+
**原因**:AIC 侧提前 return 的核(`curBlockIdx >= bs.GetBlockNum()`)没有发送 `AIC_SYNC_AIV_FLAG`,AIV 侧 Wait 永远不会满足。
|
|
305
|
+
|
|
306
|
+
**解决方案**:空闲 AIC 核 **必须** 在 return 前补发 flag:
|
|
307
|
+
|
|
308
|
+
```cpp
|
|
309
|
+
if (curBlockIdx >= bs.GetBlockNum(usedCoreNum_)) {
|
|
310
|
+
AscendC::CrossCoreSetFlag<AIC_SYNC_AIV_MODE_4, PIPE_FIX>(AIC_SYNC_AIV_FLAG);
|
|
311
|
+
AscendC::CrossCoreSetFlag<AIC_SYNC_AIV_MODE_4, PIPE_FIX>(AIC_SYNC_AIV_FLAG + FLAG_ID_MAX);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 问题 3:SK 场景下 L0C 累加异常(段之间互相污染)
|
|
317
|
+
|
|
318
|
+
**现象**:多段 K 切分的 tile 算出来的 C 值是累加结果(而非该段的部分和)。
|
|
319
|
+
|
|
320
|
+
**原因**:`cmatrixInitVal` 判定没有考虑 StreamK 每次 `operator()` 都是独立段:
|
|
321
|
+
|
|
322
|
+
```cpp
|
|
323
|
+
// 错误:以为是 DP,固定 false
|
|
324
|
+
bool cmatrixInitVal = false;
|
|
325
|
+
|
|
326
|
+
// 正确:每次 blockMmadOp 调用都是一个独立段
|
|
327
|
+
bool cmatrixInitVal = (iter0 == 0 && iter1 == 0);
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 问题 4:MN 能被 aicNum 整除,误开 StreamK
|
|
331
|
+
|
|
332
|
+
**现象**:打印 `[ERROR] StreamK requires: K >= 4096 and MN split count <= half of core number`;或即使 shape 满足,性能反而劣化。
|
|
333
|
+
|
|
334
|
+
**原因**:
|
|
335
|
+
- DP+SK 的必要条件是 `mCnt·nCnt % aicNum ≠ 0`,整除时退回纯 DP + pingpong 即可。
|
|
336
|
+
- `mCnt·nCnt > aicNum/2` 但 `≤ aicNum` 时(未过 DP+SK 门槛),不要硬开 StreamK。
|
|
337
|
+
|
|
338
|
+
**解决方案**:在 tiling 入口处加门禁(已由 `CheckStreamKSKTiling` / `CheckStreamKDPSKTiling` 实现),否则调度器会跑错的 tileIdx 模式。
|
|
339
|
+
|
|
340
|
+
### 问题 5:baseK 取太大,stepK 被截到 1 失去 L1 pingpong
|
|
341
|
+
|
|
342
|
+
**现象**:优化后 busy 占比没提升,MTE2 和 CUBE 仍然串行。
|
|
343
|
+
|
|
344
|
+
**原因**:`baseK` 受 `l0aSize / DB_SIZE / FP16 / max(baseM,baseN)` 约束。如果误取 `baseK = 128`(FP16 路径),会让 `stepKa = depthA1/2 = 1`,L1 不再双缓冲。
|
|
345
|
+
|
|
346
|
+
**解决方案**:遵循 `CalBaseK` 公式:
|
|
347
|
+
|
|
348
|
+
```cpp
|
|
349
|
+
baseK = min(singleCoreK, FloorAlign(l0aSize/2/sizeof(FP16)/max(baseM,baseN), alignValue));
|
|
350
|
+
// ↑ 典型取 64 (128 bytes / 2 bytes),使 stepKa ≥ 2
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### 问题总结
|
|
354
|
+
|
|
355
|
+
| # | 问题 | 根因 | 解决方案 | 影响 |
|
|
356
|
+
|---|------|------|---------|------|
|
|
357
|
+
| 1 | workspace offset 错位 | 直接用 tileIdx 而非末轮 MN 序号 | 按 `(tileIdx % usedCoreNum) / skKTileNum` 计算 | 精度错误 |
|
|
358
|
+
| 2 | AIV hang / 同步失败 | 空闲 AIC 未发 flag | 提前 return 前补发 CrossCoreSetFlag | 运行超时 |
|
|
359
|
+
| 3 | L0C 跨段污染 | `cmatrixInitVal` 固定 false | 每段首次 `(iter0==0 && iter1==0)` 置 true | 精度错误 |
|
|
360
|
+
| 4 | MN 整除仍开 StreamK | 未走 IsCapable 门禁 | 严格校验 SK/DPSK 判定条件 | 性能劣化 |
|
|
361
|
+
| 5 | stepKa=1 失去 L1 pingpong | baseK 过大挤掉 depth | 按 CalBaseK 公式取 `baseK=64` | 性能未达预期 |
|
|
362
|
+
|
|
363
|
+
## 8. 与 pingpong / SWAT 的取舍
|
|
364
|
+
|
|
365
|
+
| 场景特征 | 推荐策略 |
|
|
366
|
+
|---------|---------|
|
|
367
|
+
| MN 块数 ≥ aicNum 且整除 | **pingpong** 足够,无需 SWAT/StreamK |
|
|
368
|
+
| MN 块数 ≥ aicNum 非整除,末轮有明显尾块且 `baseM/baseN` 宽松 | **SWAT 机制 C**(末轮二维再切分)优先;`baseM·baseN` 已接近 CUBE 最小块时退化为 StreamK (DP+SK) |
|
|
369
|
+
| MN 块数 < aicNum 且 `K` 大(≥ 4096 列) | **StreamK (SK)** 把空闲核用 K 切分拉起来 |
|
|
370
|
+
| MN 块数 < aicNum 但 `K` 也小 | 无法通过 K 切分并行化,只能从 tiling / baseM/baseN 入手重做分块 |
|
|
371
|
+
| 有 M/N 边缘薄片且 `mCnt·nCnt ≥ aicNum` | **SWAT 机制 B**(尾块合并) |
|
|
372
|
+
| B 侧流式带宽严重 | 任何模式都应打开 **SWAT 机制 A**(serpentine 行窗口);StreamK 已内置 |
|
|
373
|
+
|
|
374
|
+
**StreamK 与 SWAT 不是互斥**:StreamK 的 scheduler 内部用了 SWAT 机制 A 的 serpentine 遍历;机制 B(尾块合并)仍可在 tiling 层叠加使用(但在 StreamK 的 FP16 当前版本中暂默认 `mBaseTailSplitCnt=1`)。机制 C(末轮二维再切分)与 StreamK 的 DP+SK 是**同一痛点的两种解法**——根据 `baseM/baseN` 相对 CUBE 单元粒度的松紧,择一使用。
|