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,52 @@
|
|
|
1
|
+
# MatMul 族性能优化指南(六策略互斥判定树)
|
|
2
|
+
|
|
3
|
+
> A 型(单实现调参)。适用 DAV_3510。策略间适用条件构成**互斥判定树**——按证据特征
|
|
4
|
+
> 选策略,禁止「全都加上」。
|
|
5
|
+
>
|
|
6
|
+
> 各策略的完整设计文档(优化目标量化收益 / 架构概览 / 关键参数 / 核心循环前后对照 /
|
|
7
|
+
> 关键修改点)见本目录下 `*_design.md` 与 [best-practices-guide.md](best-practices-guide.md)。
|
|
8
|
+
|
|
9
|
+
## 六策略判定树
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
判定输入(verdict findings + shape/tiling 特征)
|
|
13
|
+
│
|
|
14
|
+
├─ 所有 matmul 基线 ────────────────→ ① pingpong(L1/L0 双缓冲 + MTE2/MTE1/Fixpipe
|
|
15
|
+
│ 事件同步流水化;其它优化的默认前置)
|
|
16
|
+
├─ MN 够并行(totalBlockCnt > aicNum 数倍)且尾碎片负载不均
|
|
17
|
+
│ → ② swat(蛇形行窗口 + 尾块合并 + 末轮二维再切分)
|
|
18
|
+
├─ MN 欠并行(totalBlockCnt < aicNum)+ K ≥2048
|
|
19
|
+
│ → ③ streamk(SK / DP+SK:切 K 到空闲核,AIV 归约)
|
|
20
|
+
├─ 小侧矩阵 ≤ L1/2 + 对侧 T≥2 + 真 MTE2 bound
|
|
21
|
+
│ → ④ fullload(小侧 + 随路 Scale 一次性驻留 L1)
|
|
22
|
+
├─ 假 MTE2 bound(busy 高但带宽利用率 <70%)+ <20KB 小块
|
|
23
|
+
│ → ⑤ scale_coalescing(scaleKL1 = SCALE_L1_BUFFER_NUM
|
|
24
|
+
│ × kL1 合并成一次大 MTE2)
|
|
25
|
+
└─ pingpong 已开 + 各流水 busy ≤70%(准无 bound)+ 流水图 PING/PONG 间有 gap
|
|
26
|
+
→ ⑥ mte2_preload(三段结构:首轮 PING/预取 PONG/消费;
|
|
27
|
+
零 TilingData 数值改动)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 策略-判定规则映射
|
|
31
|
+
|
|
32
|
+
| 策略 | 触发证据(verdict) | 设计文档 |
|
|
33
|
+
|------|--------------------|---------|
|
|
34
|
+
| ① pingpong | 基线必选(L1_SERIAL_NO_OVERLAP 命中即受益) | [pingpong_design.md](pingpong_design.md) |
|
|
35
|
+
| ② swat | L2_CORE_TAIL / L2_IMBALANCE_*(尾碎片形态) | [swat_design.md](swat_design.md) |
|
|
36
|
+
| ③ streamk | L2_UNDERUTILIZATION(MN 欠并行) | [streamk_design.md](streamk_design.md) |
|
|
37
|
+
| ④ fullload | L1_MTE2_BOUND + 反证 true-bandwidth-saturation(真饱和) | [fullload_design.md](fullload_design.md) |
|
|
38
|
+
| ⑤ scale_coalescing | L1_MTE2_BOUND + 反证 fake-mte2-small-packet(假 bound) | [scale_coalescing_design.md](scale_coalescing_design.md) |
|
|
39
|
+
| ⑥ mte2_preload | 全 pipe busy ≤70%(准无 bound)+ 流水图 gap | [mte2_preload_design.md](mte2_preload_design.md) |
|
|
40
|
+
|
|
41
|
+
## 容量约束公式(fullload/streamk 前置核算)
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
L1 预算: 分形 A + 分形 B + ping-pong 缓冲 ≤ L1 总容量
|
|
45
|
+
L0 预算: mL0 + nL0 + kL0 ≤ L0A/L0B/L0C 分域容量
|
|
46
|
+
UB 预算: tile 输入 × bufNum(2) + 输出 ≤ UB 容量
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 叠加关系
|
|
50
|
+
|
|
51
|
+
① 为其它策略前置;②③ 与 ④⑤ 通常互斥(并行度形态相反);⑥ 可与 ① 叠加;
|
|
52
|
+
⑤ 消除后复查是否转化为 ④ 形态。
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# matmul MTE2 预加载(MTE2 Preload)优化设计
|
|
2
|
+
|
|
3
|
+
## 1. 优化目标
|
|
4
|
+
|
|
5
|
+
针对 matmul 族(含 `matmul`、`matmul_mxfp4`、`matmul_mxfp8`、`batch_matmul` 等变体)在 **pingpong 双缓冲已启用但仍存在 MTE2_PONG 发射阻塞** 的场景下,通过在**首轮一次性预加载两份 A/B tile 到 L1**,使 `MTE2_PONG` 指令提前发射,绕开芯片指令队列深度上限导致的被动等待,保持 MTE2 → MTE1 → CUBE 三级流水在指令发射层面的连续性。
|
|
6
|
+
|
|
7
|
+
典型收益:Task 时间 **−3%–10%**(对应 `matmul` BF16 `M=1024, K=4096, N=2048` 实测 `66.0μs → 63.3μs`,约 **−4%**;MTE2 段 `37.6μs → 32.7μs`,约 **−13%**)。
|
|
8
|
+
|
|
9
|
+
> **增强层定位**:MTE2 Preload 是 **pingpong 双缓冲之上的 Kernel 指令调度增强**,**不改动 TilingData 字段**(`baseM/baseN/baseK`、`stepK`、`kL1`、`nBufferNum`、`scaleKL1` 等都保持原值),仅修改 Kernel 主循环的 MTE2 发射时序。与 SWAT / A-Full-Load / B-Full-Load / StreamK / 小数据块合并载入等 Tiling 层优化**正交**,可任意叠加(叠加后仍需满足相应层的 L1 预算约束)。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 2. 架构概览
|
|
14
|
+
|
|
15
|
+
### 2.1 未优化路径(pingpong 已开但 PONG 被阻塞)
|
|
16
|
+
|
|
17
|
+
双缓冲语义下,`MTE2_PING`(本轮搬 L1[0])发完之后,**下一轮** `MTE2_PONG`(本轮搬 L1[1])必须等**所有发射在 PING 之后的指令**都发完才能拿到发射机会。当 PING 与 PONG 之间插入的指令数超过芯片预设指令队列深度(硬件参数,不可软件调大),即使 PING 的数据依赖已解除,PONG 仍会被指令队列阻塞。
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
时间线 → (pingpong 常规实现)
|
|
21
|
+
───────────────────────────────────────────────────────────────
|
|
22
|
+
MTE2: [PING 发射]────────────────────[PONG 被阻塞,被动等待]────[PONG 发射]
|
|
23
|
+
MTE1: [PING→L0] [MMAD 多轮] [PONG→L0]
|
|
24
|
+
CUBE: [MMAD MMAD ...]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- 现象:`trace_core*.json` 中 `MTE2_PONG` 事件起点 ≫ 理论起点(≈ `MTE2_PING` 事件终点);PING ↔ PONG 之间存在**确定性 gap**
|
|
28
|
+
- 不是 MTE2 带宽 bound,不是 CUBE bound,常呈 **"pingpong 已启用但各流水 busy 仍 ≤ 60%–70%"** 的"准无 bound"形态
|
|
29
|
+
- **KL1 已无法继续缩减**:继续缩减 `kL1` 会减少 PING/PONG 之间插入的指令数(化解阻塞),但单次覆盖 K 减少 → 外层循环次数上升 → 循环起停开销上升 / CUBE busy 下降,**净收益为负**
|
|
30
|
+
|
|
31
|
+
### 2.2 优化路径(MTE2 Preload:首轮一次发两份,解耦 PONG 发射)
|
|
32
|
+
|
|
33
|
+
**核心思想**:把 "第 1 轮搬 PING、第 2 轮搬 PONG" 的顺序改为 **"第 1 轮先搬 PING 再紧跟着搬 PONG"**(提前把第二份数据发射进 L1),使 PONG 的发射时机**前移到 PING 之后几条指令内**,完全落在指令队列深度范围内。后续各轮继续用双缓冲轮换,但 **一直保持"当前轮算的是 L1[cur],MTE2 已经搬好 L1[1-cur]"** 的错拍状态。
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
时间线 → (MTE2 Preload)
|
|
37
|
+
────────────────────────────────────────────────────────────────
|
|
38
|
+
MTE2: [PING 发射][PONG 发射]─────[PING2 发射][PONG2 发射]─── ...
|
|
39
|
+
MTE1: [PING→L0][PONG→L0][PING2→L0] ...
|
|
40
|
+
CUBE: [MMAD MMAD MMAD ...]
|
|
41
|
+
|
|
42
|
+
关键差异:
|
|
43
|
+
- PING/PONG 在首轮被紧邻发射(指令队列深度内,不阻塞)
|
|
44
|
+
- 后续各轮的 "PONG → PING_{next}" 也在指令队列深度内(错拍一轮,形成稳态)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 2.3 L1 布局(不变)
|
|
48
|
+
|
|
49
|
+
MTE2 Preload **不改 L1 布局**,沿用 pingpong 的 `[A_ping | A_pong | B_ping | B_pong | scaleA_ping | scaleA_pong | scaleB_ping | scaleB_pong]` 排布(见 `pingpong_design.md §2.1 / §3.1`)。唯一差异是**首轮的搬运时序**:原本 `[搬 L1_ping → 算 → 搬 L1_pong → 算 → ...]`,改为 `[搬 L1_ping → 搬 L1_pong → 算 L1_ping → 搬 L1_next_ping → 算 L1_pong → ...]`。
|
|
50
|
+
|
|
51
|
+
### 2.4 事件同步模型(相对 pingpong 的增量)
|
|
52
|
+
|
|
53
|
+
| 事件类型 | pingpong 基线用途 | MTE2 Preload 增量 |
|
|
54
|
+
|---------|-----------------|-----------------|
|
|
55
|
+
| `MTE1_MTE2(l1BufId)` | L1 buffer 释放控制 | **首轮两份 L1 buffer 都需要在 Init 时预置 SetFlag**(基线只需按 pingpong 数预置,本优化保持一致,但 WaitFlag 顺序要按"先等 PING 的,再等 PONG 的"排) |
|
|
56
|
+
| `MTE2_MTE1(l1BufId)` | L1 数据就绪通知 | **首轮发两次 SetFlag**(PING 搬完发一次、PONG 搬完发一次),内层循环按 `l1BufId` 对应取 |
|
|
57
|
+
| `M_MTE1` / `MTE1_M` / `M_FIX` / `FIX_M` | L0 / L0C 同步 | 不变 |
|
|
58
|
+
|
|
59
|
+
关键约束:**首轮(`tileIdx / blockNum == 0 && iter0 == 0`)必须把两份 tile(PING + PONG)都搬完再进入 MMAD**;后续各轮(`tileIdx / blockNum > 0` 或 `iter0 > 0`)每轮只搬一份对侧 buffer,形成稳态错拍。
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. 关键参数配置
|
|
64
|
+
|
|
65
|
+
MTE2 Preload **不引入新的 TilingData 字段**,沿用 pingpong 的参数集即可:
|
|
66
|
+
|
|
67
|
+
```cpp
|
|
68
|
+
constexpr uint32_t BASE_M = 256; // L0 tile M 维度
|
|
69
|
+
constexpr uint32_t BASE_N = 256; // L0 tile N 维度
|
|
70
|
+
constexpr uint32_t BASE_K = 128; // L0 tile K 维度(按 dtype 折算,本示例 FP16)
|
|
71
|
+
constexpr uint32_t PINGPONG_NUM = 2; // pingpong 双缓冲(前置条件,必须开)
|
|
72
|
+
constexpr uint64_t kL1 = 512 / sizeof(T); // L1 中单个 buffer 的 K 大小
|
|
73
|
+
|
|
74
|
+
// 新增常量(Kernel 内部使用,不下发 Tiling)
|
|
75
|
+
constexpr uint64_t BUFFER_GAP = 2; // 预加载跨度 = 2(PING + PONG 一次性发射)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
> **没有新的 Host Tiling 字段**:MTE2 Preload 的启用 / 禁用在 Kernel 侧通过"首轮 `iter0 == 0` 的分支判断"实现,Host 不需要下发开关;但**建议建模/策略阶段在《性能优化方案》里显式说明"启用 MTE2 Preload"**,以便实施专家定位到本 design.md。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 4. 核心计算循环(相对 pingpong 的增量改造)
|
|
83
|
+
|
|
84
|
+
### 4.1 改造前(常规 pingpong)
|
|
85
|
+
|
|
86
|
+
```cpp
|
|
87
|
+
for (tileIdx = curBlockIdx; tileIdx < tileNum; tileIdx += blockNum) {
|
|
88
|
+
for (iter0 = 0; iter0 < kL1TileNum; ++iter0) {
|
|
89
|
+
l1BufId = l1PingPong & 1;
|
|
90
|
+
|
|
91
|
+
// 每轮都搬一份
|
|
92
|
+
WaitFlag<MTE1_MTE2>(l1BufId);
|
|
93
|
+
CopyGM2L1(A[tileIdx, iter0] → L1[l1BufId]);
|
|
94
|
+
CopyGM2L1(B[tileIdx, iter0] → L1[l1BufId]);
|
|
95
|
+
SetFlag<MTE2_MTE1>(l1BufId);
|
|
96
|
+
|
|
97
|
+
WaitFlag<MTE2_MTE1>(l1BufId);
|
|
98
|
+
// inner loop: L1 → L0 → MMAD
|
|
99
|
+
...
|
|
100
|
+
SetFlag<MTE1_MTE2>(l1BufId);
|
|
101
|
+
l1PingPong++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 4.2 改造后(MTE2 Preload)
|
|
107
|
+
|
|
108
|
+
```cpp
|
|
109
|
+
for (tileIdx = curBlockIdx; tileIdx < tileNum; tileIdx += blockNum) {
|
|
110
|
+
for (iter0 = 0; iter0 < kL1TileNum; ++iter0) {
|
|
111
|
+
l1BufId = l1PingPong & 1;
|
|
112
|
+
|
|
113
|
+
// 段 1:首轮首个分片(tileIdx / blockNum == 0 && iter0 == 0)
|
|
114
|
+
// 搬 PING 到 L1[l1BufId]
|
|
115
|
+
if (tileIdx / blockNum == 0 && iter0 == 0) {
|
|
116
|
+
WaitFlag<MTE1_MTE2>(l1BufId);
|
|
117
|
+
CopyGM2L1(A[0, 0] → L1[l1BufId]);
|
|
118
|
+
CopyGM2L1(B[0, 0] → L1[l1BufId]);
|
|
119
|
+
SetFlag<MTE2_MTE1>(l1BufId);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 段 2:预取下一分片(首轮后续分片 或 非首轮所有分片)
|
|
123
|
+
// 搬 PONG 到 L1[1 - l1BufId](首轮后续)/ 对侧 buffer(非首轮)
|
|
124
|
+
// → 关键:首轮 iter0==0 走完段 1 后紧跟段 2,等效"一次发射两份 MTE2"
|
|
125
|
+
if (tileIdx / blockNum > 0 ||
|
|
126
|
+
(tileIdx / blockNum == 0 && kL1TileNum > 1 && iter0 + 1 < kL1TileNum)) {
|
|
127
|
+
uint64_t curL1BufId = l1BufId;
|
|
128
|
+
uint64_t curOffsetL1 = iter0 * kL1;
|
|
129
|
+
|
|
130
|
+
if (tileIdx / blockNum == 0) {
|
|
131
|
+
curOffsetL1 = (iter0 + 1) * kL1; // 首轮后续:搬下一 K 分片
|
|
132
|
+
curL1BufId = 1 - l1BufId; // 切到另一块 L1 buffer
|
|
133
|
+
// K 向尾片处理:若 iter0 + 1 是最后一分片,curGmKL1 = k - (iter0+1)*kL1
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
WaitFlag<MTE1_MTE2>(curL1BufId);
|
|
137
|
+
CopyGM2L1(A[tileIdx, curOffsetL1] → L1[curL1BufId]);
|
|
138
|
+
CopyGM2L1(B[tileIdx, curOffsetL1] → L1[curL1BufId]);
|
|
139
|
+
SetFlag<MTE2_MTE1>(curL1BufId);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// 段 3:消费 L1[l1BufId](读 L0 + MMAD)
|
|
143
|
+
WaitFlag<MTE2_MTE1>(l1BufId);
|
|
144
|
+
for (iter1 = 0; iter1 < kL0IterNum; ++iter1) {
|
|
145
|
+
// inner loop: L1 → L0 → MMAD(不变)
|
|
146
|
+
...
|
|
147
|
+
}
|
|
148
|
+
SetFlag<MTE1_MTE2>(l1BufId); // 释放当前 L1 buffer,供下一轮 MTE2 覆写
|
|
149
|
+
l1PingPong++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 4.3 流水时序对照
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
常规 pingpong (PONG 被阻塞):
|
|
158
|
+
MTE2: [MTE2 PING]─────────────────────[MTE2 PONG]──[MTE2 PING2]─
|
|
159
|
+
^阻塞等待^
|
|
160
|
+
MTE1: [MTE1 PING→L0] [MTE1 PONG→L0]
|
|
161
|
+
CUBE: [MMAD MMAD MMAD ...]
|
|
162
|
+
|
|
163
|
+
MTE2 Preload (稳态错拍):
|
|
164
|
+
MTE2: [MTE2 PING][MTE2 PONG]───[MTE2 PING2][MTE2 PONG2]──
|
|
165
|
+
^提前发射^
|
|
166
|
+
MTE1: [MTE1 PING][MTE1 PONG][MTE1 PING2]
|
|
167
|
+
CUBE: [MMAD MMAD MMAD MMAD ...]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 5. 从 pingpong 到 MTE2 Preload 的关键修改点
|
|
173
|
+
|
|
174
|
+
| 修改项 | pingpong 基线 | MTE2 Preload |
|
|
175
|
+
|--------|--------------|---------------|
|
|
176
|
+
| 外层循环 MTE2 搬运条件 | 每轮搬一次 | 分两段条件判断(段 1:首轮首分片搬 PING;段 2:后续每轮搬下一分片 PONG) |
|
|
177
|
+
| 首轮事件初始化 | Init 中 `SetFlag<MTE1_MTE2>(0/1)` 各一次 | **保持不变**(两份 L1 buffer 都需要初始释放 flag),但首轮 `WaitFlag` 顺序为"先等 PING 的 `MTE1_MTE2(PING_id)`,再等 PONG 的 `MTE1_MTE2(PONG_id)`" |
|
|
178
|
+
| 首轮搬运条件 | 无特殊分支,进入循环就搬 | `if (tileIdx / blockNum == 0 && iter0 == 0)` 段 1 只搬 PING;`if (iter0 + 1 < kL1TileNum)` 段 2 搬 PONG |
|
|
179
|
+
| 尾片处理 | 循环最后一轮自然退出 | 段 2 条件中必须加 `iter0 + 1 < kL1TileNum` 限制,**避免越界预取**(末轮不再发起下一分片 MTE2) |
|
|
180
|
+
| `MTE2_MTE1` 事件 | 每轮 `SetFlag + WaitFlag` 一次 | 首轮 `iter0 == 0` 发**两次 SetFlag**(PING 一次、PONG 一次),后续每轮发一次;消费段按 `l1BufId` 对应 WaitFlag |
|
|
181
|
+
| `curL1BufId` 语义 | 固定 `l1PingPong & 1` | 首轮首分片用 `l1BufId`;首轮后续分片切换到 `1 - l1BufId`(提前把下一分片搬到对侧 buffer) |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 6. 注意事项
|
|
186
|
+
|
|
187
|
+
1. **前置条件:pingpong 必须先启用**。未开 pingpong 时 `l1BufNum = 1`,根本没有 PING/PONG 概念,谈不上"PONG 阻塞",MTE2 Preload 无意义,此时应先按 `pingpong_design.md` 启用双缓冲
|
|
188
|
+
2. **L1 容量**:MTE2 Preload 不额外占 L1(只是提前搬,不是多开一份 buffer),L1 预算与 pingpong 一致;但若同时叠加 A/B-Full-Load 或小数据块合并载入,须按各自 design.md 校验 L1 预算
|
|
189
|
+
3. **尾片边界**:首轮 `iter0 + 1 < kL1TileNum` 是**关键判断**,漏掉必越界;末轮不再触发下一分片 MTE2,也不要覆盖已搬好的数据
|
|
190
|
+
4. **首轮双搬的两份数据**:段 1 搬的是**本轮** tile 的 PING(`curOffsetL1 = iter0 * kL1 = 0`);段 2 搬的是**本轮 tile 的下一分片** PONG(`curOffsetL1 = (iter0 + 1) * kL1 = kL1`)。**不要把段 2 误写成"下一 tile 的 PING"**(会导致本轮内层 MMAD 读不到第二分片)
|
|
191
|
+
5. **多 tile 场景(非首轮)**:非首轮 tile(`tileIdx / blockNum > 0`)不需要段 1,只需段 2 每轮预取"下一 K 分片到对侧 buffer"。首轮 tile 末段 MTE2 已为下一 tile 的首段 L1 做好预取(跨 tile 的 pingpong 自然衔接)
|
|
192
|
+
6. **精度验证**:优化后必须通过现有精度验证(小数据块偏移、flag 配对错误都会导致精度错误)
|
|
193
|
+
7. **效果依赖指令队列深度**:本优化收益取决于"PING/PONG 之间插入的指令数"与"芯片指令队列深度"的差距。指令数 ≫ 队列深度时收益最大;指令数 < 队列深度时本来就不阻塞,收益 ≈ 0
|
|
194
|
+
8. **代码复杂度**:分支判断和 flag 管理复杂度显著上升;scalar busy 可能从 **~3μs 升到 ~6μs**(见实测对照表)—— 这是已知取舍,正常情况下 MTE2 段节省远大于 scalar 段增量
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 7. 实施常见问题与解决方案
|
|
199
|
+
|
|
200
|
+
### 问题 1:首轮段 1 的 `WaitFlag<MTE1_MTE2>` 漏发
|
|
201
|
+
|
|
202
|
+
**现象**:kernel 挂起或 L1 数据被脏写,精度错误。
|
|
203
|
+
|
|
204
|
+
**原因**:pingpong 基线里每轮入口先 `WaitFlag<MTE1_MTE2>(l1BufId)`;段 1 是新加的"首轮专用分支",容易忘记写 WaitFlag,导致首次 MTE2 时 L1 [l1BufId] 的释放 flag 还没被等到。
|
|
205
|
+
|
|
206
|
+
**解决方案**:段 1 入口严格保留 `AscendC::WaitFlag<AscendC::HardEvent::MTE1_MTE2>(l1BufId);`;Init 中的 `SetFlag<MTE1_MTE2>(0)` 和 `SetFlag<MTE1_MTE2>(1)` 两次预置**都不能省**(MTE2 Preload 在首轮需要两个 L1 buffer 的释放 flag 都到位)。
|
|
207
|
+
|
|
208
|
+
### 问题 2:首轮段 2 的 `curL1BufId` 未切到对侧
|
|
209
|
+
|
|
210
|
+
**现象**:首轮 `iter0 == 0` 的段 1 和段 2 都写到了同一个 L1 buffer,第二分片把第一分片覆写了,内层 MMAD 读到错数据。
|
|
211
|
+
|
|
212
|
+
**原因**:段 2 忘记加 `curL1BufId = 1 - l1BufId` 的切换语句(首轮专用),继续沿用段 1 的 `l1BufId`。
|
|
213
|
+
|
|
214
|
+
**解决方案**:段 2 入口必须写:
|
|
215
|
+
```cpp
|
|
216
|
+
if (tileIdx / blockNum == 0) {
|
|
217
|
+
curOffsetL1 = (iter0 + 1) * kL1;
|
|
218
|
+
curL1BufId = 1 - l1BufId; // 必须切换到对侧 L1
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
非首轮 tile 不需要切换,`curL1BufId = l1BufId` 即可(pingpong 自然轮换)。
|
|
222
|
+
|
|
223
|
+
### 问题 3:段 2 越界预取
|
|
224
|
+
|
|
225
|
+
**现象**:末轮 `iter0 = kL1TileNum - 1` 仍触发段 2,搬了 `(iter0 + 1) * kL1` 分片,越过了 K 边界读到非法 GM 地址;报错或精度错误。
|
|
226
|
+
|
|
227
|
+
**原因**:段 2 条件漏写 `iter0 + 1 < kL1TileNum`。
|
|
228
|
+
|
|
229
|
+
**解决方案**:段 2 条件必须为 `(tileIdx / blockNum > 0 || (tileIdx / blockNum == 0 && kL1TileNum > 1 && iter0 + 1 < kL1TileNum))`;末轮时段 2 不执行,由段 3 消费最后一份数据后自然退出。
|
|
230
|
+
|
|
231
|
+
### 问题 4:`MTE2_MTE1` 事件配对错位
|
|
232
|
+
|
|
233
|
+
**现象**:偶现 kernel 挂起(`WaitFlag<MTE2_MTE1>(l1BufId)` 等不到匹配的 SetFlag);或数据就绪前就被 MTE1 读到。
|
|
234
|
+
|
|
235
|
+
**原因**:首轮 `iter0 == 0` 发了两次 `SetFlag<MTE2_MTE1>`(段 1 发 `l1BufId` 一次,段 2 发 `curL1BufId = 1 - l1BufId` 一次);但后续段 3 里只 `WaitFlag<MTE2_MTE1>(l1BufId)` 等一次。下一轮入口 `iter0 == 1` 时,`l1BufId` 已轮换到 `1 - l1BufId`,此时应该读"首轮段 2 搬的 PONG",对应的 SetFlag 是首轮段 2 发的那一次,配对成立;**但若工程师误把段 3 的 WaitFlag 放到了段 1 内部**(而不是段 1 / 段 2 之后的公共位置),会导致首轮只等到 PING 就开始读,把未就绪的 PONG 也读进 L0。
|
|
236
|
+
|
|
237
|
+
**解决方案**:`WaitFlag<MTE2_MTE1>(l1BufId)` 必须放在段 3(消费段)入口,段 1 和段 2 只发 SetFlag,不消费;**两者的 WaitFlag 天然被外层循环按 pingpong 轮换错开**。
|
|
238
|
+
|
|
239
|
+
### 问题 5:仅测试小 K 场景(`kL1TileNum == 1`)看不到收益
|
|
240
|
+
|
|
241
|
+
**现象**:小 K 场景(如 `K = 256, kL1 = 512`,`kL1TileNum = 1`)跑出来和 pingpong 基线性能一样。
|
|
242
|
+
|
|
243
|
+
**原因**:`kL1TileNum == 1` 时段 2 的条件 `iter0 + 1 < kL1TileNum` 永远不成立,首轮段 2 不触发 → 退化为"每 tile 只搬一次",MTE2 Preload 不生效。这是**预期行为**:小 K 下 PING 与 PONG 之间插入的指令数少,指令队列阻塞本来就不显著。
|
|
244
|
+
|
|
245
|
+
**解决方案**:收益验证应选 `K ≥ 2 × kL1` 且 `kL1TileNum ≥ 2` 的 shape(如教程例 `M=1024, K=4096, N=2048`,`kL1 = 256`,`kL1TileNum = 16`),才能观察到 MTE2 段 cycle 节省。
|
|
246
|
+
|
|
247
|
+
### 问题总结
|
|
248
|
+
|
|
249
|
+
| # | 问题 | 根因 | 解决方案 | 影响 |
|
|
250
|
+
|---|------|------|---------|------|
|
|
251
|
+
| 1 | 段 1 漏 WaitFlag | 新增分支忘写 `WaitFlag<MTE1_MTE2>` | 段 1 入口必须保留 WaitFlag | 挂起 / 数据脏写 |
|
|
252
|
+
| 2 | `curL1BufId` 未切换 | 段 2 沿用段 1 的 `l1BufId` | `if (tileIdx/blockNum==0) curL1BufId = 1 - l1BufId` | 数据覆写 / 精度错 |
|
|
253
|
+
| 3 | 段 2 越界预取 | 漏判 `iter0 + 1 < kL1TileNum` | 段 2 条件严格包含末轮边界 | GM 非法访问 |
|
|
254
|
+
| 4 | `MTE2_MTE1` 配对错位 | WaitFlag 放错位置 | WaitFlag 只放段 3 入口 | 数据未就绪 / 挂起 |
|
|
255
|
+
| 5 | 小 K 场景无收益 | `kL1TileNum == 1` 段 2 不触发 | 选 `kL1TileNum ≥ 2` 的 shape 验证 | 看起来"无效"(实际是场景不适用) |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 8. 实测性能(教程参考)
|
|
260
|
+
|
|
261
|
+
以 `M=1024, K=4096, N=2048`、BF16、`baseM=baseN=256, baseK=128/sizeof(BF16)=64, kL1=512/sizeof(BF16)=256, kL1TileNum=16, PINGPONG_NUM=2` 为例:
|
|
262
|
+
|
|
263
|
+
| 版本 | kernel (μs) | mac (μs) | scalar (μs) | mte1 (μs) | **mte2 (μs)** | fixpipe (μs) | icache_miss (%) |
|
|
264
|
+
|------|------------|---------|------------|----------|--------------|-------------|----------------|
|
|
265
|
+
| pingpong 基线(n_buffer) | 66.000 | 40.810 | 2.558 | 10.659 | **37.595** | 1.980 | 1.200 |
|
|
266
|
+
| **MTE2 Preload** | **63.288** | 41.880 | 5.924 | 14.299 | **32.722** | 2.543 | 0.500 |
|
|
267
|
+
| Δ | **−2.712(−4.1%)** | +1.070 | +3.366 | +3.640 | **−4.873(−13.0%)** | +0.563 | −0.700 |
|
|
268
|
+
|
|
269
|
+
**关键观察**:
|
|
270
|
+
- **MTE2 段 −13% 是本优化的直接收益**(PONG 发射不再被阻塞)
|
|
271
|
+
- scalar / mte1 轻微上升是分支判断和事件处理复杂度的正常代价
|
|
272
|
+
- kernel 净收益 **−4.1%**(MTE2 段节省 > 其他段增量)
|
|
273
|
+
- icache_miss 下降是循环结构简化的副效应
|
|
274
|
+
|
|
275
|
+
> 不同 shape 下净收益波动范围 **−3% ~ −10%**。收益上界取决于 MTE2 占比(MTE2 占比越高,节省越显著)和指令队列阻塞程度(PING/PONG 间插入指令数越多,阻塞越严重,收益越大)。
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 9. 选型决策(与策略专家共享)
|
|
280
|
+
|
|
281
|
+
| 场景判定 | 建议 | 原因 |
|
|
282
|
+
|---------|------|------|
|
|
283
|
+
| pingpong 未启用 | **先开 pingpong,不要直接上 MTE2 Preload** | 本优化的前置条件是 pingpong 已开,未开时"PING/PONG 阻塞"不存在 |
|
|
284
|
+
| pingpong 已开;`kL1TileNum < 2` | 不开 MTE2 Preload | 段 2 不触发,等价于退回 pingpong 基线 |
|
|
285
|
+
| pingpong 已开;流水图显示 MTE2_PONG 被明显延迟(PING 终点与 PONG 起点 gap 大) | **推荐开 MTE2 Preload** | 本优化的直接信号 |
|
|
286
|
+
| pingpong 已开;MTE2 busy > 85% 且带宽利用率 ≥ 85%(真 MTE2 bound HBM 打满型) | 不推荐(收益小) | 瓶颈在 HBM 带宽,不在 MTE2 发射;应先走 A/B-Full-Load 或 baseK 调整 |
|
|
287
|
+
| pingpong 已开;MTE2 busy > 60% 且带宽利用率 < 70%(假 MTE2 bound 小数据块密集) | **先上小数据块合并载入,再叠加 MTE2 Preload** | 小数据块合并载入能把单次搬运拉到 ≥ 20 KB,间接减少 PING/PONG 间指令数;若仍有发射阻塞,MTE2 Preload 继续叠加 |
|
|
288
|
+
| pingpong + A/B-Full-Load 已开;流水图仍显示全载侧首轮 MTE2 后有 gap | **可叠加 MTE2 Preload** | 全载侧只在首轮搬一次,对侧 pingpong 仍存在阻塞风险;叠加后首轮 MTE2 按"全载侧 + 对侧 PING + 对侧 PONG"依次发射 |
|
|
289
|
+
| StreamK 分支 | 可叠加但收益有限 | StreamK 固定 `l1BufferNum=2`、每核 `skSingleCoreK ≥ 2048`,MTE2 段天然大,发射阻塞概率低 |
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 10. 与其他优化的叠加关系总表
|
|
294
|
+
|
|
295
|
+
| 叠加对象 | 兼容性 | 语义与注意事项 |
|
|
296
|
+
|---------|-------|---------------|
|
|
297
|
+
| **pingpong 双缓冲** | ✅ **前置条件** | MTE2 Preload 本质是 pingpong 的指令级增强,必须先开 pingpong |
|
|
298
|
+
| **SWAT 机制 A/B/C** | ✅ 兼容 | SWAT 改的是 `GetTileIdx` 顺序,不影响 MTE2 发射时序 |
|
|
299
|
+
| **StreamK(SK / DP+SK)** | ✅ 兼容但收益有限 | StreamK 下 MTE2 段天然够长,阻塞风险低 |
|
|
300
|
+
| **A-Full-Load / B-Full-Load(减少重复载入)** | ✅ 兼容 | 全载只改驻留侧布局,对侧仍 pingpong,MTE2 Preload 作用于对侧 |
|
|
301
|
+
| **小数据块合并载入(Scale Access Coalescing)** | ✅ 兼容(**推荐先合并再 Preload**) | 合并载入把单次 MTE2 拉大,间接减少 PING/PONG 间指令数;若仍有发射阻塞,叠加 MTE2 Preload |
|
|
302
|
+
| **指令队列深度软件调大** | ❌ 不存在(硬件约束) | 指令队列深度是芯片固定值,软件只能绕开,不能调大 |
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 11. 自检清单(实施专家在提交代码前完成)
|
|
307
|
+
|
|
308
|
+
- [ ] **pingpong 双缓冲已启用**(`l1BufNum = 2`,L1 内存布局含 PING/PONG 两份 A/B)
|
|
309
|
+
- [ ] `kL1TileNum ≥ 2`(`K / kL1 ≥ 2`),否则段 2 不触发
|
|
310
|
+
- [ ] 外层循环引入**段 1**(首轮首分片,`tileIdx/blockNum == 0 && iter0 == 0`)专用分支
|
|
311
|
+
- [ ] 外层循环引入**段 2**(预取下一分片)分支,条件含 `iter0 + 1 < kL1TileNum`
|
|
312
|
+
- [ ] 段 2 在首轮(`tileIdx/blockNum == 0`)时有 `curL1BufId = 1 - l1BufId` 切换;非首轮保持 `curL1BufId = l1BufId`
|
|
313
|
+
- [ ] 段 1 与段 2 都有独立的 `WaitFlag<MTE1_MTE2>` + `SetFlag<MTE2_MTE1>`
|
|
314
|
+
- [ ] 段 3(消费段)只在入口 `WaitFlag<MTE2_MTE1>(l1BufId)` 一次,不在段 1 / 段 2 内部 Wait
|
|
315
|
+
- [ ] Init 中 `SetFlag<MTE1_MTE2>(0)` 和 `SetFlag<MTE1_MTE2>(1)` 两次预置都保留
|
|
316
|
+
- [ ] Kernel 结束前 `WaitFlag<MTE1_MTE2>(0)` 和 `WaitFlag<MTE1_MTE2>(1)` 两次收尾(与 pingpong 基线一致)
|
|
317
|
+
- [ ] **精度验证通过**(小数据块偏移、flag 配对错误都会导致精度错误)
|
|
318
|
+
- [ ] 性能对比报告已给出 kernel / mac / scalar / mte1 / **mte2** / fixpipe 各段对照;**mte2 段应显著下降**(若未下降,说明场景不适用或代码写错)
|
|
319
|
+
|
|
320
|
+
若缺任一项,应回到 §7 问题列表排查,或标注"MTE2 Preload 在本场景下不适用,回退 pingpong 基线"。
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# matmul Pingpong 双缓冲优化设计
|
|
2
|
+
|
|
3
|
+
## 1. 优化目标
|
|
4
|
+
|
|
5
|
+
将 matmul 算子(含 MXFP4/MXFP8 等量化变体)从**串行执行**(GM→L1→L0→CUBE→L0C→GM 逐步等待)改为**三级流水并行**,通过 L1 和 L0 的 pingpong 双缓冲,使搬运和计算重叠执行,预期 case 总时间缩短至原来的 50%–60%。
|
|
6
|
+
|
|
7
|
+
## 2. 架构概览
|
|
8
|
+
|
|
9
|
+
### 2.1 存储层级与数据流
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
GM (Global Memory)
|
|
13
|
+
│
|
|
14
|
+
│ MTE2 (GM → L1)
|
|
15
|
+
▼
|
|
16
|
+
L1 Buffer [A_ping | A_pong | B_ping | B_pong | scaleA_ping | scaleA_pong | scaleB_ping | scaleB_pong]
|
|
17
|
+
│
|
|
18
|
+
│ MTE1 (L1 → L0A/L0B)
|
|
19
|
+
▼
|
|
20
|
+
L0A / L0B Buffer [half_0 | half_1] ← L0 也做 pingpong
|
|
21
|
+
│
|
|
22
|
+
│ CUBE (L0A × L0B → L0C)
|
|
23
|
+
▼
|
|
24
|
+
L0C Buffer
|
|
25
|
+
│
|
|
26
|
+
│ FIXP + MTE3 (L0C → GM)
|
|
27
|
+
▼
|
|
28
|
+
GM (Output)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2.2 双缓冲原理
|
|
32
|
+
|
|
33
|
+
**L1 层级**:将 L1 空间分为 2 份(ping/pong),MTE2 搬下一轮数据到 L1[next] 的同时,MTE1 从 L1[cur] 搬数据到 L0。
|
|
34
|
+
|
|
35
|
+
**L0 层级**:将 L0A/L0B 空间各分为 2 份(half_0/half_1),MTE1 搬下一轮数据到 L0[next] 的同时,CUBE 处理 L0[cur]。
|
|
36
|
+
|
|
37
|
+
### 2.3 事件同步模型
|
|
38
|
+
|
|
39
|
+
| 事件类型 | 含义 | 用途 |
|
|
40
|
+
|---------|------|------|
|
|
41
|
+
| `MTE1_MTE2` | MTE1 完成 → 允许 MTE2 覆写 | L1 buffer 释放控制 |
|
|
42
|
+
| `MTE2_MTE1` | MTE2 完成 → 允许 MTE1 读取 | L1 数据就绪通知 |
|
|
43
|
+
| `M_MTE1` | CUBE 完成 → 允许 MTE1 覆写 | L0 buffer 释放控制 |
|
|
44
|
+
| `MTE1_M` | MTE1 完成 → 允许 CUBE 计算 | L0 数据就绪通知 |
|
|
45
|
+
| `M_FIX` | CUBE 完成 → 允许 FIXP 输出 | L0C 数据就绪 |
|
|
46
|
+
| `FIX_M` | FIXP 完成 → 允许下一轮 CUBE | L0C buffer 释放 |
|
|
47
|
+
|
|
48
|
+
## 3. 关键参数配置
|
|
49
|
+
|
|
50
|
+
```cpp
|
|
51
|
+
constexpr uint32_t BASE_M = 256; // L0 tile M 维度
|
|
52
|
+
constexpr uint32_t BASE_N = 256; // L0 tile N 维度
|
|
53
|
+
constexpr uint32_t BASE_K = 256; // L0 tile K 维度
|
|
54
|
+
constexpr uint32_t PINGPONG_NUM = 2; // L1 双缓冲数量
|
|
55
|
+
constexpr uint32_t L1_BUFFER_NUM = 3; // L1 中 K 维度展开倍数
|
|
56
|
+
|
|
57
|
+
// L1 参数
|
|
58
|
+
params.l1Params.kL1 = BASE_K * L1_BUFFER_NUM; // L1 中单个 buffer 的 K 大小 = 768
|
|
59
|
+
params.l1Params.scaleKL1 = BASE_K * L1_BUFFER_NUM; // Scale 的 K 大小
|
|
60
|
+
params.l1Params.l1BufNum = PINGPONG_NUM; // pingpong 数量 = 2
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 3.1 L1 内存布局
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
L1 地址空间:
|
|
67
|
+
[A_ping][A_pong][B_ping][B_pong][scaleA_ping][scaleA_pong][scaleB_ping][scaleB_pong]
|
|
68
|
+
|
|
69
|
+
偏移计算:
|
|
70
|
+
l1BufferAOffset_[0] = 0 // A_ping
|
|
71
|
+
l1BufferAOffset_[1] = aL1OneBuffer_ // A_pong
|
|
72
|
+
l1BufferBOffset_[0] = aL1OneBuffer_ * 2 // B_ping
|
|
73
|
+
l1BufferBOffset_[1] = aL1OneBuffer_ * 2 + bL1OneBuffer_ // B_pong
|
|
74
|
+
scaleBase = aL1OneBuffer_ * 2 + bL1OneBuffer_ * 2 // Scale 区起始
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 3.2 L0 Pingpong 索引
|
|
78
|
+
|
|
79
|
+
```cpp
|
|
80
|
+
uint64_t l0Offset = HALF_L0_SIZE * (l0PingPong_ & 0x1); // 交替使用 L0 两半
|
|
81
|
+
l0PingPong_++; // 每次 L0 迭代后切换
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 4. 核心计算循环
|
|
85
|
+
|
|
86
|
+
### 4.1 外层循环(K 维度 L1 级别)
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
for iter0 = 0 to kL1Iter_: // K 维度按 kL1 切分
|
|
90
|
+
l1BufId = abL1LoopCnt_ & 1 // L1 pingpong 索引
|
|
91
|
+
|
|
92
|
+
// 1) Scale 搬运 (按 scaleKL1/kL1 频率刷新)
|
|
93
|
+
if iter0 % (scaleKL1/kL1) == 0:
|
|
94
|
+
WaitFlag<MTE1_MTE2>(SCALE_FLAG + scaleL1BufId)
|
|
95
|
+
CopyScaleGM2L1(scaleA, scaleB)
|
|
96
|
+
|
|
97
|
+
// 2) A/B 数据搬运 GM → L1
|
|
98
|
+
WaitFlag<MTE1_MTE2>(l1BufId) // 等待上一轮 MTE1 用完该 buffer
|
|
99
|
+
CopyGM2L1(A → L1[l1BufId], B → L1[l1BufId])
|
|
100
|
+
SetFlag<MTE2_MTE1>(l1BufId) // 通知 MTE1 数据就绪
|
|
101
|
+
WaitFlag<MTE2_MTE1>(l1BufId)
|
|
102
|
+
|
|
103
|
+
// 3) 内层循环:L0 级别迭代
|
|
104
|
+
for iter1 = 0 to kL0Iter:
|
|
105
|
+
l0Offset = HALF_L0_SIZE * (l0PingPong_ & 1)
|
|
106
|
+
WaitFlag<M_MTE1>(l0PingPong_ & 1) // 等待 CUBE 用完 L0
|
|
107
|
+
|
|
108
|
+
CopyL12L0(A_L1 → L0A[l0Offset])
|
|
109
|
+
CopyL12L0(B_L1 → L0B[l0Offset])
|
|
110
|
+
CopyL12L0(scaleA_L1 → L0A_scale)
|
|
111
|
+
CopyL12L0(scaleB_L1 → L0B_scale)
|
|
112
|
+
|
|
113
|
+
SetFlag<MTE1_M>(l0PingPong_ & 1) // 通知 CUBE 数据就绪
|
|
114
|
+
WaitFlag<MTE1_M>(l0PingPong_ & 1)
|
|
115
|
+
|
|
116
|
+
MMAD(L0C, L0A, L0B) // CUBE 矩阵乘
|
|
117
|
+
|
|
118
|
+
SetFlag<M_MTE1>(l0PingPong_ & 1) // 通知 MTE1 可覆写 L0
|
|
119
|
+
l0PingPong_++
|
|
120
|
+
|
|
121
|
+
// 4) 释放 L1 buffer
|
|
122
|
+
SetFlag<MTE1_MTE2>(l1BufId)
|
|
123
|
+
abL1LoopCnt_++
|
|
124
|
+
|
|
125
|
+
// 5) 输出
|
|
126
|
+
SetFlag<M_FIX>(0); WaitFlag<M_FIX>(0)
|
|
127
|
+
CopyL0C2GM(gmC, tensorL0C) // FIXP 输出
|
|
128
|
+
SetFlag<FIX_M>(0); WaitFlag<FIX_M>(0)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 4.2 流水并行示意
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
时间线 →
|
|
135
|
+
─────────────────────────────────────────────────────
|
|
136
|
+
MTE2: [搬 A/B iter0 → L1_ping] [搬 A/B iter1 → L1_pong] [搬 iter2 → L1_ping] ...
|
|
137
|
+
MTE1: [搬 L1_ping → L0_half0] [搬 L1_ping → L0_half1] [搬 L1_pong → L0_half0] ...
|
|
138
|
+
CUBE: [计算 L0_half0] [计算 L0_half1] [计算 L0_half0] ...
|
|
139
|
+
FIXP: [输出] ...
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 5. 从 naive 到 pingpong 的关键修改点
|
|
143
|
+
|
|
144
|
+
| 修改项 | naive(优化前) | pingpong(优化后) |
|
|
145
|
+
|--------|---------------|-------------------|
|
|
146
|
+
| L1 buffer 数量 | `l1BufNum = 1` | `l1BufNum = PINGPONG_NUM = 2` |
|
|
147
|
+
| L1 内存布局 | 单份 A + B | A_ping + A_pong + B_ping + B_pong |
|
|
148
|
+
| L0 buffer 使用 | 固定偏移 0 | `HALF_L0_SIZE * (l0PingPong_ & 1)` 交替 |
|
|
149
|
+
| L1 buffer 选择 | 固定 0 | `abL1LoopCnt_ & (l1BufNum_ - 1)` |
|
|
150
|
+
| 事件初始化 | 无/简单 | 构造函数中 SetFlag 初始化所有 MTE1_MTE2/M_MTE1 事件 |
|
|
151
|
+
| GM→L1 同步 | 等待完成再继续 | `WaitFlag<MTE1_MTE2>` 等待旧 buffer 释放 |
|
|
152
|
+
| L1→L0 同步 | 等待完成再继续 | `WaitFlag<M_MTE1>` 等待 CUBE 用完 L0 |
|
|
153
|
+
| CUBE→MTE1 同步 | 无 | `SetFlag<M_MTE1>` 通知 MTE1 可覆写 |
|
|
154
|
+
| MTE2→MTE1 通知 | 无 | `SetFlag<MTE2_MTE1>` 通知 L1 数据就绪 |
|
|
155
|
+
| Scale buffer | 固定 | `scaleLoopCnt_ & 1` 双缓冲 |
|
|
156
|
+
|
|
157
|
+
## 6. 注意事项
|
|
158
|
+
|
|
159
|
+
1. **L1 大小约束**:`kL1 = BASE_K * L1_BUFFER_NUM` 决定了单次 L1 装载的 K 维度;`PINGPONG_NUM = 2` 则需要 2 倍 L1 空间存放 A 和 B
|
|
160
|
+
2. **事件 ID 管理**:`MTE1_MTE2_EVENT_ID_NUM` 定义了事件 ID 的数量上限(通常为 4),pingpong 使用 ID 0 和 1
|
|
161
|
+
3. **L0C Pingpong**:代码中 `enableL0cPingPong_ = false`,L0C 层级的 pingpong 在本版本中未启用
|
|
162
|
+
4. **精度验证**:优化后必须通过 `verify_result.py` 的精度校验
|
|
163
|
+
5. **kL1=768 (L1_BUFFER_NUM=3) 的选取原则:尽可能用满 L1 空间**。在 pingpong 双缓冲(`PINGPONG_NUM=2`)约束下,`L1_BUFFER_NUM` 应取满足 `2 × singleBufferSize ≤ l1_size` 的**最大整数值**,使每个 buffer 覆盖尽可能多的 K 范围以减少外层循环迭代次数和流水起停开销。以 `baseM=baseN=256, baseK=256` 为例:`L1_BUFFER_NUM=4` 时双 buffer 557,056 bytes 溢出;`L1_BUFFER_NUM=3` 时双 buffer 417,792 bytes ≤ 524,288 bytes(L1 利用率 80%),是合法最大值。理论建模生成器 `tiling_gen.py` 输出的 `stepK=2` 是 K 向分步的理论档位(受 depth 倍增搜索机制约束只能为 2 的幂),与本文档的 `L1_BUFFER_NUM=3` 是两个独立概念。**实施时应以本文档的 `L1_BUFFER_NUM=3` 为准**
|
|
164
|
+
|
|
165
|
+
## 7. 实施常见问题与解决方案
|
|
166
|
+
|
|
167
|
+
以下是从 0_naive 基线改造为 pingpong 版本时,实际遇到的典型问题:
|
|
168
|
+
|
|
169
|
+
### 问题 1:L1_BUFFER_NUM 取值过大导致 L1 内存溢出
|
|
170
|
+
|
|
171
|
+
**现象**:naive 版本使用 `L1_BUFFER_NUM = 4`(kL1 = 1024),引入双缓冲后若不调整,L1 总占用 = 2 × (A + B + ScaleA + ScaleB) 会超出 L1 容量(512KB),导致仿真报错或精度失败。
|
|
172
|
+
|
|
173
|
+
**原因**:pingpong 需要 2 倍 L1 空间。naive 的 `kL1 = BASE_K * 4 = 1024` 时单 buffer 占用已较大,乘以 2 后超出限制。
|
|
174
|
+
|
|
175
|
+
**解决方案**:将 `L1_BUFFER_NUM` 从 4 降为 3(或更小),使 `kL1 = BASE_K * 3 = 768`。需要满足:
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
总 L1 占用 = PINGPONG_NUM × (aL1OneBuffer + bL1OneBuffer + scaleAL1OneBuffer + scaleBL1OneBuffer) ≤ L1_SIZE (512KB)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
以 M=1024, N=2048, K=4096, baseM=baseN=256, kL1=768 为例:
|
|
182
|
+
- aL1OneBuffer = 256 × 768 / 2 = 98,304 bytes(FP4 半字节)
|
|
183
|
+
- bL1OneBuffer = 256 × 768 / 2 = 98,304 bytes
|
|
184
|
+
- scaleAL1OneBuffer = 256 × ⌈768/32⌉ = 256 × 24 = 6,144 bytes
|
|
185
|
+
- scaleBL1OneBuffer = 256 × 24 = 6,144 bytes
|
|
186
|
+
- 单 buffer 合计 = 208,896 bytes
|
|
187
|
+
- 双 buffer 合计 = 417,792 bytes ≤ 524,288 bytes ✅
|
|
188
|
+
|
|
189
|
+
若 `L1_BUFFER_NUM = 4`(kL1 = 1024):
|
|
190
|
+
- 单 buffer 合计 = 2 × (256 × 1024 / 2) + 2 × (256 × 32) = 278,528 bytes
|
|
191
|
+
- 双 buffer 合计 = 557,056 bytes > 524,288 bytes ❌ **溢出**
|
|
192
|
+
|
|
193
|
+
### 问题 2:L1Params 结构体需要扩展
|
|
194
|
+
|
|
195
|
+
**现象**:编译报错,`L1Params` 没有 `scaleKL1` 和 `l1BufNum` 成员。
|
|
196
|
+
|
|
197
|
+
**原因**:naive 版本的 `L1Params` 只有 `kL1` 一个字段,pingpong 版本需要额外传递 `scaleKL1`(Scale 的 K 覆盖范围)和 `l1BufNum`(buffer 数量)。
|
|
198
|
+
|
|
199
|
+
**解决方案**:在 `block_mmad_mx_base.h` 的 `L1Params` 结构体中新增字段:
|
|
200
|
+
|
|
201
|
+
```cpp
|
|
202
|
+
struct L1Params {
|
|
203
|
+
uint64_t kL1{0};
|
|
204
|
+
uint64_t scaleKL1{0}; // 新增
|
|
205
|
+
uint64_t l1BufNum{1}; // 新增,默认值 1 保持向后兼容
|
|
206
|
+
};
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 问题 3:MTE2_MTE1 事件同步仍然紧耦合(性能隐患)
|
|
210
|
+
|
|
211
|
+
**现象**:优化后 cycle 数下降了(42.4k → 30.2k),但未达到理论预期的 ~21k cycles。
|
|
212
|
+
|
|
213
|
+
**原因**:当前实现中第 194-195 行仍保留了 `SetFlag<MTE2_MTE1>` + `WaitFlag<MTE2_MTE1>` 紧耦合:
|
|
214
|
+
|
|
215
|
+
```cpp
|
|
216
|
+
AscendC::SetFlag<AscendC::HardEvent::MTE2_MTE1>(l1BufId);
|
|
217
|
+
AscendC::WaitFlag<AscendC::HardEvent::MTE2_MTE1>(l1BufId); // ← 紧跟 Wait,MTE2 搬完后仍需等待才能开始 MTE1
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
同样,内层循环中 `MTE1_M` 也是紧耦合(第 241-242 行):
|
|
221
|
+
|
|
222
|
+
```cpp
|
|
223
|
+
AscendC::SetFlag<AscendC::HardEvent::MTE1_M>(l0BufId);
|
|
224
|
+
AscendC::WaitFlag<AscendC::HardEvent::MTE1_M>(l0BufId); // ← 紧跟 Wait,MTE1 搬完后仍需等待才能开始 CUBE
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
这意味着虽然 L1/L0 地址已经做了 pingpong 分离,但 **事件同步层面仍是串行** — MTE2 与 MTE1 之间、MTE1 与 CUBE 之间并未真正实现异步流水。性能提升主要来自 kL1 从 1024 调整为 768 带来的循环结构变化,而非真正的流水并行。
|
|
228
|
+
|
|
229
|
+
**解决方案**:要实现真正的流水并行,需将 `WaitFlag` 移到实际消费数据的位置,而非紧跟在 `SetFlag` 后面。参考设计文档第 4.1 节伪代码中的同步模式:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
// 正确的流水同步模式:SetFlag 和 WaitFlag 分离
|
|
233
|
+
SetFlag<MTE2_MTE1>(l1BufId) // MTE2 搬完后立即通知
|
|
234
|
+
// ... MTE2 可以继续搬下一轮到另一个 buffer ...
|
|
235
|
+
WaitFlag<MTE2_MTE1>(l1BufId) // 在内层循环入口处才等待(此时 MTE2 可能已搬完下一轮)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 问题 4:CMakeLists.txt 需要指向新的源码目录
|
|
239
|
+
|
|
240
|
+
**现象**:修改了 `src_optimized/` 下的代码,但编译仍使用 `src/` 目录的旧代码。
|
|
241
|
+
|
|
242
|
+
**原因**:`CMakeLists.txt` 中 `add_executable` 的源码路径指向 `src/`。
|
|
243
|
+
|
|
244
|
+
**解决方案**:修改 `CMakeLists.txt` 中的源码路径,将 `src/` 改为 `src_optimized/`,包括 `target_include_directories` 中的 include 路径。编译验证通过后,可通过切换路径来对比基线和优化版本。
|
|
245
|
+
|
|
246
|
+
### 问题总结
|
|
247
|
+
|
|
248
|
+
| # | 问题 | 根因 | 解决方案 | 影响 |
|
|
249
|
+
|---|------|------|---------|------|
|
|
250
|
+
| 1 | L1 内存溢出 | kL1 × 2 > L1_SIZE | 降低 L1_BUFFER_NUM(4→3) | 编译/仿真失败 |
|
|
251
|
+
| 2 | L1Params 缺少字段 | naive 版本结构体不完整 | 新增 scaleKL1、l1BufNum | 编译失败 |
|
|
252
|
+
| 3 | HALF_L0_SIZE 未定义 | naive 不需要 L0 半区 | 定义 `L0A_SIZE / 2` | 编译失败 |
|
|
253
|
+
| 4 | 事件同步紧耦合 | SetFlag+WaitFlag 紧挨 | 分离 SetFlag 和 WaitFlag | 性能未达理论预期 |
|
|
254
|
+
| 5 | CMakeLists 路径 | 源码目录未切换 | 修改 include/src 路径 | 编译用旧代码 |
|