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,91 @@
|
|
|
1
|
+
# SIMT 族指南(guide)——线程级算子编程范式与调优
|
|
2
|
+
|
|
3
|
+
> **来源(蒸馏)**:Ascend C SIMT 最佳实践(13 篇参考文档的
|
|
4
|
+
> 范式提炼)——此前本族 guide 仅 4 行骨架。SIMT 基础概念(核函数/线程架构/
|
|
5
|
+
> 内存层级)查 `ascendc-docs-search`,本文聚焦编程范式与调优要点。
|
|
6
|
+
|
|
7
|
+
## 族定位
|
|
8
|
+
|
|
9
|
+
条件分支、离散索引、gather-scatter、MoE routing 等不规则操作——SIMD 向量
|
|
10
|
+
路径的分支/离散访存代价过高时选 SIMT(DAV_3510,每 AIV 4 个 warp scheduler)。
|
|
11
|
+
|
|
12
|
+
**SIMT vs SIMD 选型速查**:
|
|
13
|
+
|
|
14
|
+
| 维度 | SIMT | SIMD |
|
|
15
|
+
|------|------|------|
|
|
16
|
+
| 编程模型 | 多线程并行,每线程独立执行 | 单核向量指令,整块数据并行 |
|
|
17
|
+
| 分支/离散索引 | 原生支持 | 代数化替代(Compare/Select/Gather)代价高 |
|
|
18
|
+
| 数据布局 | 逐元素寻址自由 | 连续对齐高效 |
|
|
19
|
+
| IPC 特征 | Simt_*IPC 可观测 | SIMD_ExecIPC(双发上限 2.0) |
|
|
20
|
+
|
|
21
|
+
## 核心编程范式(三件套)
|
|
22
|
+
|
|
23
|
+
### 1. VF 声明 + 调用
|
|
24
|
+
|
|
25
|
+
```cpp
|
|
26
|
+
// 声明(__simt_vf__ 标记 + LAUNCH_BOUND 寄存器预算)
|
|
27
|
+
template <typename T>
|
|
28
|
+
__simt_vf__ __aicore__ LAUNCH_BOUND(512) inline void OpSimt(
|
|
29
|
+
uint64_t count, __gm__ T* x, __gm__ T* y);
|
|
30
|
+
|
|
31
|
+
// 调用(Dim3 线程数必须是编译期常量;GM_ADDR 直接转换禁 GlobalTensor 中转)
|
|
32
|
+
AscendC::Simt::VF_CALL<OpSimt<T>>(AscendC::Simt::Dim3(512), count, (__gm__ T*)x, (__gm__ T*)y);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. 线程排布统一 for 循环
|
|
36
|
+
|
|
37
|
+
```cpp
|
|
38
|
+
for (uint64_t i = AscendC::Simt::GetBlockIdx() * AscendC::Simt::GetThreadNum()
|
|
39
|
+
+ AscendC::Simt::GetThreadIdx();
|
|
40
|
+
i < count;
|
|
41
|
+
i += AscendC::Simt::GetThreadNum() * AscendC::Simt::GetBlockNum()) {
|
|
42
|
+
// ...
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
初始 = 线程全局线性化位置;步进 = 全核全线程总数(每元素恰被一个线程处理)。
|
|
47
|
+
|
|
48
|
+
### 3. GM 直通 vs UB 中转
|
|
49
|
+
|
|
50
|
+
- 简单场景:VF 内直接 `__gm__` 指针读写(省一趟 UB);
|
|
51
|
+
- 跨线程共享数据:UB 中转(见下)。
|
|
52
|
+
|
|
53
|
+
## 核内共享内存(类 CUDA shared memory)
|
|
54
|
+
|
|
55
|
+
```cpp
|
|
56
|
+
TBuf<QuePosition::VECCALC> sharedBuf_;
|
|
57
|
+
pipe_->InitBuffer(sharedBuf_, 2048); // kernel 侧申请
|
|
58
|
+
__ubuf__ uint32_t* p = (__ubuf__ uint32_t*)sharedBuf_.Get<uint32_t>().GetPhyAddr();
|
|
59
|
+
Simt::VF_CALL<OpSimt<T>>(Simt::Dim3(N), ..., p); // 传入 VF
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- 同地址并发写必须原子操作(`asc_atomic_add` 等);
|
|
63
|
+
- buffer 大小 tiling 侧 `SetLocalMemorySize` 预留。
|
|
64
|
+
|
|
65
|
+
## 多核同步
|
|
66
|
+
|
|
67
|
+
- 跨核数据交换用 workspace(tiling `SetWorkspaceSize`)+ kernel 侧 `SyncAll()`
|
|
68
|
+
+ tiling `context->SetScheduleMode(1)`(同步模式)——三者缺一不可;
|
|
69
|
+
- **同 kernel 多个 VF_CALL 之间只保证 block 内串行,不保证全核同步**——
|
|
70
|
+
需要全核同步的位置显式 `SyncAll()`。
|
|
71
|
+
|
|
72
|
+
## 判定规则映射(verdict 命中 → 本族调优)
|
|
73
|
+
|
|
74
|
+
| verdict 命中 | SIMT 场景解读 | 处置 |
|
|
75
|
+
|-------------|--------------|------|
|
|
76
|
+
| L1_SCALAR_BOUND | 线程内分支/地址计算过重 | 循环不变量外提;索引计算 API 化 |
|
|
77
|
+
| L1_VEC_BOUND(AIVx_SIMT 主导) | warp 占用不足 | 增大 Dim3 线程数;LAUNCH_BOUND 重估 |
|
|
78
|
+
| L0_STALL_DOMINANT | warp stall(需 PcSampling/trace_bubble) | 按 stall 类别处置(加载/分支/同步) |
|
|
79
|
+
| 串行指纹 | VF_CALL 间无重叠 | 多 VF 拆分改单 VF 内循环 |
|
|
80
|
+
|
|
81
|
+
## 深度参考(参考实现,13 篇)
|
|
82
|
+
|
|
83
|
+
vf-declaration / vf-call / thread-stride-pattern / index-calculation /
|
|
84
|
+
data-transfer / compute-operators / multi-core-sync / intra-core-shared /
|
|
85
|
+
tensorlist-handling / 宏 API / 调测接口 / 编译与运行 / overview——API 分类
|
|
86
|
+
索引与完整代码示例在该 skill(本 guide 为其范式浓缩 + 本仓 verdict 映射)。
|
|
87
|
+
|
|
88
|
+
## 模板状态(如实标注)
|
|
89
|
+
|
|
90
|
+
本族无可拷贝模板(模板数 0)——按本文三件套范式 + 上表调优路由实施;
|
|
91
|
+
SIMT API 用法以 asc-devkit `SIMT-API/` 文档为准。
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# SIMT 算子性能优化指南
|
|
2
|
+
|
|
3
|
+
## 优化规则库
|
|
4
|
+
|
|
5
|
+
### Rule 001: SIMT VF 内部避免 if-else 分支
|
|
6
|
+
|
|
7
|
+
- **分类**: 分支优化
|
|
8
|
+
- **优先级**: 高
|
|
9
|
+
- **适用场景**: `__simt_vf__` 函数内部存在条件分支逻辑(if / else / switch),且分支条件可在编译期确定或通过模板参数消除
|
|
10
|
+
- **说明**: SIMT VF(Vector Function)是 SIMT 模式下的向量计算函数,所有线程按 SIMT 方式执行。if-else 分支会导致线程分化(thread divergence),同一 warp/wavefront 内的线程走不同路径,部分线程需要等待另一部分执行完毕,造成流水线气泡,降低有效利用率。通过模板参数将运行时分支提升到编译期,可以彻底消除分支,让所有线程执行统一路径。
|
|
11
|
+
|
|
12
|
+
**反面示例**(不推荐):
|
|
13
|
+
|
|
14
|
+
```cpp
|
|
15
|
+
template <typename T>
|
|
16
|
+
__simt_vf__ __aicore__ LAUNCH_BOUND(1024)
|
|
17
|
+
inline void OpFooSimt(GM_ADDR x, GM_ADDR y, int32_t mode, int32_t totalLength) {
|
|
18
|
+
int32_t idx = Simt::GetBlockIdx() * Simt::GetThreadNum() + Simt::GetThreadIdx();
|
|
19
|
+
int32_t step = Simt::GetThreadNum() * Simt::GetBlockNum();
|
|
20
|
+
for (int32_t i = idx; i < totalLength; i += step) {
|
|
21
|
+
T val = x[i];
|
|
22
|
+
if (mode == 0) {
|
|
23
|
+
y[i] = val + static_cast<T>(1);
|
|
24
|
+
} else {
|
|
25
|
+
y[i] = val * static_cast<T>(2);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**正面示例**(推荐):
|
|
32
|
+
|
|
33
|
+
```cpp
|
|
34
|
+
// 通过模板参数消除运行时分支
|
|
35
|
+
template <typename T, int32_t Mode>
|
|
36
|
+
__simt_vf__ __aicore__ LAUNCH_BOUND(1024)
|
|
37
|
+
inline void OpFooSimt(GM_ADDR x, GM_ADDR y, int32_t totalLength) {
|
|
38
|
+
int32_t idx = Simt::GetBlockIdx() * Simt::GetThreadNum() + Simt::GetThreadIdx();
|
|
39
|
+
int32_t step = Simt::GetThreadNum() * Simt::GetBlockNum();
|
|
40
|
+
for (int32_t i = idx; i < totalLength; i += step) {
|
|
41
|
+
T val = x[i];
|
|
42
|
+
if constexpr (Mode == 0) {
|
|
43
|
+
y[i] = val + static_cast<T>(1);
|
|
44
|
+
} else {
|
|
45
|
+
y[i] = val * static_cast<T>(2);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 调用处通过模板参数分发
|
|
51
|
+
template <typename T>
|
|
52
|
+
__aicore__ inline void Process(GM_ADDR x, GM_ADDR y, int32_t mode, int32_t totalLength) {
|
|
53
|
+
if (mode == 0) {
|
|
54
|
+
AscendC::Simt::VF_CALL<OpFooSimt<T, 0>>(x, y, totalLength);
|
|
55
|
+
} else {
|
|
56
|
+
AscendC::Simt::VF_CALL<OpFooSimt<T, 1>>(x, y, totalLength);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 线程数选择策略
|
|
64
|
+
|
|
65
|
+
### 按算子类型选择
|
|
66
|
+
|
|
67
|
+
| 算子类型 | 建议线程数 | 原因 |
|
|
68
|
+
|---------|-----------|------|
|
|
69
|
+
| 搬运类算子 | 2048 / 1024 | 内存带宽受限,更多线程隐藏延迟 |
|
|
70
|
+
| 计算类算子 | 512 / 1024 | 寄存器压力大,需平衡并行度 |
|
|
71
|
+
|
|
72
|
+
### 按寄存器压力选择
|
|
73
|
+
|
|
74
|
+
寄存器压力随 VF 复杂度增加而增大,32 位索引可开更多线程:
|
|
75
|
+
|
|
76
|
+
| VF 复杂度 | uint32_t 线程数 | uint64_t 线程数 | 寄存器压力说明 |
|
|
77
|
+
|-----------|----------------|----------------|-------------|
|
|
78
|
+
| NONE / 1D | 1024 | 512 | 极低:仅循环变量 + shape |
|
|
79
|
+
| 2D | 1024 | 512 | 中低:1 级 UintDiv + 有限坐标变量 |
|
|
80
|
+
| 3D | 1024 | 512 | 中等:2 级 UintDiv + 更多坐标变量 |
|
|
81
|
+
| 4D | 1024 | 512 | 较高:3 级 UintDiv + 4 组坐标/偏移 |
|
|
82
|
+
| ND (5~8D) | 256 | 128 | 最高:运行时循环 + 可变维度 |
|
|
83
|
+
|
|
84
|
+
### 寄存器与线程数关系
|
|
85
|
+
|
|
86
|
+
| 线程数范围 | 每线程可用寄存器数 |
|
|
87
|
+
|-----------|-----------------|
|
|
88
|
+
| 1025~2048 | 16 |
|
|
89
|
+
| 513~1024 | 32 |
|
|
90
|
+
| 257~512 | 64 |
|
|
91
|
+
| 1~256 | 127 |
|
|
92
|
+
|
|
93
|
+
### 调优步骤
|
|
94
|
+
|
|
95
|
+
1. 初始值:uint32_t = 1024,uint64_t = 256(保守起点)
|
|
96
|
+
2. 编译验证:逐步提高 uint64_t 线程数(256->512),若编译通过说明寄存器充足
|
|
97
|
+
3. 性能验证:通过仿真或 NPU 实测确认无 register spill 导致的性能回退
|
|
98
|
+
4. 最终定值:取编译通过 + 性能不退化的最大值
|
|
99
|
+
|
|
100
|
+
### LAUNCH_BOUND 模板化
|
|
101
|
+
|
|
102
|
+
对于已通过 `IDX_T` 模板参数支持 32/64 位索引的 VF,LAUNCH_BOUND 也应按位宽模板化:
|
|
103
|
+
|
|
104
|
+
```cpp
|
|
105
|
+
template <typename IDX_T>
|
|
106
|
+
static constexpr uint32_t THREADS = (sizeof(IDX_T) == 4) ? 1024 : 512;
|
|
107
|
+
|
|
108
|
+
template <typename T, typename IDX_T>
|
|
109
|
+
__simt_vf__ __aicore__ LAUNCH_BOUND(THREADS<IDX_T>) inline void OpSimt(...);
|
|
110
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Sort 族指南(guide)——TopK/Sort/ArgSort M-way 归并排序
|
|
2
|
+
|
|
3
|
+
> **来源(蒸馏)**:Ascend C Tiling 设计方法论·sort 分册 +
|
|
4
|
+
> `ascendc-perf-optimize/references/tiling/sort/fallback/`(tiling-flow /
|
|
5
|
+
> tiling-fields / sort_tiling.py 参考实现)——此前本族 guide 仅 4 行骨架
|
|
6
|
+
>(radix_sort.md 为另一实现路线的实质文档)。
|
|
7
|
+
|
|
8
|
+
## 族定位
|
|
9
|
+
|
|
10
|
+
Top-K 排序算子的主流实现是 **M-way 归并排序**(`MrgSort` API,M 通常 = 4):
|
|
11
|
+
Divide(按 UB 容量切 tile)→ 各核并行排序 → 多轮归并(Conquer)。
|
|
12
|
+
radix_sort 路线(见 [radix_sort.md](radix_sort.md))适用于整数键/特定位宽场景。
|
|
13
|
+
|
|
14
|
+
## 核心约束:UB 每元素占用
|
|
15
|
+
|
|
16
|
+
Sort API 要求 float 输入 + proposal(value+index 8B)输出,单元素 UB 占用:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
sortBytesPerElem = sizeof(dtype) + sizeof(float) + sizeof(uint32_t)
|
|
20
|
+
+ PROPOSAL_SIZE(8) + concatTmpPerElem + sortTmpPerElem
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- fp32 输入可省 Cast buffer(≈32B/元素);fp16/bf16 需 Cast(≈34B/元素);
|
|
24
|
+
- **concatTmp / sortTmp 必须从 API 获取**(`GetConcatTmpSize` /
|
|
25
|
+
`GetSortTmpSize`),禁手动估算(平台相关);
|
|
26
|
+
- tileSize 上界:`ubSize / sortBytesPerElem`,对齐 32(`TOPK_SORT_NUM`);
|
|
27
|
+
工程实践通常取 **4096**(实测性能最优值,留 UB 余量给对齐填充与 API 峰值)。
|
|
28
|
+
|
|
29
|
+
## 三 Pattern 路由(决策树)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
tileSize = min(ubSize / sortBytesPerElem, 4096),对齐 32
|
|
33
|
+
|
|
34
|
+
N ≤ tileSize → Pattern A:单核排序(GM→UB→Sort→GM)
|
|
35
|
+
tileSize < N ≤ tileSize×coreNum → Pattern B:多核一级归并(各核 ≤1 tile,
|
|
36
|
+
排序后直接跨核归并)
|
|
37
|
+
N > tileSize×coreNum → Pattern C:多核两级归并(每核 >1 tile)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Pattern C 四阶段架构
|
|
41
|
+
|
|
42
|
+
| Phase | 职责 | 核参与 | 数据流 |
|
|
43
|
+
|-------|------|:----:|--------|
|
|
44
|
+
| 1 | 各核并行 tile 排序 | 全核 | GM→UB→Cast+ArithProgression+Concat→Sort→workspace |
|
|
45
|
+
| 2 | 核内多 tile 归并 | 全核(**无同步**) | workspace→UB→MrgSort→workspace |
|
|
46
|
+
| 3 | 跨核归并(路数→≤M) | 递减 | workspace→UB→MrgSort→workspace(每轮 SyncAll) |
|
|
47
|
+
| 4 | Core0 最终归并 + 输出 | 1 核 | workspace→UB→Extract 分离 value/index→GM |
|
|
48
|
+
|
|
49
|
+
**核内先归并的关键设计**:跨核归并每轮需 SyncAll 等所有核——若跳过 Phase 2
|
|
50
|
+
直接把 totalTiles 路跨核归并,轮次 = ceil(log_M(totalTiles)),每轮一次
|
|
51
|
+
SyncAll 不可接受。先核内归并把路数从 totalTiles 降到 coreNum。
|
|
52
|
+
|
|
53
|
+
## Tile 切分公式
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
totalTiles = CeilDiv(N, tileSize)
|
|
57
|
+
frontCoreTiles = CeilDiv(totalTiles, coreNum)
|
|
58
|
+
usedCore = CeilDiv(totalTiles, frontCoreTiles)
|
|
59
|
+
lastCoreTiles = totalTiles - (usedCore-1) × frontCoreTiles
|
|
60
|
+
lastTileSize = N - tileSize × (totalTiles-1)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 判定规则映射(verdict 命中 → 本族机制)
|
|
64
|
+
|
|
65
|
+
| verdict 命中 | Sort 场景解读 | 处置 |
|
|
66
|
+
|-------------|--------------|------|
|
|
67
|
+
| L1_VEC_BOUND | Sort/MrgSort 向量指令主导(Phase 1/2 热点) | 检查 tileSize(4096 最优);dtype Cast 是否可省 |
|
|
68
|
+
| L1_SCALAR_BOUND / 头开销 | tile 过小或核内归并循环过多 | 增大 tileSize;核对 Phase 2 归并轮次 |
|
|
69
|
+
| L2_CORE_TAIL / IMBALANCE | lastCoreTiles 与 frontCoreTiles 差距大 | 尾核 tile 再均分(tiling 字段见参考实现) |
|
|
70
|
+
| L2_UNDERUTILIZATION | totalTiles < coreNum | Pattern B/C 误选——回决策树核对 |
|
|
71
|
+
|
|
72
|
+
## 参考实现
|
|
73
|
+
|
|
74
|
+
Python 参考实现(Pattern A/B/C 路由 + 两级归并 + TilingData 字段):
|
|
75
|
+
Ascend C 性能优化实践·sort tiling 参考脚本
|
|
76
|
+
(433 行,字段语义见同目录 tiling-fields.md)——移植进本仓 tiling_candidates.py
|
|
77
|
+
时按契约方式推导,不直接复制。
|
|
78
|
+
|
|
79
|
+
## 模板状态(如实标注)
|
|
80
|
+
|
|
81
|
+
本族无可拷贝 kernel 模板(模板数 0)——实施按本文决策树 + radix_sort.md
|
|
82
|
+
(radix 路线)推进;Sort/MrgSort/GetSortTmpSize 等 API 用法以 asc-devkit
|
|
83
|
+
文档为准。
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# 选择/基数排序类算子性能优化实践
|
|
2
|
+
|
|
3
|
+
本文档聚焦 Ascend C 选择 / 排序类算子(TopK、KthValue、Sort、ArgSort、Histogram 等)在大规模数据场景下的性能优化实现:算法层重构、流水线并行、指令级技巧、精度保障与跨核同步。
|
|
4
|
+
|
|
5
|
+
> **当前覆盖范围**:本文档基于 **A2 大规模数据** 实战验证;A3、A5 等架构的硬件细节差异需另行验证后再套用。覆盖算子族包括选择类(TopK / KthValue / Median / Quantile)、排序类(Sort / ArgSort / ArgMax / Min)、分桶统计类(Histogram / BinCount / Unique)、过滤输出类(Where / NonZero / MaskedSelect)。
|
|
6
|
+
|
|
7
|
+
> **共性特征**:数据量远大于 UB(需多遍扫描)、输出稀疏(合格元素 << 全部元素)、跨核同步开销显著。
|
|
8
|
+
|
|
9
|
+
> **瓶颈定位**:profiling、指标解读、msprof 协议等不在本文档范围内,参见独立 profiling skill。本文档假设读者已经识别出瓶颈类型,从这里选择对应实现。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. 算法层面优化(收益最大)
|
|
14
|
+
|
|
15
|
+
### 1.1 向量化二分搜索替代多级直方图
|
|
16
|
+
|
|
17
|
+
**适用场景**:在大数据中定位"第 K 大"阈值(TopK、KthValue、Median、Quantile)。
|
|
18
|
+
|
|
19
|
+
**传统方案**:多级直方图(radix sort 思想),每级统计 bin counts,逐级缩小范围。低位级别元素匹配率低(<2%),向量化效率极差,退化为标量扫描。
|
|
20
|
+
|
|
21
|
+
**优化方案**:在值域上做二分搜索。每步 1 次全量向量化扫描 + 1 次 Compare + 1 次 ReduceSum + 1 次全局同步。
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
lo = 值域下界, hi = 值域上界
|
|
25
|
+
for step = 0 to bit_width - 1:
|
|
26
|
+
mid = (lo + hi) / 2
|
|
27
|
+
globalCount = Σ CountGE(mid) // 全核向量化
|
|
28
|
+
if globalCount ≥ K: lo = mid
|
|
29
|
+
else: hi = mid
|
|
30
|
+
threshold = lo
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**收益**:消除低位标量扫描瓶颈(实测 -9.4ms,-46%)。
|
|
34
|
+
|
|
35
|
+
**代价**:bit_width 次全量数据扫描(DMA 带宽)。适用于 DMA 带宽有余量(MTE2 占比偏低)的场景。
|
|
36
|
+
|
|
37
|
+
**推广**:
|
|
38
|
+
- **Quantile**:二分搜索找 count = N × q 的阈值
|
|
39
|
+
- **Median**:K = N/2 的 TopK
|
|
40
|
+
- **KthValue**:K 为参数的 TopK
|
|
41
|
+
- **Histogram 均衡化**:二分搜索找各百分位
|
|
42
|
+
|
|
43
|
+
### 1.2 分桶粒度 × 级数权衡
|
|
44
|
+
|
|
45
|
+
**原理**:对于 B-bit 值域,分成 L 级,每级 b_i bits(Σb_i = B)。
|
|
46
|
+
|
|
47
|
+
| 方案 | 每级 bins | 向量比较/subchunk | 级数 | 数据扫描次数 |
|
|
48
|
+
|------|----------|------------------|------|------------|
|
|
49
|
+
| 8+8 | 256 | 256 × EQ | 2 | 2 |
|
|
50
|
+
| 4+4+4+4 | 16 | 16 × EQ | 4 | 4(后两级可标量) |
|
|
51
|
+
| 3+3+5+5 | 8/32 | 8 × GE + 8 × EQ | 2 vector + 2 scalar | 2 vector + 1 scalar |
|
|
52
|
+
| **16 × 1-bit** | **2** | **1 × GE** | **16** | **16**(全向量化) |
|
|
53
|
+
|
|
54
|
+
**选择原则**:
|
|
55
|
+
- 标量主导:增加二分步数,减少标量路径(→ 向量化二分搜索)
|
|
56
|
+
- 向量主导:减少每级 bins 数(3+3 而非 4+4)
|
|
57
|
+
- DMA 主导:减少扫描次数(8+8 两级 vs 16 步二分)
|
|
58
|
+
|
|
59
|
+
### 1.3 保序域变换一次性完成
|
|
60
|
+
|
|
61
|
+
**适用场景**:浮点数据需要整数可比较格式(BF16/FP16/FP32 → sortable uint)。
|
|
62
|
+
|
|
63
|
+
**优化**:全量数据一次性转换并写回 GM,后续 N 次扫描直接加载,跳过重复转换。
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Pass 0: for each chunk: DMA(GM→UB) → Transform(UB) → DMA(UB→GM)
|
|
67
|
+
后续 N 次 CountGE: for each chunk: DMA(GM→UB) → Compare(UB) // 无 Transform
|
|
68
|
+
结束前: for each chunk: DMA(GM→UB) → InverseTransform(UB) → DMA(UB→GM) // 恢复原始
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**收益**:N 次 Transform → 1 次。当 N ≥ 3 时有净收益。
|
|
72
|
+
|
|
73
|
+
**注意**:
|
|
74
|
+
- 原地修改输入 tensor → kernel 结束前必须用逆变换恢复
|
|
75
|
+
- 逆变换不一定 = 正变换(如 Adds 饱和导致 VtS ≠ SortToRaw)
|
|
76
|
+
- 额外 2 遍 DMA 读写(~0.7ms × 2)
|
|
77
|
+
|
|
78
|
+
### 1.4 预计算与复用
|
|
79
|
+
|
|
80
|
+
| 技巧 | 说明 |
|
|
81
|
+
|------|------|
|
|
82
|
+
| **per-core bin counts 缓存** | P1L1 的 localCoarseBins_ 在 P1L2/P2 中复用,避免重复统计 |
|
|
83
|
+
| **32×32 table 一次填充** | P2L1 标量扫描同时填充 32×32 lookup table,P2L2 零成本查表 |
|
|
84
|
+
| **rawThresh 预计算** | equal 元素的 value 固定(= rawThreshold),预计算一次供所有 core |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 2. 流水线并行优化
|
|
89
|
+
|
|
90
|
+
### 2.1 TQue Double Buffer(MTE2 || Vector)
|
|
91
|
+
|
|
92
|
+
**适用条件**:MTE2 占比偏高且 Vector 有足够计算量。
|
|
93
|
+
|
|
94
|
+
**ARCH 关键限制(A2)**:
|
|
95
|
+
- **TBuf 模型**:`PipeBarrier<PIPE_ALL>` 全停,无法实现 MTE2/Vector overlap
|
|
96
|
+
- **TQue 模型**:`AllocTensor/EnQue/DeQue/FreeTensor` 自动同步,支持真正的流水线并行
|
|
97
|
+
|
|
98
|
+
```cpp
|
|
99
|
+
TQue<QuePosition::VECIN, 1> dataQue_; // depth=1 (standard)
|
|
100
|
+
pipe.InitBuffer(dataQue_, 2, tileBytes); // num=2 enables Double Buffer
|
|
101
|
+
|
|
102
|
+
// CopyIn: AllocTensor → DataCopy → EnQue (MTE2 管道)
|
|
103
|
+
// Compute: DeQue → VectorOps → FreeTensor (Vector 管道)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**标准模式**:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
for i = 0..N-1:
|
|
110
|
+
CopyIn(i) // MTE2: AllocTensor → DataCopy → EnQue
|
|
111
|
+
Compute(i) // Vector: DeQue → VectorOps → FreeTensor
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**关键注意**:
|
|
115
|
+
- `AllocTensor` 在 queue 满时**阻塞**等待 `FreeTensor`
|
|
116
|
+
- 不能预先 Alloc 所有 chunk(死锁!)
|
|
117
|
+
- UB 预算:需要 2× 数据 buffer
|
|
118
|
+
- TBuf 手动 double buffer(两个 TBuf + PipeBarrier 切换)在 A2 上**不工作**
|
|
119
|
+
|
|
120
|
+
### 2.2 DMA 后置发射(单 buffer overlap)
|
|
121
|
+
|
|
122
|
+
**适用场景**:Vector 处理完当前 chunk 的数据后,数据 buffer 空闲,可立即发起下一 chunk 的 DMA。
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
GenGEMask(dataBuf_, ...) // Vector: 读 dataBuf_, 写 temp1Buf_
|
|
126
|
+
PipeBarrier<PIPE_V>() // 等 Vector 完成 → dataBuf_ 空闲
|
|
127
|
+
DataCopy(dataBuf_, xGm_[next]) // MTE2: 写 dataBuf_ (与下面的 SumMask 并行)
|
|
128
|
+
SumMask() // Vector+Scalar: 读 temp1Buf_ (不读 dataBuf_!)
|
|
129
|
+
PipeBarrier<PIPE_ALL>() // 等 MTE2 完成
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**前提**:后续处理(SumMask)不读 dataBuf_,只读 temp1Buf_。
|
|
133
|
+
|
|
134
|
+
**收益**:比 TQue 小(仅掩盖 SumMask 阶段的 DMA),但不需要额外 buffer。
|
|
135
|
+
|
|
136
|
+
### 2.3 Barrier 并行
|
|
137
|
+
|
|
138
|
+
在 FullBarrier(GM 轮询)期间,其他管道空闲。可在 barrier 前发起 DMA prefetch:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
DmaWrite(localCount)
|
|
142
|
+
DataCopy(dataBuf_, xGm_[nextStep_chunk0]) // prefetch for next binary search step
|
|
143
|
+
FullBarrier() // ~200μs GM 轮询,DMA 同时完成
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 3. 指令级优化
|
|
149
|
+
|
|
150
|
+
### 3.1 向量化直方图技巧
|
|
151
|
+
|
|
152
|
+
| 技巧 | 说明 | 收益 |
|
|
153
|
+
|------|------|------|
|
|
154
|
+
| **累计 GE 替代 EQ** | `CompareScalar(GE, b)` 得到 `count ≥ b`,差分推导 bin count。bin[0] = total - cum[1],省 1 次比较 | -1/N 比较 |
|
|
155
|
+
| **2-bin batch ReduceSum** | 两个 bin 共享一个 PipeBarrier:sel+reduce → alt+reduce → barrier → read both | -50% barrier |
|
|
156
|
+
| **mask → half 计数** | `And(mask, 0x3C00)` 将 0xFFFF→half(1.0),省去 Select+Duplicate | -2 指令/subchunk |
|
|
157
|
+
| **合理 subchunk 大小** | half ReduceSum 精确到 2048;float ReduceSum 精确到 2^24 | 精度保障 |
|
|
158
|
+
|
|
159
|
+
### 3.2 标量快速跳过
|
|
160
|
+
|
|
161
|
+
**适用场景**:稀疏条件过滤(合格率 < 5%)。
|
|
162
|
+
|
|
163
|
+
**16 元素 OR 跳过**:
|
|
164
|
+
|
|
165
|
+
```cpp
|
|
166
|
+
uint32_t w0..w7 = mask32.GetValue(hj..hj+7); // 8 个 uint32 = 16 个 uint16 mask
|
|
167
|
+
if ((w0|w1|w2|w3|w4|w5|w6|w7) == 0) continue; // 全不合格 → 跳 16 个元素
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**XOR 快速匹配**:
|
|
171
|
+
|
|
172
|
+
```cpp
|
|
173
|
+
uint32_t x = (word ^ magic) & highBitMask; // 高 bits 不匹配 → x 非零
|
|
174
|
+
if ((x0 & x1 & x2 & x3) == mask) continue; // 4×uint32 (8 元素) 全不匹配
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**适用于**:TopK 输出(~0.5% 合格率)、NonZero、MaskedSelect。
|
|
178
|
+
|
|
179
|
+
### 3.3 标量 GM 操作流水线
|
|
180
|
+
|
|
181
|
+
**非阻塞 GM 读**:`xGm_.GetValue(idx)` 发出后 scalar 立即继续,延迟被后续指令隐藏。
|
|
182
|
+
|
|
183
|
+
**阻塞 GM 写**:`valGm_.SetValue(pos, val)` 等待写完成才继续。
|
|
184
|
+
|
|
185
|
+
**流水线效果**:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
element i: [GetValue_i]─────────[SetVal_i][SetIdx_i]
|
|
189
|
+
element i+1: [GetValue_{i+1}]──────────[SetVal_{i+1}][SetIdx_{i+1}]
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**推论**:
|
|
193
|
+
- 不要用同步 scalar 计算替代非阻塞 GM 读(破坏流水线 → 变慢)
|
|
194
|
+
- 减少 value 输出不一定更快(流水线空洞 → 更慢)
|
|
195
|
+
- 增加无关 GM 读可以填充流水线空隙(免费延迟隐藏)
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 4. 精度保障
|
|
200
|
+
|
|
201
|
+
### 4.1 浮点→整数保序变换
|
|
202
|
+
|
|
203
|
+
| 数据类型 | 变换规则 | 向量实现 |
|
|
204
|
+
|---------|---------|---------|
|
|
205
|
+
| **BF16** | 正:XOR 0x8000,负:NOT | 7 ops: ShiftRight+Not+Adds+And+Not+And+Or |
|
|
206
|
+
| **FP16** | 正:XOR 0x8000,负:NOT | 同 BF16(format 相同 trick) |
|
|
207
|
+
| **FP32** | 正:XOR 0x80000000,负:NOT(all 32 bits) | 需要 int32 向量操作 |
|
|
208
|
+
|
|
209
|
+
**逆变换**(SortToRaw):
|
|
210
|
+
- 高半区(bit_sign=1 → 原正数):清除符号位
|
|
211
|
+
- 低半区(bit_sign=0 → 原负数):NOT
|
|
212
|
+
|
|
213
|
+
**注意**:正变换 ≠ 逆变换(因为 Adds 饱和),必须分开实现。
|
|
214
|
+
|
|
215
|
+
### 4.2 A2 Adds(int16) 饱和问题
|
|
216
|
+
|
|
217
|
+
`Adds(data, scalar)` 在溢出时**饱和到 ±32767/−32768**,不回绕。
|
|
218
|
+
|
|
219
|
+
**影响**:`Adds(sortable, -threshold)` 当 sortable 和 threshold 分属 0x8000 两侧时,结果符号位错误。
|
|
220
|
+
|
|
221
|
+
**修正模板**:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
if threshold == 0x8000:
|
|
225
|
+
mask = ShiftRight(data, 15) // 特判:直接用符号位
|
|
226
|
+
elif threshold >= 0x8000:
|
|
227
|
+
mask = Adds+ShiftRight+Not // 同半区正确
|
|
228
|
+
And(mask, ShiftRight(data, 15)) // 低半区 → 不合格
|
|
229
|
+
else:
|
|
230
|
+
mask = Adds+ShiftRight+Not
|
|
231
|
+
Or(mask, ShiftRight(data, 15)) // 高半区 → 合格
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 4.3 half ReduceSum 精度限制
|
|
235
|
+
|
|
236
|
+
half 尾数 10 bits → 精确整数范围 [0, 2048]。
|
|
237
|
+
|
|
238
|
+
**规则**:`HIST_SUBCHUNK ≤ 2048`,保证每次 ReduceSum 结果 ≤ 2048。
|
|
239
|
+
|
|
240
|
+
**替代**:float32 ReduceSum 精确到 2^24(16M),但 UB 占用翻倍。
|
|
241
|
+
|
|
242
|
+
### 4.4 DMA padding 陷阱
|
|
243
|
+
|
|
244
|
+
DMA 要求 32-byte 对齐。最后一个 chunk 不足对齐长度时,padding 区域含残留数据。
|
|
245
|
+
|
|
246
|
+
**修正**:Host tiling `ALIGN = HIST_SUBCHUNK`,确保 `elemsPerCore` 是 subchunk 的整数倍。
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 5. 跨核同步(A2 无硬件 barrier)
|
|
251
|
+
|
|
252
|
+
```cpp
|
|
253
|
+
// FullBarrier: 所有 core → core 0
|
|
254
|
+
每个 core: 写 cookie 到 GM flags[step][bid]
|
|
255
|
+
Core 0: for each core: while (GM[step][c] != cookie) { DMA read + poll }
|
|
256
|
+
|
|
257
|
+
// BroadcastBarrier: core 0 → 所有 core
|
|
258
|
+
Core 0: 写 cookie 到 GM flags[step][C]
|
|
259
|
+
其他 core: while (GM[step][C] != cookie) { DMA read + poll }
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**优化**:
|
|
263
|
+
- 减少 barrier 次数(二分搜索 16 步 vs 多级直方图 4-6 步)
|
|
264
|
+
- 每步 barrier 只传 1 个 count(vs 256-bin 直方图)
|
|
265
|
+
- Workspace layout 复用(sHist_ 每步覆盖写)
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 6. 瓶颈类型 → 实现选择速查
|
|
270
|
+
|
|
271
|
+
> 假设瓶颈类型已通过 profiling skill 确定,下表给出每类瓶颈对应的实现策略与本文档锚点。
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
瓶颈类型
|
|
275
|
+
│
|
|
276
|
+
├─ Scalar 主导
|
|
277
|
+
│ ├─ 标量直方图/扫描 → 向量化二分搜索 (§1.1)
|
|
278
|
+
│ ├─ 标量输出 → 无法优化(硬件限制),保持 GM SetValue
|
|
279
|
+
│ └─ 标量 barrier → 减少同步次数 (§5)
|
|
280
|
+
│
|
|
281
|
+
├─ Vector 主导
|
|
282
|
+
│ ├─ CompareScalar 过多 → 减少 bins / level (§1.2)
|
|
283
|
+
│ ├─ 重复 Transform → 一次性转换 + 复用 (§1.3)
|
|
284
|
+
│ └─ 指令级 → cumGE、2-bin batch、mask trick (§3.1)
|
|
285
|
+
│
|
|
286
|
+
├─ DMA/MTE2 主导(且管道无重叠)
|
|
287
|
+
│ ├─ TQue Double Buffer (§2.1, 首选)
|
|
288
|
+
│ ├─ 减少扫描次数 (§1.2)
|
|
289
|
+
│ └─ DMA 后置发射 (§2.2)
|
|
290
|
+
│
|
|
291
|
+
└─ 各管道均衡 + 已显著重叠
|
|
292
|
+
→ 已接近硬件极限,考虑算法层重构或接受当前性能
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 6.1 A2 硬件特性速查
|
|
296
|
+
|
|
297
|
+
| 特性 | 行为 | 影响 |
|
|
298
|
+
|------|------|------|
|
|
299
|
+
| Adds(int16) | 饱和(非回绕) | 跨 0x8000 需 cross-half 修正 |
|
|
300
|
+
| ReduceSum | 仅支持 half / float(无整型) | 必须 mask → half → ReduceSum |
|
|
301
|
+
| half 精度 | 精确整数 ≤ 2048 | SUBCHUNK ≤ 2048 |
|
|
302
|
+
| `xGm_.GetValue` | 非阻塞流水线读 | 不可替换为同步计算 |
|
|
303
|
+
| `SetValue` | 阻塞写 | 是标量输出的真实瓶颈 |
|
|
304
|
+
| scalar → UB → DMA | cache 不一致 | batch DMA 写出不可行 |
|
|
305
|
+
| TBuf + PipeBarrier | 不支持 MTE2/Vec overlap | 必须用 TQue |
|
|
306
|
+
| `TQue<VECIN, 1>` + `InitBuffer(que, 2, size)` | 支持真正并行 | double buffer 由 InitBuffer num=2 控制,depth=1 即可 |
|
|
307
|
+
| UB 容量 | 192KB per AIV | TQue×2 + 3×TBuf = 172KB 可行 |
|
|
308
|
+
| Cross-core sync | 无硬件 barrier | GM 轮询实现 |
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 7. 实战案例
|
|
313
|
+
|
|
314
|
+
### 7.1 RadixTopk(选择类)
|
|
315
|
+
|
|
316
|
+
| 版本 | Kernel | 核心优化 | 优化类型 |
|
|
317
|
+
|------|--------|---------|---------|
|
|
318
|
+
| 版本一 | 23.4ms | 4+4+4+4 直方图 | baseline |
|
|
319
|
+
| 版本二 | 20.5ms | 3+3+5+5 分桶 | 算法重构 (§1.2) |
|
|
320
|
+
| 版本三 | 20.8ms | 累积 GE + 精度修复 | 指令级 (§3.1) + 精度 (§4) |
|
|
321
|
+
| 版本四 | 15.0ms | 16 步向量化二分搜索 + 一次性 VtS | 算法重构 (§1.1, §1.3) |
|
|
322
|
+
| 版本五 | 13.2ms | TQue Double Buffer | 流水线并行 (§2.1) |
|
|
323
|
+
|
|
324
|
+
**总提升**:23.4ms → 13.2ms(**-44%**,1.79x vs torch.topk)
|
|
325
|
+
|
|
326
|
+
### 7.2 方法论推广到其他算子
|
|
327
|
+
|
|
328
|
+
| 算子 | 适用优化 | 关键考量 |
|
|
329
|
+
|------|---------|---------|
|
|
330
|
+
| **Sort/ArgSort** | 保序变换 (§1.3) + 二分搜索找分位点 + 分桶重排 | 需要有序输出,不能只找阈值 |
|
|
331
|
+
| **Unique** | 排序后去重 → 二分搜索找值域分段 + 向量化 mask | 输出大小未知 → 两遍扫描 |
|
|
332
|
+
| **NonZero** | 向量 mask (§3.2) + 标量紧凑输出 | 与 TopK Pass 3 输出模式相同 |
|
|
333
|
+
| **Histogram** | 向量化 bin counting (§3.1) + 跨核归约 | bins 数决定向量比较次数 |
|
|
334
|
+
| **ArgMax/ArgMin** | 向量 ReduceMax 找值 + 二分搜索定位位置 | 单值输出,更简单 |
|
|
335
|
+
| **Quantile** | 二分搜索 (§1.1) 找 count=N×q 的阈值 | 与 TopK 几乎相同 |
|
|
336
|
+
| **MaskedSelect** | 向量 mask + 标量 GM 输出 (§3.2, §3.3) | 与 TopK Pass 3 相同 |
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 8. 反例与反模式
|
|
341
|
+
|
|
342
|
+
| 反模式 | 问题 | 建议替代 |
|
|
343
|
+
|------|------|---------|
|
|
344
|
+
| 多级直方图低位标量扫描 | 低位元素匹配率 <2%,向量化退化为标量,scalar 主导 | 向量化二分搜索 (§1.1) |
|
|
345
|
+
| 重复执行浮点→sortable 变换 | N 次扫描每次都做 Transform,重复指令成本 | 一次性 Transform 写回 GM,后续直接读 (§1.3) |
|
|
346
|
+
| TBuf + PipeBarrier 手动 double buffer | `PipeBarrier<PIPE_ALL>` 全停,无法 MTE2/Vector overlap | 用 `TQue<VECIN, 1>` + `InitBuffer(que, 2, size)` (§2.1) |
|
|
347
|
+
| 预先 Alloc 所有 chunk 的 Tensor | `AllocTensor` 在 queue 满时阻塞 → 流水线死锁 | 循环内按需 Alloc/Free (§2.1) |
|
|
348
|
+
| 同步 scalar 计算替代非阻塞 GetValue | 破坏 GM 读流水线,scalar 反而变慢 | 保留 `xGm_.GetValue` 非阻塞读 (§3.3) |
|
|
349
|
+
| 减少 SetValue 输出量来 "省时" | 标量流水线出现空洞,反而更慢 | 接受输出成本,或用无关 GetValue 填洞 (§3.3) |
|
|
350
|
+
| `Adds(int16)` 跨 0x8000 直接比较 | 饱和而非回绕,符号位结果错误 | 分高/低半区做 cross-half 修正 (§4.2) |
|
|
351
|
+
| half ReduceSum subchunk > 2048 | half 尾数 10 bits,累加结果丢精度 | `SUBCHUNK ≤ 2048`,或换 float32 ReduceSum (§4.3) |
|
|
352
|
+
| 最后 chunk 不补齐就 DMA | padding 区域残留数据混入计算 | Host tiling 对齐到 `HIST_SUBCHUNK` (§4.4) |
|
|
353
|
+
| 每步 barrier 传 256-bin 直方图 | 跨核同步数据量大,barrier 开销显著 | 二分搜索每步只传 1 个 count (§5) |
|
|
354
|
+
| 默认套用通用 sort API | 大数据稀疏选择场景下吞吐极差 | 走专门的 radix / 二分搜索路径 |
|