ops-tune-workbench-plugin 0.0.0-stage → 0.0.1-beta.1
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/NOTICE.md +14 -0
- package/README.md +39 -2
- package/cordis.patch.yml +20 -0
- package/lib/client.js +4253 -0
- package/lib/host.js +2518 -0
- package/package.json +53 -4
- package/skills/tool-ops-tune/INSTALL.md +52 -0
- package/skills/tool-ops-tune/README.md +167 -0
- package/skills/tool-ops-tune/SKILL.md +93 -0
- package/skills/tool-ops-tune/agent/AGENTS.md +195 -0
- package/skills/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
- package/skills/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
- package/skills/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
- package/skills/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
- package/skills/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
- package/skills/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
- package/skills/tool-ops-tune/docs/ops-tune-design.md +404 -0
- package/skills/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +714 -0
- package/skills/tool-ops-tune/docs//347/237/245/350/257/206/345/272/223/350/247/204/350/214/203.md +103 -0
- package/skills/tool-ops-tune/evals/evals.json +242 -0
- package/skills/tool-ops-tune/ops-collect/SKILL.md +146 -0
- package/skills/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
- package/skills/tool-ops-tune/ops-collect/scripts/collect_board.sh +444 -0
- package/skills/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
- package/skills/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
- package/skills/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
- package/skills/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
- package/skills/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1063 -0
- package/skills/tool-ops-tune/ops-collect/scripts/isolation_test.py +454 -0
- package/skills/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
- package/skills/tool-ops-tune/ops-family/SKILL.md +76 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
- package/skills/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
- package/skills/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
- package/skills/tool-ops-tune/ops-family/references/common/index.md +9 -0
- package/skills/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
- package/skills/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
- package/skills/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
- package/skills/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
- package/skills/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
- package/skills/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +86 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
- package/skills/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
- package/skills/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
- package/skills/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
- package/skills/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
- package/skills/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
- package/skills/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
- package/skills/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
- package/skills/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
- package/skills/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
- package/skills/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
- package/skills/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
- package/skills/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
- package/skills/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
- package/skills/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
- package/skills/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
- package/skills/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
- package/skills/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
- package/skills/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
- package/skills/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
- package/skills/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
- package/skills/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
- package/skills/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
- package/skills/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
- package/skills/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
- package/skills/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
- package/skills/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
- package/skills/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
- package/skills/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
- package/skills/tool-ops-tune/ops-report/SKILL.md +77 -0
- package/skills/tool-ops-tune/ops-verdict/evals/run_evals.py +837 -0
- package/skills/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
- package/skills/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +405 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
- package/skills/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
- package/skills/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
- package/skills/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
- package/skills/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
- package/skills/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
- package/skills/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
- package/skills/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
- package/skills/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
- package/skills/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +444 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/delta_compare.py +244 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/render_html.py +274 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
- package/skills/tool-ops-tune/ops-verdict/scripts/verdict.py +1072 -0
- package/skills/tool-ops-tune/scripts/diff_audit.py +281 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 Huawei Technologies Co., Ltd.
|
|
3
|
+
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
|
4
|
+
* CANN Open Software License Agreement Version 2.0 (the "License").
|
|
5
|
+
* Please refer to the License for details. You may not use this file except in compliance with the License.
|
|
6
|
+
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
|
7
|
+
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
8
|
+
* See LICENSE in the root of the software repository for the full text of the License.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* !
|
|
12
|
+
* \file softmax_v2_ara_online.h
|
|
13
|
+
* \brief SoftmaxV2 ARA 布局的 Online Softmax 模板。
|
|
14
|
+
*
|
|
15
|
+
* 数据布局 [A1, R, A0],softmax 沿 R 轴。相比 ARA Recompute(输入读 3 次:max/sum/output),
|
|
16
|
+
* Online Softmax 将 max 与 sum 融合为单遍在线更新(维护 running max / running sum),
|
|
17
|
+
* 输入只需读 2 次(1 遍在线 max+sum,1 遍输出),减少一次 R 全量搬入。
|
|
18
|
+
*
|
|
19
|
+
* 在线更新公式(沿 R 分 chunk,按 A0 列独立维护 running 状态):
|
|
20
|
+
* m_new = max(m_old, chunk_max)
|
|
21
|
+
* corr = exp(m_old - m_new)
|
|
22
|
+
* l_new = l_old * corr + Σ_row exp(x - m_new)
|
|
23
|
+
* 最终 softmax(x) = exp(x - m_final) / l_final
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
#ifndef SOFTMAX_V2_ARA_ONLINE_H
|
|
27
|
+
#define SOFTMAX_V2_ARA_ONLINE_H
|
|
28
|
+
|
|
29
|
+
#include "kernel_tiling/kernel_tiling.h"
|
|
30
|
+
|
|
31
|
+
#include "kernel_operator.h"
|
|
32
|
+
#include "softmax_v2_base.h"
|
|
33
|
+
|
|
34
|
+
namespace SoftmaxV2Ops
|
|
35
|
+
{
|
|
36
|
+
using namespace AscendC;
|
|
37
|
+
using namespace AscendC::MicroAPI;
|
|
38
|
+
|
|
39
|
+
using AscendC::MicroAPI::LoadDist;
|
|
40
|
+
using AscendC::MicroAPI::MaskMergeMode;
|
|
41
|
+
using AscendC::MicroAPI::MaskReg;
|
|
42
|
+
using AscendC::MicroAPI::RegTensor;
|
|
43
|
+
using AscendC::MicroAPI::StoreDist;
|
|
44
|
+
|
|
45
|
+
template <typename T1, typename T2>
|
|
46
|
+
class SoftmaxV2ARAOnline : public SoftmaxV2OpsBase
|
|
47
|
+
{
|
|
48
|
+
static constexpr int32_t BUFFER_NUM = 2;
|
|
49
|
+
|
|
50
|
+
static constexpr uint16_t VECTOR_LENGTH = GetVRegSize();
|
|
51
|
+
static constexpr uint32_t VL_FP32 = VECTOR_LENGTH / sizeof(float);
|
|
52
|
+
static constexpr int64_t BLOCK_SIZE = GetUbBlockSize();
|
|
53
|
+
|
|
54
|
+
public:
|
|
55
|
+
__aicore__ inline SoftmaxV2ARAOnline(){};
|
|
56
|
+
|
|
57
|
+
__aicore__ inline SoftmaxV2ARAOnline(const SoftmaxV2ARAOnlineTilingData* tilingDataIn)
|
|
58
|
+
{
|
|
59
|
+
tilingData_ = tilingDataIn;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
__aicore__ inline void Init(GM_ADDR x, GM_ADDR y, TPipe* pipeIn)
|
|
63
|
+
{
|
|
64
|
+
pipe_ = pipeIn;
|
|
65
|
+
|
|
66
|
+
xGm_.SetGlobalBuffer((__gm__ T1*)x);
|
|
67
|
+
yGm_.SetGlobalBuffer((__gm__ T2*)y);
|
|
68
|
+
|
|
69
|
+
int64_t xShapeLen = tilingData_->tileA0Len * tilingData_->rChunkFactor;
|
|
70
|
+
pipe_->InitBuffer(xQueue_, BUFFER_NUM, xShapeLen * sizeof(T1));
|
|
71
|
+
pipe_->InitBuffer(yQueue_, BUFFER_NUM, xShapeLen * sizeof(float));
|
|
72
|
+
|
|
73
|
+
pipe_->InitBuffer(xMaxBuf_, tilingData_->tileA0Len * sizeof(float));
|
|
74
|
+
pipe_->InitBuffer(xSumBuf_, tilingData_->tileA0Len * sizeof(float));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
__aicore__ inline void Process()
|
|
78
|
+
{
|
|
79
|
+
int64_t blockIdx = GetBlockIdx();
|
|
80
|
+
int64_t beginIdx = blockIdx * tilingData_->tilesPerCore;
|
|
81
|
+
int64_t endIdx = beginIdx + tilingData_->tilesPerCore;
|
|
82
|
+
endIdx = endIdx > tilingData_->totalTiles ? tilingData_->totalTiles : endIdx;
|
|
83
|
+
|
|
84
|
+
// pattern is [A1, R, A0]
|
|
85
|
+
for (int64_t curIdx = beginIdx; curIdx < endIdx; curIdx++) {
|
|
86
|
+
int64_t curA0Idx = curIdx % tilingData_->tileA0Outer;
|
|
87
|
+
int64_t curA1Idx = curIdx / tilingData_->tileA0Outer;
|
|
88
|
+
|
|
89
|
+
uint32_t curTileA0Len =
|
|
90
|
+
curA0Idx == (tilingData_->tileA0Outer - 1) ? tilingData_->tileA0Tail : tilingData_->tileA0Len;
|
|
91
|
+
|
|
92
|
+
int64_t xOffset =
|
|
93
|
+
// a1 offset
|
|
94
|
+
curA1Idx * tilingData_->totalRLen * tilingData_->totalA0Len +
|
|
95
|
+
// a0 offset
|
|
96
|
+
curA0Idx * tilingData_->tileA0Len;
|
|
97
|
+
|
|
98
|
+
uint16_t loopA0Num = ops::CeilDiv(curTileA0Len, VL_FP32);
|
|
99
|
+
|
|
100
|
+
// 单遍在线更新 running max / running sum
|
|
101
|
+
CalcOnlineMaxSum(curTileA0Len, xOffset, loopA0Num);
|
|
102
|
+
|
|
103
|
+
// 输出遍:exp(x - max) / sum
|
|
104
|
+
for (int64_t idx = 0; idx < tilingData_->rChunkTotalLoop; idx++) {
|
|
105
|
+
int64_t curTileRLen =
|
|
106
|
+
idx == (tilingData_->rChunkTotalLoop - 1) ? tilingData_->rChunkTail : tilingData_->rChunkFactor;
|
|
107
|
+
|
|
108
|
+
int64_t offset = xOffset + idx * tilingData_->rChunkFactor * tilingData_->totalA0Len;
|
|
109
|
+
CopyInX(offset, curTileRLen, curTileA0Len);
|
|
110
|
+
CalcOutput(curTileRLen, curTileA0Len, loopA0Num);
|
|
111
|
+
CopyOutY(offset, curTileRLen, curTileA0Len);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private:
|
|
117
|
+
// 单遍在线 max+sum:按 R chunk 逐块搬入,按 A0 列独立维护 running max / running sum。
|
|
118
|
+
__aicore__ inline void CalcOnlineMaxSum(uint32_t curTileA0Len, int64_t xOffsetStart, uint16_t loopA0Num)
|
|
119
|
+
{
|
|
120
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
121
|
+
LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
|
|
122
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
123
|
+
__local_mem__ float* xSumLocal = (__local_mem__ float*)xSumTensor.GetPhyAddr();
|
|
124
|
+
|
|
125
|
+
// 初始化 running max = -inf, running sum = 0
|
|
126
|
+
__VEC_SCOPE__
|
|
127
|
+
{
|
|
128
|
+
RegTensor<float> maxReg;
|
|
129
|
+
RegTensor<float> sumReg;
|
|
130
|
+
MaskReg pregMask;
|
|
131
|
+
uint32_t sreg = curTileA0Len;
|
|
132
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
133
|
+
pregMask = UpdateMask<float>(sreg);
|
|
134
|
+
Duplicate(maxReg, static_cast<float>(-INFINITY), pregMask);
|
|
135
|
+
Duplicate(sumReg, static_cast<float>(0.0f), pregMask);
|
|
136
|
+
DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, maxReg, pregMask);
|
|
137
|
+
DataCopy(((__local_mem__ float*)xSumLocal) + k * VL_FP32, sumReg, pregMask);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
uint32_t tileA0Len = tilingData_->tileA0Len;
|
|
142
|
+
|
|
143
|
+
for (int64_t idx = 0; idx < tilingData_->rChunkTotalLoop; idx++) {
|
|
144
|
+
int64_t curTileRLen =
|
|
145
|
+
idx == (tilingData_->rChunkTotalLoop - 1) ? tilingData_->rChunkTail : tilingData_->rChunkFactor;
|
|
146
|
+
uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
|
|
147
|
+
int64_t xOffset = xOffsetStart + idx * tilingData_->rChunkFactor * tilingData_->totalA0Len;
|
|
148
|
+
|
|
149
|
+
CopyInX(xOffset, curTileRLen, curTileA0Len);
|
|
150
|
+
LocalTensor<T1> x = xQueue_.DeQue<T1>();
|
|
151
|
+
__local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
|
|
152
|
+
|
|
153
|
+
__VEC_SCOPE__
|
|
154
|
+
{
|
|
155
|
+
RegTensor<float> xReg;
|
|
156
|
+
RegTensor<float> mOldReg;
|
|
157
|
+
RegTensor<float> lOldReg;
|
|
158
|
+
RegTensor<float> mNewReg;
|
|
159
|
+
RegTensor<float> mLocalReg;
|
|
160
|
+
RegTensor<float> corrReg;
|
|
161
|
+
RegTensor<float> tmpReg;
|
|
162
|
+
RegTensor<float> chunkSumReg;
|
|
163
|
+
|
|
164
|
+
MaskReg pregMask;
|
|
165
|
+
uint32_t sreg = curTileA0Len;
|
|
166
|
+
|
|
167
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
168
|
+
pregMask = UpdateMask<float>(sreg);
|
|
169
|
+
// load running state for this A0 column block
|
|
170
|
+
DataCopy<float, LoadDist::DIST_NORM>(mOldReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
|
|
171
|
+
DataCopy<float, LoadDist::DIST_NORM>(lOldReg, (__local_mem__ float*)xSumLocal + k * VL_FP32);
|
|
172
|
+
|
|
173
|
+
// chunk local max
|
|
174
|
+
Duplicate(mLocalReg, static_cast<float>(-INFINITY), pregMask);
|
|
175
|
+
for (uint16_t i = 0; i < curTileRLenVl; i++) {
|
|
176
|
+
uint32_t offset = i * tileA0Len + k * VL_FP32;
|
|
177
|
+
LoadTensorForDtypeT1(xLocal, xReg, pregMask, offset);
|
|
178
|
+
Max(mLocalReg, mLocalReg, xReg, pregMask);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// m_new = max(m_old, chunk_max)
|
|
182
|
+
Max(mNewReg, mOldReg, mLocalReg, pregMask);
|
|
183
|
+
// corr = exp(m_old - m_new)
|
|
184
|
+
Sub(corrReg, mOldReg, mNewReg, pregMask);
|
|
185
|
+
Exp(corrReg, corrReg, pregMask);
|
|
186
|
+
|
|
187
|
+
// chunk_sum = Σ_row exp(x - m_new)
|
|
188
|
+
Duplicate(chunkSumReg, static_cast<float>(0.0f), pregMask);
|
|
189
|
+
for (uint16_t i = 0; i < curTileRLenVl; i++) {
|
|
190
|
+
uint32_t offset = i * tileA0Len + k * VL_FP32;
|
|
191
|
+
LoadTensorForDtypeT1(xLocal, xReg, pregMask, offset);
|
|
192
|
+
Sub(tmpReg, xReg, mNewReg, pregMask);
|
|
193
|
+
Exp(tmpReg, tmpReg, pregMask);
|
|
194
|
+
Add(chunkSumReg, chunkSumReg, tmpReg, pregMask);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// l_new = l_old * corr + chunk_sum
|
|
198
|
+
Mul(lOldReg, lOldReg, corrReg, pregMask);
|
|
199
|
+
Add(lOldReg, lOldReg, chunkSumReg, pregMask);
|
|
200
|
+
|
|
201
|
+
// store back running state
|
|
202
|
+
DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, mNewReg, pregMask);
|
|
203
|
+
DataCopy(((__local_mem__ float*)xSumLocal) + k * VL_FP32, lOldReg, pregMask);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
xQueue_.FreeTensor<T1>(x);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
__aicore__ inline void CopyInX(int64_t xGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
|
|
212
|
+
{
|
|
213
|
+
LocalTensor<T1> xLocal = xQueue_.AllocTensor<T1>();
|
|
214
|
+
DataCopyPadExtParams<T1> dataCopyPadExtParams;
|
|
215
|
+
dataCopyPadExtParams.isPad = false;
|
|
216
|
+
dataCopyPadExtParams.leftPadding = 0;
|
|
217
|
+
dataCopyPadExtParams.rightPadding = 0;
|
|
218
|
+
dataCopyPadExtParams.paddingValue = 0;
|
|
219
|
+
DataCopyExtParams copyInParams;
|
|
220
|
+
copyInParams.blockCount = curTileRLen;
|
|
221
|
+
copyInParams.blockLen = curTileA0Len * sizeof(T1);
|
|
222
|
+
copyInParams.srcStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T1);
|
|
223
|
+
copyInParams.dstStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T1) / BLOCK_SIZE;
|
|
224
|
+
DataCopyPad<T1, PaddingMode::Normal>(xLocal, xGm_[xGmOffset], copyInParams, dataCopyPadExtParams);
|
|
225
|
+
|
|
226
|
+
xQueue_.EnQue(xLocal);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
__aicore__ inline void CalcOutput(int64_t curTileRLen, uint32_t curTileA0Len, uint16_t loopA0Num)
|
|
230
|
+
{
|
|
231
|
+
LocalTensor<T1> x = xQueue_.DeQue<T1>();
|
|
232
|
+
__local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
|
|
233
|
+
|
|
234
|
+
LocalTensor<T2> y = yQueue_.template AllocTensor<T2>();
|
|
235
|
+
__local_mem__ T2* yLocal = (__local_mem__ T2*)y.GetPhyAddr();
|
|
236
|
+
|
|
237
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
238
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
239
|
+
|
|
240
|
+
LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
|
|
241
|
+
__local_mem__ float* xSumLocal = (__local_mem__ float*)xSumTensor.GetPhyAddr();
|
|
242
|
+
|
|
243
|
+
uint32_t tileA0Len = tilingData_->tileA0Len;
|
|
244
|
+
uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
|
|
245
|
+
__VEC_SCOPE__
|
|
246
|
+
{
|
|
247
|
+
RegTensor<float> xReg;
|
|
248
|
+
RegTensor<float> yReg;
|
|
249
|
+
RegTensor<float> sumReg;
|
|
250
|
+
RegTensor<float> maxReg;
|
|
251
|
+
|
|
252
|
+
MaskReg pregMask;
|
|
253
|
+
uint32_t sreg = curTileA0Len;
|
|
254
|
+
|
|
255
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
256
|
+
pregMask = UpdateMask<float>(sreg);
|
|
257
|
+
DataCopy<float, LoadDist::DIST_NORM>(sumReg, (__local_mem__ float*)xSumLocal + k * VL_FP32);
|
|
258
|
+
DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
|
|
259
|
+
for (uint16_t i = 0; i < curTileRLenVl; i++) {
|
|
260
|
+
uint32_t xOffset = i * tileA0Len + k * VL_FP32;
|
|
261
|
+
LoadTensorForDtypeT1(xLocal, xReg, pregMask, xOffset);
|
|
262
|
+
|
|
263
|
+
Sub(xReg, xReg, maxReg, pregMask);
|
|
264
|
+
Exp(xReg, xReg, pregMask);
|
|
265
|
+
Div(yReg, xReg, sumReg, pregMask);
|
|
266
|
+
|
|
267
|
+
// copy out
|
|
268
|
+
if constexpr (IsSameType<T2, float>::value) {
|
|
269
|
+
DataCopy(((__local_mem__ float*)yLocal) + xOffset, yReg, pregMask);
|
|
270
|
+
} else { // fp16、bf16
|
|
271
|
+
RegTensor<T2> xFp16;
|
|
272
|
+
Cast<T2, float, castTraitFp32ToFp16>(xFp16, yReg, pregMask);
|
|
273
|
+
DataCopy<T2, StoreDist::DIST_PACK_B32>(((__local_mem__ T2*)yLocal) + xOffset, xFp16, pregMask);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
yQueue_.EnQue(y);
|
|
280
|
+
|
|
281
|
+
xQueue_.FreeTensor<T1>(x);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
__aicore__ inline void LoadTensorForDtypeT1(__local_mem__ T1* src, RegTensor<float>& dst, MaskReg& preg,
|
|
285
|
+
uint32_t offset)
|
|
286
|
+
{
|
|
287
|
+
if constexpr (IsSameType<T1, float>::value) {
|
|
288
|
+
DataCopy<float, LoadDist::DIST_NORM>(dst, (__local_mem__ float*)src + offset);
|
|
289
|
+
} else { // fp16、bf16
|
|
290
|
+
RegTensor<T1> xFp16;
|
|
291
|
+
DataCopy<T1, LoadDist::DIST_UNPACK_B16>(xFp16, ((__local_mem__ T1*)src + offset));
|
|
292
|
+
Cast<float, T1, castTraitFp16ToFp32>(dst, xFp16, preg);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
__aicore__ inline void CopyOutY(int64_t yGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
|
|
297
|
+
{
|
|
298
|
+
LocalTensor<T2> y = yQueue_.DeQue<T2>();
|
|
299
|
+
DataCopyExtParams copyInParams;
|
|
300
|
+
copyInParams.blockCount = curTileRLen;
|
|
301
|
+
copyInParams.blockLen = curTileA0Len * sizeof(T2);
|
|
302
|
+
copyInParams.srcStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T2) / BLOCK_SIZE;
|
|
303
|
+
copyInParams.dstStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T2);
|
|
304
|
+
DataCopyPad<T2, PaddingMode::Normal>(yGm_[yGmOffset], y, copyInParams);
|
|
305
|
+
yQueue_.FreeTensor(y);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
private:
|
|
309
|
+
const SoftmaxV2ARAOnlineTilingData* tilingData_;
|
|
310
|
+
|
|
311
|
+
TPipe* pipe_;
|
|
312
|
+
|
|
313
|
+
TQue<QuePosition::VECIN, 1> xQueue_;
|
|
314
|
+
TQue<QuePosition::VECOUT, 1> yQueue_;
|
|
315
|
+
|
|
316
|
+
TBuf<TPosition::VECCALC> xMaxBuf_;
|
|
317
|
+
TBuf<TPosition::VECCALC> xSumBuf_;
|
|
318
|
+
|
|
319
|
+
GlobalTensor<T2> yGm_;
|
|
320
|
+
GlobalTensor<T1> xGm_;
|
|
321
|
+
};
|
|
322
|
+
} // namespace SoftmaxV2Ops
|
|
323
|
+
|
|
324
|
+
#endif // SOFTMAX_V2_ARA_ONLINE_H
|