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,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 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_recompute.h
|
|
13
|
+
* \brief
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#ifndef SOFTMAX_V2_ARA_RECOMPUTE_H
|
|
17
|
+
#define SOFTMAX_V2_ARA_RECOMPUTE_H
|
|
18
|
+
|
|
19
|
+
#include "kernel_tiling/kernel_tiling.h"
|
|
20
|
+
|
|
21
|
+
#include "kernel_operator.h"
|
|
22
|
+
#include "softmax_v2_base.h"
|
|
23
|
+
|
|
24
|
+
namespace SoftmaxV2Ops
|
|
25
|
+
{
|
|
26
|
+
using namespace AscendC;
|
|
27
|
+
using namespace AscendC::MicroAPI;
|
|
28
|
+
|
|
29
|
+
using AscendC::MicroAPI::LoadDist;
|
|
30
|
+
using AscendC::MicroAPI::MaskMergeMode;
|
|
31
|
+
using AscendC::MicroAPI::MaskReg;
|
|
32
|
+
using AscendC::MicroAPI::RegTensor;
|
|
33
|
+
using AscendC::MicroAPI::StoreDist;
|
|
34
|
+
|
|
35
|
+
template <typename T1, typename T2>
|
|
36
|
+
class SoftmaxV2ARARecompute : public SoftmaxV2OpsBase
|
|
37
|
+
{
|
|
38
|
+
static constexpr int32_t BUFFER_NUM = 2;
|
|
39
|
+
static constexpr int32_t BUFFER_DEPTH = 1;
|
|
40
|
+
|
|
41
|
+
static constexpr uint16_t VECTOR_LENGTH = GetVRegSize();
|
|
42
|
+
static constexpr uint32_t VL_FP32 = VECTOR_LENGTH / sizeof(float);
|
|
43
|
+
static constexpr int64_t BLOCK_SIZE = GetUbBlockSize();
|
|
44
|
+
|
|
45
|
+
public:
|
|
46
|
+
__aicore__ inline SoftmaxV2ARARecompute(){};
|
|
47
|
+
|
|
48
|
+
__aicore__ inline SoftmaxV2ARARecompute(const SoftmaxV2ARARecomputeTilingData* tilingDataIn)
|
|
49
|
+
{
|
|
50
|
+
tilingData_ = tilingDataIn;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
__aicore__ inline void Init(GM_ADDR x, GM_ADDR y, TPipe* pipeIn)
|
|
54
|
+
{
|
|
55
|
+
pipe_ = pipeIn;
|
|
56
|
+
|
|
57
|
+
xGm_.SetGlobalBuffer((__gm__ T1*)x);
|
|
58
|
+
yGm_.SetGlobalBuffer((__gm__ T2*)y);
|
|
59
|
+
|
|
60
|
+
int64_t xShapeLen = tilingData_->tileA0Len * tilingData_->binAddRFactor;
|
|
61
|
+
pipe_->InitBuffer(xQueue_, BUFFER_NUM, xShapeLen * sizeof(T1));
|
|
62
|
+
pipe_->InitBuffer(yQueue_, BUFFER_NUM, xShapeLen * sizeof(float));
|
|
63
|
+
|
|
64
|
+
pipe_->InitBuffer(xMaxBuf_, tilingData_->tileA0Len * sizeof(float));
|
|
65
|
+
pipe_->InitBuffer(xSumBuf_, tilingData_->tileA0Len * sizeof(float));
|
|
66
|
+
|
|
67
|
+
pipe_->InitBuffer(cacheBuffer_, tilingData_->binAddCacheBufferCount * tilingData_->tileA0Len * sizeof(float));
|
|
68
|
+
pipe_->InitBuffer(tempBuffer_, tilingData_->tileA0Len * sizeof(float));
|
|
69
|
+
pipe_->InitBuffer(reduceSumTempBuffer_, CONST_EIGHT * tilingData_->tileA0Len * sizeof(float));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
__aicore__ inline void Process()
|
|
73
|
+
{
|
|
74
|
+
int64_t blockIdx = GetBlockIdx();
|
|
75
|
+
int64_t beginIdx = blockIdx * tilingData_->tilesPerCore;
|
|
76
|
+
int64_t endIdx = beginIdx + tilingData_->tilesPerCore;
|
|
77
|
+
endIdx = endIdx > tilingData_->totalTiles ? tilingData_->totalTiles : endIdx;
|
|
78
|
+
|
|
79
|
+
// pattern is [A1, R, A0]
|
|
80
|
+
for (int64_t curIdx = beginIdx; curIdx < endIdx; curIdx++) {
|
|
81
|
+
int64_t curA0Idx = curIdx % tilingData_->tileA0Outer;
|
|
82
|
+
int64_t curA1Idx = curIdx / tilingData_->tileA0Outer;
|
|
83
|
+
|
|
84
|
+
uint32_t curTileA0Len =
|
|
85
|
+
curA0Idx == (tilingData_->tileA0Outer - 1) ? tilingData_->tileA0Tail : tilingData_->tileA0Len;
|
|
86
|
+
|
|
87
|
+
int64_t xOffset =
|
|
88
|
+
// a1 offset
|
|
89
|
+
curA1Idx * tilingData_->totalRLen * tilingData_->totalA0Len +
|
|
90
|
+
// a0 offset
|
|
91
|
+
curA0Idx * tilingData_->tileA0Len;
|
|
92
|
+
|
|
93
|
+
uint16_t loopA0Num = ops::CeilDiv(curTileA0Len, VL_FP32);
|
|
94
|
+
|
|
95
|
+
CalcReduceMax(curTileA0Len, xOffset, loopA0Num);
|
|
96
|
+
CalcReduceSum(curTileA0Len, xOffset, loopA0Num);
|
|
97
|
+
|
|
98
|
+
for (int64_t idx = 0; idx < tilingData_->binAddRTotalLoop; idx++) {
|
|
99
|
+
int64_t curTileRLen =
|
|
100
|
+
idx == (tilingData_->binAddRTotalLoop - 1) ? tilingData_->binAddRTail : tilingData_->binAddRFactor;
|
|
101
|
+
|
|
102
|
+
int64_t offset = xOffset + idx * tilingData_->binAddRFactor * tilingData_->totalA0Len;
|
|
103
|
+
CopyInX(offset, curTileRLen, curTileA0Len);
|
|
104
|
+
CalcOutput(curTileRLen, curTileA0Len, loopA0Num);
|
|
105
|
+
CopyOutY(offset, curTileRLen, curTileA0Len);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private:
|
|
111
|
+
__aicore__ inline void CalcReduceMax(uint32_t curTileA0Len, int64_t xOffsetStart, uint16_t loopA0Num)
|
|
112
|
+
{
|
|
113
|
+
// max 初始化
|
|
114
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
115
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
116
|
+
|
|
117
|
+
__VEC_SCOPE__
|
|
118
|
+
{
|
|
119
|
+
RegTensor<float> maxReg;
|
|
120
|
+
MaskReg pregMask;
|
|
121
|
+
uint32_t sreg = curTileA0Len;
|
|
122
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
123
|
+
pregMask = UpdateMask<float>(sreg);
|
|
124
|
+
Duplicate(maxReg, static_cast<float>(-INFINITY), pregMask);
|
|
125
|
+
DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, maxReg, pregMask);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
uint32_t tileA0Len = tilingData_->tileA0Len;
|
|
130
|
+
|
|
131
|
+
for (int64_t idx = 0; idx < tilingData_->binAddRTotalLoop; idx++) {
|
|
132
|
+
int64_t curTileRLen =
|
|
133
|
+
idx == (tilingData_->binAddRTotalLoop - 1) ? tilingData_->binAddRTail : tilingData_->binAddRFactor;
|
|
134
|
+
uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
|
|
135
|
+
int64_t xOffset = xOffsetStart + idx * tilingData_->binAddRFactor * tilingData_->totalA0Len;
|
|
136
|
+
|
|
137
|
+
CopyInX(xOffset, curTileRLen, curTileA0Len);
|
|
138
|
+
LocalTensor<T1> x = xQueue_.DeQue<T1>();
|
|
139
|
+
__local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
|
|
140
|
+
|
|
141
|
+
__VEC_SCOPE__
|
|
142
|
+
{
|
|
143
|
+
RegTensor<float> x;
|
|
144
|
+
RegTensor<float> maxReg;
|
|
145
|
+
|
|
146
|
+
MaskReg pregMask;
|
|
147
|
+
uint32_t sreg = curTileA0Len;
|
|
148
|
+
|
|
149
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
150
|
+
pregMask = UpdateMask<float>(sreg);
|
|
151
|
+
// load max
|
|
152
|
+
DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
|
|
153
|
+
|
|
154
|
+
for (uint16_t i = 0; i < curTileRLenVl; i++) {
|
|
155
|
+
uint32_t offset = i * tileA0Len + k * VL_FP32;
|
|
156
|
+
// load x
|
|
157
|
+
LoadTensorForDtypeT1(xLocal, x, pregMask, offset);
|
|
158
|
+
Max(maxReg, maxReg, x, pregMask);
|
|
159
|
+
}
|
|
160
|
+
DataCopy(((__local_mem__ float*)xMaxLocal) + k * VL_FP32, maxReg, pregMask);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
xQueue_.FreeTensor<T1>(x);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
__aicore__ inline void CalcReduceSum(uint32_t curTileA0Len, int64_t xOffsetStart, uint16_t loopA0Num)
|
|
169
|
+
{
|
|
170
|
+
int64_t xSrcStride = tilingData_->totalA0Len;
|
|
171
|
+
|
|
172
|
+
tempTensor_ = tempBuffer_.Get<float>();
|
|
173
|
+
cacheTensor_ = cacheBuffer_.Get<float>();
|
|
174
|
+
reduceSumTempTensor_ = reduceSumTempBuffer_.Get<float>();
|
|
175
|
+
|
|
176
|
+
for (int64_t basicBlockIdx = 0; basicBlockIdx < tilingData_->binAddBasicBlockLoop; basicBlockIdx++) {
|
|
177
|
+
ProcessMainBlock(tilingData_->binAddRFactor, curTileA0Len,
|
|
178
|
+
xOffsetStart + basicBlockIdx * xSrcStride * tilingData_->binAddRFactor, loopA0Num);
|
|
179
|
+
if (basicBlockIdx < tilingData_->binAddMainFoldCount) {
|
|
180
|
+
ProcessFoldBlock(tilingData_->binAddRFactor, curTileA0Len,
|
|
181
|
+
xOffsetStart + (basicBlockIdx + tilingData_->binAddBasicBlockLoop) * xSrcStride *
|
|
182
|
+
tilingData_->binAddRFactor,
|
|
183
|
+
loopA0Num);
|
|
184
|
+
} else if (basicBlockIdx == tilingData_->binAddMainFoldCount && tilingData_->binAddRTail > 0 &&
|
|
185
|
+
tilingData_->binAddRTail != tilingData_->binAddRFactor) {
|
|
186
|
+
ProcessFoldBlock(tilingData_->binAddRTail, curTileA0Len,
|
|
187
|
+
xOffsetStart + (basicBlockIdx + tilingData_->binAddBasicBlockLoop) * xSrcStride *
|
|
188
|
+
tilingData_->binAddRFactor,
|
|
189
|
+
loopA0Num);
|
|
190
|
+
}
|
|
191
|
+
ProcessSummation(basicBlockIdx, tilingData_->binAddRFactor);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (tilingData_->binAddBasicBlockLoop == 0) {
|
|
195
|
+
ProcessMainBlock(tilingData_->binAddRTail, curTileA0Len, xOffsetStart, loopA0Num);
|
|
196
|
+
ProcessSummation(0, tilingData_->binAddRTail);
|
|
197
|
+
}
|
|
198
|
+
LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
|
|
199
|
+
DataCopy(xSumTensor, cacheTensor_[tilingData_->binAddResultCacheID * tilingData_->tileA0Len],
|
|
200
|
+
tilingData_->tileA0Len);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// copy to main
|
|
204
|
+
__aicore__ inline void ProcessMainBlock(const int64_t curTileRLen, const int64_t curTileA0Len,
|
|
205
|
+
const int64_t gmOffset, uint16_t loopA0Num)
|
|
206
|
+
{
|
|
207
|
+
LocalTensor<T1> xMain_ = xQueue_.AllocTensor<T1>();
|
|
208
|
+
CopyIn(xMain_, xGm_[gmOffset], curTileRLen, curTileA0Len);
|
|
209
|
+
xQueue_.EnQue(xMain_);
|
|
210
|
+
xMain_ = xQueue_.DeQue<T1>();
|
|
211
|
+
yMain_ = yQueue_.AllocTensor<float>();
|
|
212
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
213
|
+
|
|
214
|
+
uint16_t outerLoopTimes = static_cast<uint16_t>(curTileRLen);
|
|
215
|
+
uint32_t outerLoopSrcStride = tilingData_->tileA0Len;
|
|
216
|
+
|
|
217
|
+
__local_mem__ float* dst = (__local_mem__ float*)yMain_.GetPhyAddr();
|
|
218
|
+
__local_mem__ T1* src = (__local_mem__ T1*)xMain_.GetPhyAddr();
|
|
219
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
220
|
+
|
|
221
|
+
__VEC_SCOPE__
|
|
222
|
+
{
|
|
223
|
+
MaskReg pregMask;
|
|
224
|
+
uint32_t sreg = curTileA0Len;
|
|
225
|
+
|
|
226
|
+
RegTensor<float> srcReg;
|
|
227
|
+
RegTensor<float> maxReg;
|
|
228
|
+
RegTensor<float> dstReg;
|
|
229
|
+
|
|
230
|
+
for (uint16_t j = 0; j < loopA0Num; ++j) {
|
|
231
|
+
pregMask = UpdateMask<float>(sreg);
|
|
232
|
+
DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + j * VL_FP32);
|
|
233
|
+
for (uint16_t i = 0; i < outerLoopTimes; ++i) {
|
|
234
|
+
uint32_t xOffset = i * outerLoopSrcStride + j * VL_FP32;
|
|
235
|
+
LoadTensorForDtypeT1(src, srcReg, pregMask, xOffset);
|
|
236
|
+
Sub(dstReg, srcReg, maxReg, pregMask);
|
|
237
|
+
Exp(dstReg, dstReg, pregMask);
|
|
238
|
+
DataCopy((__local_mem__ float*)dst + xOffset, dstReg, pregMask);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
xQueue_.FreeTensor(xMain_);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// fold cast fp32 加到main
|
|
247
|
+
__aicore__ inline void ProcessFoldBlock(const int64_t curTileRLen, const int64_t curTileA0Len,
|
|
248
|
+
const int64_t gmOffset, uint16_t loopA0Num)
|
|
249
|
+
{
|
|
250
|
+
LocalTensor<T1> xFold = xQueue_.AllocTensor<T1>();
|
|
251
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
252
|
+
CopyIn(xFold, xGm_[gmOffset], curTileRLen, curTileA0Len);
|
|
253
|
+
xQueue_.EnQue(xFold);
|
|
254
|
+
xFold = xQueue_.DeQue<T1>();
|
|
255
|
+
|
|
256
|
+
uint16_t outerLoopTimes = static_cast<uint16_t>(curTileRLen);
|
|
257
|
+
uint32_t outerLoopSrcStride = tilingData_->tileA0Len;
|
|
258
|
+
|
|
259
|
+
__local_mem__ float* dst = (__local_mem__ float*)yMain_.GetPhyAddr();
|
|
260
|
+
__local_mem__ T1* src = (__local_mem__ T1*)xFold.GetPhyAddr();
|
|
261
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
262
|
+
|
|
263
|
+
__VEC_SCOPE__
|
|
264
|
+
{
|
|
265
|
+
MaskReg pregMask;
|
|
266
|
+
uint32_t sreg = curTileA0Len;
|
|
267
|
+
|
|
268
|
+
RegTensor<float> srcReg;
|
|
269
|
+
RegTensor<float> maxReg;
|
|
270
|
+
RegTensor<float> dstReg;
|
|
271
|
+
|
|
272
|
+
for (uint16_t j = 0; j < loopA0Num; ++j) {
|
|
273
|
+
pregMask = UpdateMask<float>(sreg);
|
|
274
|
+
DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + j * VL_FP32);
|
|
275
|
+
for (uint16_t i = 0; i < outerLoopTimes; ++i) {
|
|
276
|
+
uint32_t xOffset = i * outerLoopSrcStride + j * VL_FP32;
|
|
277
|
+
LoadTensorForDtypeT1(src, srcReg, pregMask, i * outerLoopSrcStride + j * VL_FP32);
|
|
278
|
+
Sub(dstReg, srcReg, maxReg, pregMask);
|
|
279
|
+
Exp(dstReg, dstReg, pregMask);
|
|
280
|
+
DataCopy(srcReg, (__local_mem__ float*)dst + xOffset);
|
|
281
|
+
Add(dstReg, dstReg, srcReg, pregMask);
|
|
282
|
+
DataCopy((__local_mem__ float*)dst + xOffset, dstReg, pregMask);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
xQueue_.FreeTensor(xFold);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
__aicore__ inline void CopyIn(const LocalTensor<T1>& dstTensor, const GlobalTensor<T1>& srcTensor,
|
|
291
|
+
const int64_t curTileRLen, const int64_t curTileA0Len)
|
|
292
|
+
{
|
|
293
|
+
DataCopyExtParams params;
|
|
294
|
+
params.blockCount = curTileRLen;
|
|
295
|
+
params.blockLen = curTileA0Len * sizeof(T1);
|
|
296
|
+
params.srcStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T1);
|
|
297
|
+
params.dstStride = (tilingData_->tileA0Len * sizeof(T1) - params.blockLen) / BLOCK_SIZE;
|
|
298
|
+
DataCopyPadExtParams<T1> padParams;
|
|
299
|
+
padParams.isPad = false;
|
|
300
|
+
DataCopyPad(dstTensor, srcTensor, params, padParams);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
__aicore__ inline void ProcessSummation(const int64_t basicBlockIdx, int64_t binAddRLen)
|
|
304
|
+
{
|
|
305
|
+
int64_t cacheID = GetCacheID(basicBlockIdx);
|
|
306
|
+
NlastReduceSum(tempTensor_, yMain_, reduceSumTempTensor_, binAddRLen, tilingData_->tileA0Len,
|
|
307
|
+
tilingData_->tileA0Len);
|
|
308
|
+
yQueue_.FreeTensor(yMain_);
|
|
309
|
+
UpdateCache(cacheTensor_, tempTensor_, cacheID, tilingData_->tileA0Len, tilingData_->tileA0Len);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
__aicore__ inline void CopyInX(int64_t xGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
|
|
313
|
+
{
|
|
314
|
+
LocalTensor<T1> xLocal = xQueue_.AllocTensor<T1>();
|
|
315
|
+
DataCopyPadExtParams<T1> dataCopyPadExtParams;
|
|
316
|
+
dataCopyPadExtParams.isPad = false;
|
|
317
|
+
dataCopyPadExtParams.leftPadding = 0;
|
|
318
|
+
dataCopyPadExtParams.rightPadding = 0;
|
|
319
|
+
dataCopyPadExtParams.paddingValue = 0;
|
|
320
|
+
DataCopyExtParams copyInParams;
|
|
321
|
+
copyInParams.blockCount = curTileRLen;
|
|
322
|
+
copyInParams.blockLen = curTileA0Len * sizeof(T1);
|
|
323
|
+
copyInParams.srcStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T1);
|
|
324
|
+
copyInParams.dstStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T1) / BLOCK_SIZE;
|
|
325
|
+
DataCopyPad<T1, PaddingMode::Normal>(xLocal, xGm_[xGmOffset], copyInParams, dataCopyPadExtParams);
|
|
326
|
+
|
|
327
|
+
xQueue_.EnQue(xLocal);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
__aicore__ inline void CalcOutput(int64_t curTileRLen, uint32_t curTileA0Len, uint16_t loopA0Num)
|
|
331
|
+
{
|
|
332
|
+
LocalTensor<T1> x = xQueue_.DeQue<T1>();
|
|
333
|
+
__local_mem__ T1* xLocal = (__local_mem__ T1*)x.GetPhyAddr();
|
|
334
|
+
|
|
335
|
+
LocalTensor<T2> y = yQueue_.template AllocTensor<T2>();
|
|
336
|
+
__local_mem__ T2* yLocal = (__local_mem__ T2*)y.GetPhyAddr();
|
|
337
|
+
|
|
338
|
+
LocalTensor<float> xMaxTensor = xMaxBuf_.Get<float>();
|
|
339
|
+
__local_mem__ float* xMaxLocal = (__local_mem__ float*)xMaxTensor.GetPhyAddr();
|
|
340
|
+
|
|
341
|
+
LocalTensor<float> xSumTensor = xSumBuf_.Get<float>();
|
|
342
|
+
__local_mem__ float* xSumLocal = (__local_mem__ float*)xSumTensor.GetPhyAddr();
|
|
343
|
+
|
|
344
|
+
uint32_t tileA0Len = tilingData_->tileA0Len;
|
|
345
|
+
uint16_t curTileRLenVl = static_cast<uint16_t>(curTileRLen);
|
|
346
|
+
__VEC_SCOPE__
|
|
347
|
+
{
|
|
348
|
+
RegTensor<float> xReg;
|
|
349
|
+
RegTensor<float> yReg;
|
|
350
|
+
RegTensor<float> sumReg;
|
|
351
|
+
RegTensor<float> maxReg;
|
|
352
|
+
|
|
353
|
+
MaskReg pregMask;
|
|
354
|
+
uint32_t sreg = curTileA0Len;
|
|
355
|
+
|
|
356
|
+
for (uint16_t k = 0; k < loopA0Num; k++) {
|
|
357
|
+
pregMask = UpdateMask<float>(sreg);
|
|
358
|
+
DataCopy<float, LoadDist::DIST_NORM>(sumReg, (__local_mem__ float*)xSumLocal + k * VL_FP32);
|
|
359
|
+
DataCopy<float, LoadDist::DIST_NORM>(maxReg, (__local_mem__ float*)xMaxLocal + k * VL_FP32);
|
|
360
|
+
for (uint16_t i = 0; i < curTileRLenVl; i++) {
|
|
361
|
+
uint32_t xOffset = i * tileA0Len + k * VL_FP32;
|
|
362
|
+
LoadTensorForDtypeT1(xLocal, xReg, pregMask, xOffset);
|
|
363
|
+
|
|
364
|
+
Sub(xReg, xReg, maxReg, pregMask);
|
|
365
|
+
Exp(xReg, xReg, pregMask);
|
|
366
|
+
Div(yReg, xReg, sumReg, pregMask);
|
|
367
|
+
|
|
368
|
+
// copy out
|
|
369
|
+
if constexpr (IsSameType<T2, float>::value) {
|
|
370
|
+
DataCopy(((__local_mem__ float*)yLocal) + xOffset, yReg, pregMask);
|
|
371
|
+
} else { // fp16、bf16
|
|
372
|
+
RegTensor<T2> xFp16;
|
|
373
|
+
Cast<T2, float, castTraitFp32ToFp16>(xFp16, yReg, pregMask);
|
|
374
|
+
DataCopy<T2, StoreDist::DIST_PACK_B32>(((__local_mem__ T2*)yLocal) + xOffset, xFp16, pregMask);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
yQueue_.EnQue(y);
|
|
381
|
+
|
|
382
|
+
xQueue_.FreeTensor<T1>(x);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
__aicore__ inline void LoadTensorForDtypeT1(__local_mem__ T1* src, RegTensor<float>& dst, MaskReg& preg,
|
|
386
|
+
uint32_t offset)
|
|
387
|
+
{
|
|
388
|
+
if constexpr (IsSameType<T1, float>::value) {
|
|
389
|
+
DataCopy<float, LoadDist::DIST_NORM>(dst, (__local_mem__ float*)src + offset);
|
|
390
|
+
} else { // fp16、bf16
|
|
391
|
+
RegTensor<T1> xFp16;
|
|
392
|
+
DataCopy<T1, LoadDist::DIST_UNPACK_B16>(xFp16, ((__local_mem__ T1*)src + offset));
|
|
393
|
+
Cast<float, T1, castTraitFp16ToFp32>(dst, xFp16, preg);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
__aicore__ inline void CopyOutY(int64_t yGmOffset, int64_t curTileRLen, uint32_t curTileA0Len)
|
|
398
|
+
{
|
|
399
|
+
LocalTensor<T2> y = yQueue_.DeQue<T2>();
|
|
400
|
+
DataCopyExtParams copyInParams;
|
|
401
|
+
copyInParams.blockCount = curTileRLen;
|
|
402
|
+
copyInParams.blockLen = curTileA0Len * sizeof(T2);
|
|
403
|
+
copyInParams.srcStride = (tilingData_->tileA0Len - curTileA0Len) * sizeof(T2) / BLOCK_SIZE;
|
|
404
|
+
copyInParams.dstStride = (tilingData_->totalA0Len - curTileA0Len) * sizeof(T2);
|
|
405
|
+
DataCopyPad<T2, PaddingMode::Normal>(yGm_[yGmOffset], y, copyInParams);
|
|
406
|
+
yQueue_.FreeTensor(y);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
private:
|
|
410
|
+
const SoftmaxV2ARARecomputeTilingData* tilingData_;
|
|
411
|
+
|
|
412
|
+
TPipe* pipe_;
|
|
413
|
+
|
|
414
|
+
TQue<QuePosition::VECIN, BUFFER_DEPTH> xQueue_;
|
|
415
|
+
TQue<QuePosition::VECOUT, BUFFER_DEPTH> yQueue_;
|
|
416
|
+
|
|
417
|
+
TBuf<TPosition::VECCALC> xMaxBuf_;
|
|
418
|
+
TBuf<TPosition::VECCALC> xSumBuf_;
|
|
419
|
+
|
|
420
|
+
GlobalTensor<T2> yGm_;
|
|
421
|
+
GlobalTensor<T1> xGm_;
|
|
422
|
+
|
|
423
|
+
// bin add
|
|
424
|
+
TBuf<TPosition::VECCALC> cacheBuffer_;
|
|
425
|
+
TBuf<TPosition::VECCALC> tempBuffer_;
|
|
426
|
+
TBuf<TPosition::VECCALC> reduceSumTempBuffer_;
|
|
427
|
+
|
|
428
|
+
LocalTensor<float> tempTensor_;
|
|
429
|
+
LocalTensor<float> cacheTensor_;
|
|
430
|
+
LocalTensor<float> reduceSumTempTensor_;
|
|
431
|
+
|
|
432
|
+
LocalTensor<float> yMain_;
|
|
433
|
+
};
|
|
434
|
+
} // namespace SoftmaxV2Ops
|
|
435
|
+
|
|
436
|
+
#endif
|