已合并
fix:kernel统一称呼 #6001
fix:kernel统一称呼 #6001
已合并
maohp_hw创建于 4 天前
378 个文件变更+2766-736
@@ -70,7 +70,7 @@ $$
70 | srcShape | Input | Input shape information. |70 | srcShape | Input | Input shape information. |
71 | typeSize | Input | Operator input data type size, in bytes. For example, if operator input data type is half, pass 2 here. |71 | typeSize | Input | Operator input data type size, in bytes. For example, if operator input data type is half, pass 2 here. |
72 | isReuseSource | Input | Reserved parameter. |72 | isReuseSource | Input | Reserved parameter. |
73- | maxValue | Output | Maximum temporary space size required by Axpy interface to complete computation. Space exceeding this value will not be used by the interface. Within the minimum temporary space to maximum temporary space range, as temporary space increases, the computation performance of the kernel function interface will improve. To achieve better performance, developers can apply for space based on actual memory usage. Maximum space size of 0 indicates computation does not need temporary space. |73+ | maxValue | Output | Maximum temporary space size required by Axpy interface to complete computation. Space exceeding this value will not be used by the interface. Within the minimum temporary space to maximum temporary space range, as temporary space increases, the computation performance of the kernel function-side interface will improve. To achieve better performance, developers can apply for space based on actual memory usage. Maximum space size of 0 indicates computation does not need temporary space. |
74 | minValue | Output | Minimum temporary space size required by Axpy interface to complete computation. To ensure correct functionality, temporary space applied for during interface computation cannot be smaller than this value. Minimum space size of 0 indicates computation does not need temporary space. |74 | minValue | Output | Minimum temporary space size required by Axpy interface to complete computation. To ensure correct functionality, temporary space applied for during interface computation cannot be smaller than this value. Minimum space size of 0 indicates computation does not need temporary space. |
75 75 
76### Develop API76### Develop API
@@ -437,7 +437,7 @@ inQueueY.FreeTensor(yLocal);
437| SPMD vs SIMD vs SIMT | SPMD=programming model, SIMD=instruction execution mode, SIMT=thread execution mode | Hierarchy diagram |437| SPMD vs SIMD vs SIMT | SPMD=programming model, SIMD=instruction execution mode, SIMT=thread execution mode | Hierarchy diagram |
438| Four-step (Tiling→Transfer→Compute→Transfer) vs TPipe four steps (Alloc→EnQue→...) | Programming flow vs pipeline management paradigm | Comparison table |438| Four-step (Tiling→Transfer→Compute→Transfer) vs TPipe four steps (Alloc→EnQue→...) | Programming flow vs pipeline management paradigm | Comparison table |
439| DMA vs MTE vs DataCopy | Three-layer name for the same operation | Terminology mapping table |439| DMA vs MTE vs DataCopy | Three-layer name for the same operation | Terminology mapping table |
440-| MemBase (Basic API) vs RegBase (VF fusion API) | Different compute locations (UB vs register), different Load/Store counts | Comparison table + scenario recommendation |440+| MemBase (Basic API) vs RegBase (VF fusion API) | Different compute locations (Unified Buffer (UB) vs register), different Load/Store counts | Comparison table + scenario recommendation |
441| Block vs CTA | Ascend C programming unit vs CUDA equivalent concept | Competitive mapping table |441| Block vs CTA | Ascend C programming unit vs CUDA equivalent concept | Competitive mapping table |
442| `LocalTensor` vs `GlobalTensor` vs `TBuf` | Compute buffer / external buffer / temporary buffer | Comparison table + scenario recommendation |442| `LocalTensor` vs `GlobalTensor` vs `TBuf` | Compute buffer / external buffer / temporary buffer | Comparison table + scenario recommendation |
443| `__ubuf__` vs `__cbuf__` vs `__gm__` | UB space / L1 space / GM space address qualifiers | Comparison table |443| `__ubuf__` vs `__cbuf__` vs `__gm__` | UB space / L1 space / GM space address qualifiers | Comparison table |
@@ -635,9 +635,9 @@ A custom aclnn operator project usually requires three types of code.
635 635 
636The first type of code is the **operator prototype definition**, which declares operator interface information, including inputs, outputs, attributes, and supported dtype and format values.636The first type of code is the **operator prototype definition**, which declares operator interface information, including inputs, outputs, attributes, and supported dtype and format values.
637 637 
638-The second type of code is the **Host-side Tiling implementation**, which prepares runtime parameters before Kernel execution. Before the Kernel runs on the AI Core, it must know the total amount of input data, how to partition the computation across cores and how many Blocks to launch, how to continue partitioning within each Block, whether additional workspace is required, and whether launch configurations such as the scheduling mode must be set.638+The second type of code is the **Host-side Tiling implementation**, which prepares runtime parameters before kernel function execution. Before the kernel function runs on the AI Core, it must know the total amount of input data, how to partition the computation across cores and how many Blocks to launch, how to continue partitioning within each Block, whether additional workspace is required, and whether launch configurations such as the scheduling mode must be set.
639 639 
640-The third type of code is the **Kernel-side operator implementation**, which performs the actual computation on the AI Core. Based on the parameters passed by Tiling, the Kernel side transfers data from GM to UB, performs computation on UB, and writes the result back to GM.640+The third type of code is the **kernel function implementation**, which performs the actual computation on the AI Core. Based on the parameters passed by Tiling, the kernel function transfers data from GM to UB, performs computation on UB, and writes the result back to GM.
641 641 
642The functional design described in this document determines what each type of code must express before these three types of code are written.642The functional design described in this document determines what each type of code must express before these three types of code are written.
643```643```
@@ -673,7 +673,7 @@ The functional design described in this document determines what each type of co
673| Element count range | Specify the minimum value, maximum value, and alignment granularity | The "eight-element" constraint is undocumented |673| Element count range | Specify the minimum value, maximum value, and alignment granularity | The "eight-element" constraint is undocumented |
674| Format restrictions | Support for formats such as ND/NZ/FRACTAL | Differences in offset calculations when switching formats |674| Format restrictions | Support for formats such as ND/NZ/FRACTAL | Differences in offset calculations when switching formats |
675| Usage mode restrictions | Differences between direct-call/engineering/debug modes | PipeBarrier is available only in specific modes |675| Usage mode restrictions | Differences between direct-call/engineering/debug modes | PipeBarrier is available only in specific modes |
676-| Multi-core/multi-instance restrictions | Read-only semantics within the kernel and inter-core synchronization requirements | Read-only semantics of configuration parameters are not explained |676+| Multi-core/multi-instance restrictions | Read-only semantics within the kernel function and inter-core synchronization requirements | Read-only semantics of configuration parameters are not explained |
677| API combination restrictions | Mutually exclusive APIs/required companion APIs | A combination recommended by the documentation is not actually supported |677| API combination restrictions | Mutually exclusive APIs/required companion APIs | A combination recommended by the documentation is not actually supported |
678 678 
679**Operational requirement**: Extract constraint information from specifications and assertion code and present it centrally where the relevant item is first defined.679**Operational requirement**: Extract constraint information from specifications and assertion code and present it centrally where the relevant item is first defined.
@@ -30,7 +30,7 @@ On top of the underlying programming interface system, Ascend C further provides
30| **Operator Template Libraries (ATVC/ATVOSS/BLAZE, etc.)** | Algorithm developers | Provide high-performance template implementations of typical operators covering Vector, Cube and other computing paradigms, support template-based customized expansion, quickly adapt to high-performance computing requirements of business scenarios, and precipitate end-to-end performance optimization best practices |30| **Operator Template Libraries (ATVC/ATVOSS/BLAZE, etc.)** | Algorithm developers | Provide high-performance template implementations of typical operators covering Vector, Cube and other computing paradigms, support template-based customized expansion, quickly adapt to high-performance computing requirements of business scenarios, and precipitate end-to-end performance optimization best practices |
31| **High-Level API** | Algorithm developers | Encapsulate general single-core computing algorithm primitives such as Softmax and Matmul, shield underlying hardware implementation details, enable developers to quickly build algorithm logic, efficiently complete function verification and scheme prototyping, and shorten the cycle from idea to runnable operator |31| **High-Level API** | Algorithm developers | Encapsulate general single-core computing algorithm primitives such as Softmax and Matmul, shield underlying hardware implementation details, enable developers to quickly build algorithm logic, efficiently complete function verification and scheme prototyping, and shorten the cycle from idea to runnable operator |
32 32 
33-In addition, the joint ecosystem is continuously building foundational components such as **asc-stl** (C++ standard library for kernel programming) and **asc-mathdx**(on-device linear algebra library) to continuously enrich the Ascend C operator programming ecosystem.33+In addition, the joint ecosystem is continuously building foundational components such as **asc-stl** (C++ standard library for programming kernel functions) and **asc-mathdx** (on-device linear algebra library) to continuously enrich the Ascend C operator programming ecosystem.
34 34 
35---35---
36 36 
@@ -113,7 +113,7 @@ C++-level low-level programming interface for in-depth development of high-perfo
113- **Layout as First-Class Citizen Design**: Incorporates data layout (Layout) into the native attribute system of Tensor. Through unified layout abstraction and algebraic operation capabilities, it automatically simplifies memory index derivation and layout transformation logic, significantly reduces development complexity in complex data layout scenarios, and improves code maintainability.113- **Layout as First-Class Citizen Design**: Incorporates data layout (Layout) into the native attribute system of Tensor. Through unified layout abstraction and algebraic operation capabilities, it automatically simplifies memory index derivation and layout transformation logic, significantly reduces development complexity in complex data layout scenarios, and improves code maintainability.
114- **Zero-Cost Compilation Abstraction**: All layers from arch to algorithm are lightweight compilation encapsulations; no virtual functions, no dynamic memory allocation, and the runtime performance is completely equivalent to handwritten C code.114- **Zero-Cost Compilation Abstraction**: All layers from arch to algorithm are lightweight compilation encapsulations; no virtual functions, no dynamic memory allocation, and the runtime performance is completely equivalent to handwritten C code.
115- **Three-Layer Decoupling with Separation of Concerns**: Hardware instructions (arch), atomic layer (atom), and algorithm layer (algorithm) evolve independently; for new architectures, only changes in the arch layer are required, and code in the atom and algorithm layers barely needs modification.115- **Three-Layer Decoupling with Separation of Concerns**: Hardware instructions (arch), atomic layer (atom), and algorithm layer (algorithm) evolve independently; for new architectures, only changes in the arch layer are required, and code in the atom and algorithm layers barely needs modification.
116-- **Highly Composable Lego-Style Design**: Any atom can adapt to any algorithm, and any layout can be combined with any atom; kernels are built through modular building-block splicing, which greatly reduces kernel development costs.116+- **Highly Composable Lego-Style Design**: Any atom can adapt to any algorithm, and any layout can be combined with any atom; kernels are built through modular building-block splicing, which greatly reduces kernel function development costs.
117- **Native Architecture Portability**: User code is programmed against algorithm/atom interfaces, and hardware differences are shielded by arch layer specialization; it well supports cross-architecture and cross-chip code migration and reuse.117- **Native Architecture Portability**: User code is programmed against algorithm/atom interfaces, and hardware differences are shielded by arch layer specialization; it well supports cross-architecture and cross-chip code migration and reuse.
118 118 
119**Applicable Scenarios**119**Applicable Scenarios**
@@ -111,7 +111,7 @@ EngineType engine // Compute engine
111| `__in_pipe__(V)` | pipeline input annotation | `__aicore__ inline __in_pipe__(V) void Copy(...)` |111| `__in_pipe__(V)` | pipeline input annotation | `__aicore__ inline __in_pipe__(V) void Copy(...)` |
112| `__out_pipe__(V)` | pipeline output annotation | `__aicore__ inline __out_pipe__(MTE3) void Copy(...)` |112| `__out_pipe__(V)` | pipeline output annotation | `__aicore__ inline __out_pipe__(MTE3) void Copy(...)` |
113| `__BLOCK_LOCAL__ __inline__` | block-level thread-local variable | `__BLOCK_LOCAL__ __inline__ TPipe* g_tPipePtr` |113| `__BLOCK_LOCAL__ __inline__` | block-level thread-local variable | `__BLOCK_LOCAL__ __inline__ TPipe* g_tPipePtr` |
114-| `__ubuf__` | UB address space | `__ubuf__ half* dst` |114+| `__ubuf__` | Unified Buffer (UB) address space | `__ubuf__ half* dst` |
115 115 
116---116---
117 117 
@@ -57,7 +57,7 @@ assert(expr)
57## 约束说明<a name="section43265506459"></a>57## 约束说明<a name="section43265506459"></a>
58 58 
59- 该接口仅支持通过<<<...\>\>\>调用,并在异构编译场景使用。59- 该接口仅支持通过<<<...\>\>\>调用,并在异构编译场景使用。
60-- kernel开发不要包含系统的assert.h,会导致宏定义冲突。60+- 核函数(Kernel)开发不要包含系统的assert.h,会导致宏定义冲突。
61- assert接口调用形式与C语言一致,不需要使用AscendC命名空间。61- assert接口调用形式与C语言一致,不需要使用AscendC命名空间。
62 62 
63- 该接口使用Dump功能,所有使用Dump功能的接口在每个核上单次Dump的数据量不可超过1M。请开发者自行控制待打印的内容数据量,超出则不会打印。63- 该接口使用Dump功能,所有使用Dump功能的接口在每个核上单次Dump的数据量不可超过1M。请开发者自行控制待打印的内容数据量,超出则不会打印。
@@ -71,7 +71,7 @@ assert(expr)
71 71 
72## 调用示例<a name="section82241477610"></a>72## 调用示例<a name="section82241477610"></a>
73 73 
74-在算子kernel侧实现代码中需要增加断言的地方使用assert检查代码示例如下:74+在算子核函数(Kernel)侧实现代码中需要增加断言的地方使用assert检查代码示例如下:
75 75 
76```76```
77int assertFlag = 10;77int assertFlag = 10;
@@ -1,6 +1,6 @@
1# HCCL Context简介1# HCCL Context简介
2 2 
3-本章节的接口用于在kernel侧设置/获取通算融合算子每个通信域对应的context(消息区)地址。需要同步在host侧调用[HcclGroup](../../../../Utils-API/prototype_register_management/OpMC2Def/HcclGroup.md)接口配置通信域名称后,才可以调用[GetHcclContext](GetHcclContext.md)获取对应的context地址。3+本章节的接口用于在核函数(Kernel)侧设置/获取通算融合算子每个通信域对应的context(消息区)地址。需要同步在host侧调用[HcclGroup](../../../../Utils-API/prototype_register_management/OpMC2Def/HcclGroup.md)接口配置通信域名称后,才可以调用[GetHcclContext](GetHcclContext.md)获取对应的context地址。
4 4 
5> [!NOTE]说明5> [!NOTE]说明
6>本接口为试验接口,在后续版本中可能会调整或改进,不保证后续兼容性。请开发者在使用过程中关注后续版本更新。6>本接口为试验接口,在后续版本中可能会调整或改进,不保证后续兼容性。请开发者在使用过程中关注后续版本更新。
@@ -97,7 +97,7 @@ __aicore__ inline HcclHandle AllGather(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_
97 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);97 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);
98 98 
99 Hccl hccl;99 Hccl hccl;
100- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context100+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
101 101 
102 if (AscendC::g_coreType == AIV) { // 指定AIV核通信102 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
103 hccl.InitV2(contextGM, &tilingData);103 hccl.InitV2(contextGM, &tilingData);
@@ -139,7 +139,7 @@ __aicore__ inline HcclHandle AllGather(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_
139 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);139 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);
140 140 
141 Hccl hccl;141 Hccl hccl;
142- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context142+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
143 if (AscendC::g_coreType == AIV) { // 指定AIV核通信143 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
144 hccl.InitV2(contextGM, &tilingData);144 hccl.InitV2(contextGM, &tilingData);
145 auto ret = hccl.SetCcTilingV2(offsetof(AllGatherCustomTilingData, allGatherCcTiling));145 auto ret = hccl.SetCcTilingV2(offsetof(AllGatherCustomTilingData, allGatherCcTiling));
@@ -98,7 +98,7 @@ __aicore__ inline HcclHandle AllReduce(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_
98 GET_TILING_DATA_WITH_STRUCT(AllReduceCustomTilingData, tilingData, tilingGM);98 GET_TILING_DATA_WITH_STRUCT(AllReduceCustomTilingData, tilingData, tilingGM);
99 99 
100 Hccl hccl;100 Hccl hccl;
101- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context101+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
102 102 
103 if (AscendC::g_coreType == AIV) { // 指定AIV核通信103 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
104 hccl.InitV2(contextGM, &tilingData);104 hccl.InitV2(contextGM, &tilingData);
@@ -141,7 +141,7 @@ __aicore__ inline HcclHandle AllReduce(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_
141 GET_TILING_DATA_WITH_STRUCT(AllReduceCustomTilingData, tilingData, tilingGM);141 GET_TILING_DATA_WITH_STRUCT(AllReduceCustomTilingData, tilingData, tilingGM);
142 142 
143 Hccl hccl;143 Hccl hccl;
144- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context144+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
145 if (AscendC::g_coreType == AIV) { // 指定AIV核通信145 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
146 hccl.InitV2(contextGM, &tilingData);146 hccl.InitV2(contextGM, &tilingData);
147 auto ret = hccl.SetCcTilingV2(offsetof(AllReduceCustomTilingData, mc2CcTiling));147 auto ret = hccl.SetCcTilingV2(offsetof(AllReduceCustomTilingData, mc2CcTiling));
@@ -94,7 +94,7 @@ __aicore__ inline HcclHandle AlltoAll(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_t
94 GET_TILING_DATA_WITH_STRUCT(AllToAllCustomTilingData, tilingData, tilingGM);94 GET_TILING_DATA_WITH_STRUCT(AllToAllCustomTilingData, tilingData, tilingGM);
95 95 
96 Hccl hccl;96 Hccl hccl;
97- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context97+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
98 98 
99 if (AscendC::g_coreType == AIV) { // 指定AIV核通信99 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
100 hccl.InitV2(contextGM, &tilingData);100 hccl.InitV2(contextGM, &tilingData);
@@ -135,7 +135,7 @@ __aicore__ inline HcclHandle AlltoAll(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_t
135 GET_TILING_DATA_WITH_STRUCT(AllToAllCustomTilingData, tilingData, tilingGM);135 GET_TILING_DATA_WITH_STRUCT(AllToAllCustomTilingData, tilingData, tilingGM);
136 136 
137 Hccl hccl;137 Hccl hccl;
138- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context138+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
139 139 
140 if (AscendC::g_coreType == AIV) { // 指定AIV核通信140 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
141 hccl.InitV2(contextGM, &tilingData);141 hccl.InitV2(contextGM, &tilingData);
@@ -109,7 +109,7 @@ __aicore__ inline HcclHandle AlltoAllV(GM_ADDR sendBuf, void* sendCounts, void*
109 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);109 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);
110 110 
111 Hccl hccl;111 Hccl hccl;
112- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context112+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
113 113 
114 if (AscendC::g_coreType == AIV) { // 指定AIV核通信114 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
115 hccl.InitV2(contextGM, &tilingData);115 hccl.InitV2(contextGM, &tilingData);
@@ -149,7 +149,7 @@ __aicore__ inline HcclHandle AlltoAllV(GM_ADDR sendBuf, void* sendCounts, void*
149 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);149 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);
150 150 
151 Hccl hccl;151 Hccl hccl;
152- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context152+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
153 153 
154 if (AscendC::g_coreType == AIV) { // 指定AIV核通信154 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
155 hccl.InitV2(contextGM, &tilingData);155 hccl.InitV2(contextGM, &tilingData);
@@ -58,7 +58,7 @@ __aicore__ inline void Commit(HcclHandle handleId)
58REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体58REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体
59GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);59GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
60Hccl hccl;60Hccl hccl;
61-GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context61+GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
62hccl.InitV2(contextGM, &tilingData);62hccl.InitV2(contextGM, &tilingData);
63auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));63auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));
64if (ret != HCCL_SUCCESS) {64if (ret != HCCL_SUCCESS) {
@@ -57,7 +57,7 @@ __aicore__ inline void Finalize()
57REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体57REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体
58GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);58GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
59Hccl hccl;59Hccl hccl;
60-GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context60+GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
61hccl.InitV2(contextGM, &tilingData);61hccl.InitV2(contextGM, &tilingData);
62hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));62hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));
63if (AscendC::g_coreType == AIC) {63if (AscendC::g_coreType == AIC) {
@@ -55,7 +55,7 @@ __aicore__ inline GM_ADDR GetWindowsInAddr(uint32_t rankId)
55REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体55REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体
56GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);56GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
57Hccl hccl;57Hccl hccl;
58-GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context58+GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
59hccl.InitV2(contextGM, &tilingData);59hccl.InitV2(contextGM, &tilingData);
60 60 
61auto winInAddr = hccl.GetWindowsInAddr(0);61auto winInAddr = hccl.GetWindowsInAddr(0);
@@ -34,7 +34,7 @@ HCCL为**集合通信任务客户端**,主要对外提供了集合通信原语
34 AllGatherCustomTilingData, tilingData, tilingGM); // AllGatherCustomTilingData为对应算子头文件定义的结构体34 AllGatherCustomTilingData, tilingData, tilingGM); // AllGatherCustomTilingData为对应算子头文件定义的结构体
35 35 
36 Hccl<HcclServerType::HCCL_SERVER_TYPE_AICPU> hccl; // 通过模板入参的方式选择硬件类型36 Hccl<HcclServerType::HCCL_SERVER_TYPE_AICPU> hccl; // 通过模板入参的方式选择硬件类型
37- GM_ADDR contextGM = GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context37+ GM_ADDR contextGM = GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
38 38 
39 hccl.InitV2(contextGM, &tilingData);39 hccl.InitV2(contextGM, &tilingData);
40 ```40 ```
@@ -50,7 +50,7 @@ HCCL为**集合通信任务客户端**,主要对外提供了集合通信原语
50 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);50 GET_TILING_DATA_WITH_STRUCT(AllGatherCustomTilingData, tilingData, tilingGM);
51 51 
52 Hccl hccl;52 Hccl hccl;
53- GM_ADDR contextGM = GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context53+ GM_ADDR contextGM = GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
54 54 
55 hccl.InitV2(contextGM, &tilingData);55 hccl.InitV2(contextGM, &tilingData);
56 if (SetCcTilingV2(offsetof(AllGatherCustomTilingData, mc2CcTiling)) != HCCL_SUCCESS) {56 if (SetCcTilingV2(offsetof(AllGatherCustomTilingData, mc2CcTiling)) != HCCL_SUCCESS) {
@@ -177,7 +177,7 @@ extern "C" __global__ __aicore__ void reduce_scatter_custom(
177 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);177 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
178 178 
179 Hccl hccl;179 Hccl hccl;
180- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context180+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
181 if (AscendC::g_coreType == AIV) { // 指定AIV核通信181 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
182 hccl.InitV2(contextGM, &tilingData);182 hccl.InitV2(contextGM, &tilingData);
183 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));183 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));
@@ -220,7 +220,7 @@ extern "C" __global__ __aicore__ void reduce_scatter_custom(
220 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);220 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
221 221 
222 Hccl hccl;222 Hccl hccl;
223- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context223+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
224 if (AscendC::g_coreType == AIV) { // 指定AIV核通信224 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
225 hccl.InitV2(contextGM, &tilingData);225 hccl.InitV2(contextGM, &tilingData);
226 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));226 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));
@@ -89,7 +89,7 @@ extern "C" __global__ __aicore__ void alltoallv_custom(
89 HcclDataType dtype = HcclDataType::HCCL_DATA_TYPE_FP16;89 HcclDataType dtype = HcclDataType::HCCL_DATA_TYPE_FP16;
90 REGISTER_TILING_DEFAULT(AllToAllVCustomTilingData); // AllToAllVCustomTilingData为对应算子头文件定义的结构体90 REGISTER_TILING_DEFAULT(AllToAllVCustomTilingData); // AllToAllVCustomTilingData为对应算子头文件定义的结构体
91 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);91 GET_TILING_DATA_WITH_STRUCT(AllToAllVCustomTilingData, tilingData, tilingGM);
92- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context92+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
93 Hccl hccl;93 Hccl hccl;
94 hccl.InitV2(contextGM, &tilingData);94 hccl.InitV2(contextGM, &tilingData);
95 auto ret = hccl.SetCcTilingV2(offsetof(AllToAllVCustomTilingData, alltoallvCcTiling));95 auto ret = hccl.SetCcTilingV2(offsetof(AllToAllVCustomTilingData, alltoallvCcTiling));
@@ -58,7 +58,7 @@ __aicore__ inline int32_t Query(HcclHandle handleId)
58REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体58REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体
59GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);59GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
60Hccl hccl;60Hccl hccl;
61-GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context61+GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
62hccl.InitV2(contextGM, &tilingData);62hccl.InitV2(contextGM, &tilingData);
63auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));63auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, mc2CcTiling));
64if (ret != HCCL_SUCCESS) {64if (ret != HCCL_SUCCESS) {
@@ -103,7 +103,7 @@ __aicore__ inline HcclHandle ReduceScatter(GM_ADDR sendBuf, GM_ADDR recvBuf, uin
103 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);103 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
104 104 
105 Hccl hccl;105 Hccl hccl;
106- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context106+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
107 if (AscendC::g_coreType == AIV) { // 指定AIV核通信107 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
108 hccl.InitV2(contextGM, &tilingData);108 hccl.InitV2(contextGM, &tilingData);
109 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));109 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));
@@ -147,7 +147,7 @@ __aicore__ inline HcclHandle ReduceScatter(GM_ADDR sendBuf, GM_ADDR recvBuf, uin
147 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);147 GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
148 148 
149 Hccl hccl;149 Hccl hccl;
150- GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context150+ GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
151 if (AscendC::g_coreType == AIV) { // 指定AIV核通信151 if (AscendC::g_coreType == AIV) { // 指定AIV核通信
152 hccl.InitV2(contextGM, &tilingData);152 hccl.InitV2(contextGM, &tilingData);
153 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));153 auto ret = hccl.SetCcTilingV2(offsetof(ReduceScatterCustomTilingData, reduceScatterCcTiling));
@@ -59,7 +59,7 @@ __aicore__ inline int32_t Wait(HcclHandle handleId)
59REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体59REGISTER_TILING_DEFAULT(ReduceScatterCustomTilingData); // ReduceScatterCustomTilingData为对应算子头文件定义的结构体
60GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);60GET_TILING_DATA_WITH_STRUCT(ReduceScatterCustomTilingData, tilingData, tilingGM);
61Hccl hccl;61Hccl hccl;
62-GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子kernel中,通过此方式获取HCCL context62+GM_ADDR contextGM = AscendC::GetHcclContext<0>(); // AscendC自定义算子核函数(Kernel)中,通过此方式获取HCCL context
63__gm__ void* mc2InitTiling = (__gm__ void*)(&tiling->mc2InitTiling);63__gm__ void* mc2InitTiling = (__gm__ void*)(&tiling->mc2InitTiling);
64__gm__ void* mc2CcTiling = (__gm__ void*)(&(tiling->mc2CcTiling));64__gm__ void* mc2CcTiling = (__gm__ void*)(&(tiling->mc2CcTiling));
65hccl.InitV2(contextGM, &tilingData);65hccl.InitV2(contextGM, &tilingData);
@@ -95,13 +95,13 @@ OP_ADD(AlltoallvDoubleCommCustom);
95 95 
96如下为该自定义算子Tiling Data声明和实现。96如下为该自定义算子Tiling Data声明和实现。
97 97 
98-该自定义算子Tiling Data的声明中:首先定义version字段,设置为2,表明为v2版本的通信算子Tiling结构体。其次,定义mc2HcommCnt字段,本例AlltoallvDoubleCommCustom算子的kernel实现中,共2个AlltoAllV通信任务,该参数取值为2。然后定义server通用参数配置,Mc2ServerCfg。最后,定义2个Mc2HcommCfg结构体,表示各通信域中的每个通信任务参数配置。98+该自定义算子Tiling Data的声明中:首先定义version字段,设置为2,表明为v2版本的通信算子Tiling结构体。其次,定义mc2HcommCnt字段,本例AlltoallvDoubleCommCustom算子的核函数(Kernel)实现中,共2个AlltoAllV通信任务,该参数取值为2。然后定义server通用参数配置,Mc2ServerCfg。最后,定义2个Mc2HcommCfg结构体,表示各通信域中的每个通信任务参数配置。
99 99 
100```100```
101// HCCL TilingData声明101// HCCL TilingData声明
102BEGIN_TILING_DATA_DEF(AlltoallvDoubleCommCustomTilingData)102BEGIN_TILING_DATA_DEF(AlltoallvDoubleCommCustomTilingData)
103 TILING_DATA_FIELD_DEF(uint32_t, version); // HCCL tiling结构体的版本,设为2103 TILING_DATA_FIELD_DEF(uint32_t, version); // HCCL tiling结构体的版本,设为2
104- // 各通信域中的通信算子总个数,当前最多支持3个。AlltoallvDoubleCommCustom算子kernel实现中每个通信域中均用了1个AlltoAllV,因此设为2104+ // 各通信域中的通信算子总个数,当前最多支持3个。AlltoallvDoubleCommCustom算子核函数(Kernel)实现中每个通信域中均用了1个AlltoAllV,因此设为2
105 TILING_DATA_FIELD_DEF(uint32_t, mc2HcommCnt);105 TILING_DATA_FIELD_DEF(uint32_t, mc2HcommCnt);
106 TILING_DATA_FIELD_DEF_STRUCT(Mc2ServerCfg, serverCfg); // server通用参数配置,融合算子级106 TILING_DATA_FIELD_DEF_STRUCT(Mc2ServerCfg, serverCfg); // server通用参数配置,融合算子级
107 // 各通信域中的每个通信任务参数配置,算子级,共有mc2HcommCnt个Mc2HcommCfg107 // 各通信域中的每个通信任务参数配置,算子级,共有mc2HcommCnt个Mc2HcommCfg
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧GeGLU接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧GeGLU接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,8 +21,8 @@ void GetGeGLUMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |24+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
25-| maxValue | 输出 | GeGLU接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | GeGLU接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
A
Aai_xin4 天前

此条代码评论区间+24+25

一个md中第一处说明了核函数(Kernel),后面的每一处不必都重复冗余说明吧

likedislike
maohp_hw
maohp_hw
4 天前 评论:
26| minValue | 输出 | GeGLU接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | GeGLU接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧GeGLU接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧GeGLU接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuf**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuf**
8 8 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Gelu、FasterGelu、FasterGeluV2接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Gelu、FasterGelu、FasterGeluV2接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -35,14 +35,14 @@ kernel侧Gelu、FasterGelu、FasterGeluV2接口的计算需要开发者预留/
35| --- | --- | --- |35| --- | --- | --- |
36| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |36| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
37| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |37| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
38-| maxValue | 输出 | Gelu、FasterGelu、FasterGeluV2接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |38+| maxValue | 输出 | Gelu、FasterGelu、FasterGeluV2接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
39| minValue | 输出 | Gelu、FasterGelu、FasterGeluV2接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |39| minValue | 输出 | Gelu、FasterGelu、FasterGeluV2接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
40 40 
41## 返回值说明41## 返回值说明
42 42 
43-**GetGeluMaxTmpSize**返回kernel侧接口能完成计算所需最大临时空间大小。43+**GetGeluMaxTmpSize**返回核函数(Kernel)侧接口能完成计算所需最大临时空间大小。
44 44 
45-**GetGeluMinTmpSize**返回kernel侧接口能完成计算所需最小临时空间大小。45+**GetGeluMinTmpSize**返回核函数(Kernel)侧接口能完成计算所需最小临时空间大小。
46 46 
47**GetGeluMaxMinTmpSize**无返回值。47**GetGeluMaxMinTmpSize**无返回值。
48 48 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧LogSoftMax接口的计算需要开发者预留/申请临时空间,以下接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小,并调用LogSoftMaxTilingFunc函数获取reduceSize,splitSize等参数,作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧LogSoftMax接口的计算需要开发者预留/申请临时空间,以下接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小,并调用LogSoftMaxTilingFunc函数获取reduceSize,splitSize等参数,作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -46,7 +46,7 @@ kernel侧LogSoftMax接口的计算需要开发者预留/申请临时空间,以
46| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |46| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
47| dataTypeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |47| dataTypeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
48| localWorkSpaceSize | 输入 | 输入的临时空间大小。 |48| localWorkSpaceSize | 输入 | 输入的临时空间大小。 |
49-| softmaxTiling | 输出 | 传递到kernel侧使用的Tiling参数。 |49+| softmaxTiling | 输出 | 传递到核函数(Kernel)侧使用的Tiling参数。 |
50 50 
51## 返回值说明51## 返回值说明
52 52 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReGlu接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReGlu接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,8 +21,8 @@ void GetReGluMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |24+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
25-| maxValue | 输出 | ReGlu接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | ReGlu接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | ReGlu接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | ReGlu接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Sigmoid接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Sigmoid接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetSigmoidMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sigmoid接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sigmoid接口一致。 |
25-| maxValue | 输出 | Sigmoid接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Sigmoid接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Sigmoid接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Sigmoid接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -18,8 +18,8 @@ inline void GetSiluTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
18| --- | --- | --- |18| --- | --- | --- |
19| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |19| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
20| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2,即sizeof(half)。 |20| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2,即sizeof(half)。 |
21-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |21+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
22-| maxValue | 输出 | Silu接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |22+| maxValue | 输出 | Silu接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
23| minValue | 输出 | Silu接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |23| minValue | 输出 | Silu接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
24 24 
25## 返回值说明25## 返回值说明
@@ -102,7 +102,7 @@ def simple_softmax(src, max, sum):
102| isReuseSource | 该参数预留,传入默认值false即可。 |102| isReuseSource | 该参数预留,传入默认值false即可。 |
103| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以设置为true开启该参数用于提升性能,默认为false表示不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br><br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id7 --><br><br>针对Atlas 200/500 A2推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id7 --> |103| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以设置为true开启该参数用于提升性能,默认为false表示不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br><br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id7 --><br><br>针对Atlas 200/500 A2推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id7 --> |
104| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id8 --><br><br>针对Atlas 200/500 A2推理产品,不支持配置为NZ格式。<!-- end id8 --> |104| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id8 --><br><br>针对Atlas 200/500 A2推理产品,不支持配置为NZ格式。<!-- end id8 --> |
105-| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br><br>此参数一般用于配合kernel侧tiling计算的接口使用。<br><br>注意:config参数生效的优先级低于模板参数isBasicBlock,即开启isBasicBlock参数时,接口内部做基本块的切分优化,config参数的shape常量化不生效。<!-- npu="950" id9 --><br><br>Ascend 950PR/Ascend 950DT,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id9 --><!-- npu="A3" id10 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数。<!-- end id10 --><!-- npu="910b" id11 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数。<!-- end id11 --><!-- npu="310p" id12 --><br><br>Atlas 推理系列产品AI Core,支持该参数。<!-- end id12 --><!-- npu="310b" id13 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id13 --> |105+| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br><br>此参数一般用于配合核函数(Kernel)侧tiling计算的接口使用。<br><br>注意:config参数生效的优先级低于模板参数isBasicBlock,即开启isBasicBlock参数时,接口内部做基本块的切分优化,config参数的shape常量化不生效。<!-- npu="950" id9 --><br><br>Ascend 950PR/Ascend 950DT,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id9 --><!-- npu="A3" id10 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数。<!-- end id10 --><!-- npu="910b" id11 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数。<!-- end id11 --><!-- npu="310p" id12 --><br><br>Atlas 推理系列产品AI Core,支持该参数。<!-- end id12 --><!-- npu="310b" id13 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id13 --> |
106 106 
107```107```
108struct SoftmaxConfig {108struct SoftmaxConfig {
@@ -37,7 +37,7 @@
37| --- | --- | --- |37| --- | --- | --- |
38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
39| dataTypeSize | 输入 | 参与计算的max和sum的数据类型,比如half=2。 |39| dataTypeSize | 输入 | 参与计算的max和sum的数据类型,比如half=2。 |
40-| isReuseSource | 输入 | 与kernel侧接口配置保持一致。 |40+| isReuseSource | 输入 | 与核函数(Kernel)侧接口配置保持一致。 |
41 41 
42**表2** SoftMax/SimpleSoftMax SoftMaxTilingFunc接口参数列表42**表2** SoftMax/SimpleSoftMax SoftMaxTilingFunc接口参数列表
43 43 
@@ -138,7 +138,7 @@ def softmax(src):
138| isReuseSource | 该参数预留,传入默认值false即可。 |138| isReuseSource | 该参数预留,传入默认值false即可。 |
139| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以开启该参数用于提升性能,默认不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id11 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id11 --> |139| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以开启该参数用于提升性能,默认不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id11 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id11 --> |
140| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id12 --><br><br>针对Atlas 200I/500 A2 推理产品,不支持配置为NZ格式。<!-- end id12 --> |140| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id12 --><br><br>针对Atlas 200I/500 A2 推理产品,不支持配置为NZ格式。<!-- end id12 --> |
141-| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>mode:预留参数。<br><br>此参数一般用于配合kernel侧tiling计算的接口使用。<br><br>注意:设置了oriSrcM与oriSrcK后,模板参数isBasicBlock不生效,计算数据是否为基本块由API内部判断并处理。<!-- npu="950" id13 --><br><br>Ascend 950PR/Ascend 950DT,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id13 --><!-- npu="A3" id14 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数,不支持配置mode。<!-- end id14 --><!-- npu="910b" id15 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数,不支持配置mode。<!-- end id15 --><!-- npu="310p" id16 --><br><br>针对Atlas 推理系列产品AI Core,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id16 --><!-- npu="310b" id17 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id17 --><!-- npu="x90" id3 --><br><br>针对Kirin X90,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id3 --><!-- npu="9030" id4 --><br><br>针对Kirin 9030,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id4 --> |141+| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>mode:预留参数。<br><br>此参数一般用于配合核函数(Kernel)侧tiling计算的接口使用。<br><br>注意:设置了oriSrcM与oriSrcK后,模板参数isBasicBlock不生效,计算数据是否为基本块由API内部判断并处理。<!-- npu="950" id13 --><br><br>Ascend 950PR/Ascend 950DT,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id13 --><!-- npu="A3" id14 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数,不支持配置mode。<!-- end id14 --><!-- npu="910b" id15 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数,不支持配置mode。<!-- end id15 --><!-- npu="310p" id16 --><br><br>针对Atlas 推理系列产品AI Core,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id16 --><!-- npu="310b" id17 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id17 --><!-- npu="x90" id3 --><br><br>针对Kirin X90,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id3 --><!-- npu="9030" id4 --><br><br>针对Kirin 9030,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id4 --> |
142 142 
143```143```
144enum class SoftmaxMode {144enum class SoftmaxMode {
@@ -1,13 +1,13 @@
1# SoftMax Tiling使用说明1# SoftMax Tiling使用说明
2 2 
3-Ascend C提供一组SoftMax Tiling API,方便用户获取SoftMax kernel计算时所需的Tiling参数。3+Ascend C提供一组SoftMax Tiling API,方便用户获取SoftMax核函数(Kernel)计算时所需的Tiling参数。
4 4 
5获取Tiling参数主要分为如下两步:5获取Tiling参数主要分为如下两步:
6 6 
71. 获取SoftMax接口计算所需最小和最大临时空间大小,注意该步骤不是必须的,只是作为一个参考,供合理分配计算空间。71. 获取SoftMax接口计算所需最小和最大临时空间大小,注意该步骤不是必须的,只是作为一个参考,供合理分配计算空间。
8-2. 获取输入SoftMax kernel侧接口所需tiling参数,需要传入[AscendC::TensorShape](../../data_structures/TensorShape.md)类型的输入shape、剩余的可供softmax接口计算的空间大小和计算的数据类型大小。8+2. 获取输入SoftMax核函数(Kernel)侧接口所需tiling参数,需要传入[AscendC::TensorShape](../../data_structures/TensorShape.md)类型的输入shape、剩余的可供softmax接口计算的空间大小和计算的数据类型大小。
9 9 
10- SoftMax Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入SoftMax高阶API接口,直接进行使用即可。10+ SoftMax Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入SoftMax高阶API接口,直接进行使用即可。
11 11 
12 ```12 ```
13 struct SoftMaxTiling {13 struct SoftMaxTiling {
@@ -42,7 +42,7 @@ Ascend C提供一组SoftMax Tiling API,方便用户获取SoftMax kernel计算
42 42 
43## 调用示例43## 调用示例
44 44 
45-如下样例介绍了使用SoftMax高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[320,64\],输入的数据类型为half。45+如下样例介绍了使用SoftMax高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[320,64\],输入的数据类型为half。
46 46 
471. 将SoftMaxTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。471. 将SoftMaxTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
48 48 
@@ -55,7 +55,7 @@ Ascend C提供一组SoftMax Tiling API,方便用户获取SoftMax kernel计算
55 END_TILING_DATA_DEF;55 END_TILING_DATA_DEF;
56 ```56 ```
57 57 
58-2. Tiling实现函数中,首先调用**GetSoftMaxMaxTmpSize/GetSoftMaxMinTmpSize**接口获取SoftMax接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取SoftMax kernel侧接口所需tiling参数。58+2. Tiling实现函数中,首先调用**GetSoftMaxMaxTmpSize/GetSoftMaxMinTmpSize**接口获取SoftMax接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取SoftMax核函数(Kernel)侧接口所需tiling参数。
59 59 
60 ```60 ```
61 namespace optiling {61 namespace optiling {
@@ -85,7 +85,7 @@ Ascend C提供一组SoftMax Tiling API,方便用户获取SoftMax kernel计算
85 } // namespace optiling85 } // namespace optiling
86 ```86 ```
87 87 
88-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的SoftMax Tiling信息传入SoftMax接口参与计算。完整的kernel侧样例请参考[调用示例](SoftMax.md#调用示例)。88+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的SoftMax Tiling信息传入SoftMax接口参与计算。完整的核函数(Kernel)侧样例请参考[调用示例](SoftMax.md#调用示例)。
89 89 
90 ```90 ```
91 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)91 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -162,9 +162,9 @@ def softmax_flash_2(src, inmax=None, insum=None, update=None):
162 162 
163接口框架申请的方式,开发者需要预留临时空间;通过sharedTmpBuffer传入的情况,开发者需要为tensor申请空间。临时空间大小BufferSize的获取方式如下:通过[SoftmaxFlashV2 Tiling接口](SoftmaxFlashV2_Tiling_interface.md)中提供的GetSoftMaxFlashV2MinTmpSize/GetSoftMaxFlashV2MaxTmpSize接口获取所需最小和最大临时空间大小,最小空间可以保证功能正确,最大空间用于提升性能。163接口框架申请的方式,开发者需要预留临时空间;通过sharedTmpBuffer传入的情况,开发者需要为tensor申请空间。临时空间大小BufferSize的获取方式如下:通过[SoftmaxFlashV2 Tiling接口](SoftmaxFlashV2_Tiling_interface.md)中提供的GetSoftMaxFlashV2MinTmpSize/GetSoftMaxFlashV2MaxTmpSize接口获取所需最小和最大临时空间大小,最小空间可以保证功能正确,最大空间用于提升性能。
164 164 
165-另外提供了一个kernel侧tiling计算的接口,当kernel侧的输入shape与通过host侧TilingData传入的shape不一致时,可使用该接口在kernel侧重新计算tiling。该接口的参数含义请参考[SoftmaxFlashV2 Tiling接口](SoftmaxFlashV2_Tiling_interface.md)。165+另外提供了一个核函数(Kernel)侧tiling计算的接口,当核函数(Kernel)侧的输入shape与通过host侧TilingData传入的shape不一致时,可使用该接口在核函数(Kernel)侧重新计算tiling。该接口的参数含义请参考[SoftmaxFlashV2 Tiling接口](SoftmaxFlashV2_Tiling_interface.md)。
166 166 
167-- **kernel侧tiling计算接口**167+- **核函数(Kernel)侧tiling计算接口**
168 168 
169 ```169 ```
170 __aicore__ inline constexpr SoftMaxTiling SoftMaxFlashV2TilingFunc(const SoftMaxShapeInfo& shapeInfo, const uint32_t dataTypeSize1, const uint32_t dataTypeSize2, const uint32_t localWorkSpaceSize, const bool isUpdate = false, const bool isBasicBlock = false, const bool isDataFormatNZ = false, const bool isFlashOutputBrc = false)170 __aicore__ inline constexpr SoftMaxTiling SoftMaxFlashV2TilingFunc(const SoftMaxShapeInfo& shapeInfo, const uint32_t dataTypeSize1, const uint32_t dataTypeSize2, const uint32_t localWorkSpaceSize, const bool isUpdate = false, const bool isBasicBlock = false, const bool isDataFormatNZ = false, const bool isFlashOutputBrc = false)
@@ -181,7 +181,7 @@ def softmax_flash_2(src, inmax=None, insum=None, update=None):
181| isReuseSource | 该参数预留,传入默认值false即可。 |181| isReuseSource | 该参数预留,传入默认值false即可。 |
182| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以设置为true开启该参数用于提升性能,默认为false表示不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br><br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id15 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id15 --> |182| isBasicBlock | srcTensor和dstTensor的shape信息和Tiling切分策略满足基本块要求的情况下,可以设置为true开启该参数用于提升性能,默认为false表示不开启。是否满足基本块的要求,可以采用如下两种方式之一判断:<br>srcTensor和dstTensor的shape信息[m,n]需要满足如下条件:尾轴长度n小于2048并且大于等于256/sizeof(T)(即half场景下n最小为128,float场景下n最小为64),同时n是64的倍数;非尾轴长度的乘积m为8的倍数。<br><br>在Tiling实现中,通过调用[IsBasicBlockInSoftMax](IsBasicBlockInSoftMax.md)判断Tiling切分策略是否满足基本块的切分要求。<!-- npu="310b" id15 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,为后续的功能扩展做保留,保持默认值即可。<!-- end id15 --> |
183| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id16 --><br><br>针对Atlas 200I/500 A2 推理产品,不支持配置为NZ格式。<!-- end id16 --> |183| isDataFormatNZ | 当前输入输出的数据格式是否为NZ格式,默认数据格式为ND,即默认取值为false。<!-- npu="310b" id16 --><br><br>针对Atlas 200I/500 A2 推理产品,不支持配置为NZ格式。<!-- end id16 --> |
184-| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>mode:输出shape的处理模式。当输入输出的数据格式为NZ格式时,不支持配置mode参数。SoftmaxMode类型,取值如下:<br>SOFTMAX_NORMAL :默认值,常规模式,对输出数据做Broadcast,使得输出shape由(m, 1)拓展成(m, 8)(输出为float数据类型)或者(m, 16)(输出为half数据类型)。<br>SOFTMAX_OUTPUT_WITHOUT_BRC :非拓展模式,不对输出数据做Broadcast,输出shape均为(m, 1),相应的输入参数(例如inExpSumTensor、inMaxTensor),shape也均为(m, 1)。<br><br>此参数一般用于配合kernel侧tiling计算的接口使用。<br><br>注意:设置了oriSrcM与oriSrcK后,模板参数isBasicBlock不生效,计算数据是否为基本块由API内部判断并处理。<!-- npu="950" id17 --><br><br>针对Ascend 950PR/Ascend 950DT,支持该参数。<!-- end id17 --><!-- npu="A3" id18 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数。<!-- end id18 --><!-- npu="910b" id19 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数。<!-- end id19 --><!-- npu="310b" id20 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id20 --><!-- npu="310p" id21 --><br><br>Atlas 推理系列产品AI Core,支持该参数,不支持配置mode。<!-- end id21 --><!-- npu="x90" id3 --><br><br>针对Kirin X90,支持该参数。<!-- end id3 --><!-- npu="9030" id4 --><br><br>针对Kirin 9030,支持该参数。<!-- end id4 --> |184+| config | 结构体模板参数,此参数可选配,SoftmaxConfig类型,具体定义如下方代码所示,其中参数的含义为:<br>isCheckTiling:是否需要检查shape和tiling的一致性;若不一致,API内会根据shape重新计算所需tiling。默认取值true:API内部会检查一致性。<br>oriSrcM:原始非尾轴长度的乘积。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>oriSrcK:原始尾轴长度。设置该参数后,将shape常量化,编译过程中使用常量化的shape。<br>mode:输出shape的处理模式。当输入输出的数据格式为NZ格式时,不支持配置mode参数。SoftmaxMode类型,取值如下:<br>SOFTMAX_NORMAL :默认值,常规模式,对输出数据做Broadcast,使得输出shape由(m, 1)拓展成(m, 8)(输出为float数据类型)或者(m, 16)(输出为half数据类型)。<br>SOFTMAX_OUTPUT_WITHOUT_BRC :非拓展模式,不对输出数据做Broadcast,输出shape均为(m, 1),相应的输入参数(例如inExpSumTensor、inMaxTensor),shape也均为(m, 1)。<br><br>此参数一般用于配合核函数(Kernel)侧tiling计算的接口使用。<br><br>注意:设置了oriSrcM与oriSrcK后,模板参数isBasicBlock不生效,计算数据是否为基本块由API内部判断并处理。<!-- npu="950" id17 --><br><br>针对Ascend 950PR/Ascend 950DT,支持该参数。<!-- end id17 --><!-- npu="A3" id18 --><br><br>Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持该参数。<!-- end id18 --><!-- npu="910b" id19 --><br><br>Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持该参数。<!-- end id19 --><!-- npu="310b" id20 --><br><br>针对Atlas 200I/500 A2 推理产品,该参数为预留参数,暂未启用,保持默认值即可。<!-- end id20 --><!-- npu="310p" id21 --><br><br>Atlas 推理系列产品AI Core,支持该参数,不支持配置mode。<!-- end id21 --><!-- npu="x90" id3 --><br><br>针对Kirin X90,支持该参数。<!-- end id3 --><!-- npu="9030" id4 --><br><br>针对Kirin 9030,支持该参数。<!-- end id4 --> |
185 185 
186```186```
187struct SoftmaxConfig {187struct SoftmaxConfig {
@@ -38,8 +38,8 @@
38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
39| dataTypeSize1 | 输入 | 计算的源数据的数据类型大小,比如half=2。 |39| dataTypeSize1 | 输入 | 计算的源数据的数据类型大小,比如half=2。 |
40| dataTypeSize2 | 输入 | 参与计算的expSumTensor和maxTensor的数据类型大小,比如half=2。 |40| dataTypeSize2 | 输入 | 参与计算的expSumTensor和maxTensor的数据类型大小,比如half=2。 |
41-| isUpdate | 输入 | 是否开启刷新功能,和kernel侧SoftmaxFlashV2接口一致。 |41+| isUpdate | 输入 | 是否开启刷新功能,和核函数(Kernel)侧SoftmaxFlashV2接口一致。 |
42-| isBasicBlock | 输入 | 是否要开启基本块计算。isBasicBlock参数可以通过[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)接口获取,与kernel侧接口的模板参数保持一致,默认false。注意,若kernel侧API启用模板参数SoftmaxConfig,即shape常量化场景,isBasicBlock参数必须通过接口[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)获取。 |42+| isBasicBlock | 输入 | 是否要开启基本块计算。isBasicBlock参数可以通过[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)接口获取,与核函数(Kernel)侧接口的模板参数保持一致,默认false。注意,若核函数(Kernel)侧API启用模板参数SoftmaxConfig,即shape常量化场景,isBasicBlock参数必须通过接口[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)获取。 |
43| isFlashOutputBrc | 输入 | 是否开启输出shape的非拓展模式。非拓展模式为不对输出数据做Broadcast,输出shape为(m, 1)。参数取值如下:<br>false:不开启非拓展模式,默认值。输出为float数据类型时,shape为(m,8);输出为half数据类型时,shape为(m, 16)。<br>true:开启非拓展模式,输出的shape均为(m, 1)。该参数取值为true时,[kernel接口](SoftmaxFlashV2.md)的模板参数SoftmaxConfig中的mode必须配置为SoftmaxMode::SOFTMAX_OUTPUT_WITHOUT_BRC。 |43| isFlashOutputBrc | 输入 | 是否开启输出shape的非拓展模式。非拓展模式为不对输出数据做Broadcast,输出shape为(m, 1)。参数取值如下:<br>false:不开启非拓展模式,默认值。输出为float数据类型时,shape为(m,8);输出为half数据类型时,shape为(m, 16)。<br>true:开启非拓展模式,输出的shape均为(m, 1)。该参数取值为true时,[kernel接口](SoftmaxFlashV2.md)的模板参数SoftmaxConfig中的mode必须配置为SoftmaxMode::SOFTMAX_OUTPUT_WITHOUT_BRC。 |
44 44 
45**表2** SoftMaxFlashV2TilingFunc接口参数列表45**表2** SoftMaxFlashV2TilingFunc接口参数列表
@@ -50,8 +50,8 @@
50| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxFlashV2接口计算的空间大小。localWorkSpaceSize的取值必须大于GetSoftMaxFlashV2MinTmpSize接口返回的计算所需的最小临时空间大小。 |50| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxFlashV2接口计算的空间大小。localWorkSpaceSize的取值必须大于GetSoftMaxFlashV2MinTmpSize接口返回的计算所需的最小临时空间大小。 |
51| dataTypeSize1 | 输入 | 计算的源数据的数据类型,比如half=2。 |51| dataTypeSize1 | 输入 | 计算的源数据的数据类型,比如half=2。 |
52| dataTypeSize2 | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |52| dataTypeSize2 | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |
53-| isUpdate | 输入 | 是否开启刷新功能,和kernel侧SoftmaxFlashV2接口一致。 |53+| isUpdate | 输入 | 是否开启刷新功能,和核函数(Kernel)侧SoftmaxFlashV2接口一致。 |
54-| isBasicBlock | 输入 | 是否要开启基本块计算。isBasicBlock参数可以通过[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)接口获取,与kernel侧接口的模板参数保持一致,默认false。注意,若kernel侧API启用模板参数SoftmaxConfig,即shape常量化场景,isBasicBlock参数必须通过接口[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)获取。 |54+| isBasicBlock | 输入 | 是否要开启基本块计算。isBasicBlock参数可以通过[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)接口获取,与核函数(Kernel)侧接口的模板参数保持一致,默认false。注意,若核函数(Kernel)侧API启用模板参数SoftmaxConfig,即shape常量化场景,isBasicBlock参数必须通过接口[isBasicBlockInSoftmax](IsBasicBlockInSoftMax.md)获取。 |
55| isFlashOutputBrc | 输入 | 是否开启输出shape的非拓展模式。非拓展模式为不对输出数据做Broadcast,输出shape为(m, 1)。参数取值如下:<br>false:不开启非拓展模式,默认值。输出为float数据类型时,shape为(m,8);输出为half数据类型时,shape为(m, 16)。<br>true:开启非拓展模式,输出的shape均为(m, 1)。该参数取值为true时,[kernel接口](SoftmaxFlashV2.md)的模板参数SoftmaxConfig中的mode必须配置为SoftmaxMode::SOFTMAX_OUTPUT_WITHOUT_BRC。 |55| isFlashOutputBrc | 输入 | 是否开启输出shape的非拓展模式。非拓展模式为不对输出数据做Broadcast,输出shape为(m, 1)。参数取值如下:<br>false:不开启非拓展模式,默认值。输出为float数据类型时,shape为(m,8);输出为half数据类型时,shape为(m, 16)。<br>true:开启非拓展模式,输出的shape均为(m, 1)。该参数取值为true时,[kernel接口](SoftmaxFlashV2.md)的模板参数SoftmaxConfig中的mode必须配置为SoftmaxMode::SOFTMAX_OUTPUT_WITHOUT_BRC。 |
56| softmaxFlashTiling | 输出 | 输出SoftmaxFlashV2接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |56| softmaxFlashTiling | 输出 | 输出SoftmaxFlashV2接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |
57 57 
@@ -34,7 +34,7 @@
34| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |34| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
35| dataTypeSize1 | 输入 | 输入srcTensor的数据类型大小,即对应SoftMaxFlashV3核函数(Kernel)中模板参数T的数据类型大小。当前模板参数T仅支持half类型,故此参数只支持取值为2。 |35| dataTypeSize1 | 输入 | 输入srcTensor的数据类型大小,即对应SoftMaxFlashV3核函数(Kernel)中模板参数T的数据类型大小。当前模板参数T仅支持half类型,故此参数只支持取值为2。 |
36| dataTypeSize2 | 输入 | 输入inMeanTensor、inExpSumTensor、inMaxTensor的数据类型大小,即对应SoftMaxFlashV3核函数(Kernel)中模板参数U的数据类型大小。当前模板参数U仅支持float类型,故此参数只支持取值为4。 |36| dataTypeSize2 | 输入 | 输入inMeanTensor、inExpSumTensor、inMaxTensor的数据类型大小,即对应SoftMaxFlashV3核函数(Kernel)中模板参数U的数据类型大小。当前模板参数U仅支持float类型,故此参数只支持取值为4。 |
37-| maxValue | 输出 | SoftMaxFlashV3接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |37+| maxValue | 输出 | SoftMaxFlashV3接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
38| minValue | 输出 | SoftMaxFlashV3接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |38| minValue | 输出 | SoftMaxFlashV3接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
39| isUpdate | 输入 | 是否开启SoftMaxFlashV3 update为true的公式计算。该参数取值与SoftmaxFlashV3核函数(Kernel)接口的模板参数isUpdate保持一致。 |39| isUpdate | 输入 | 是否开启SoftMaxFlashV3 update为true的公式计算。该参数取值与SoftmaxFlashV3核函数(Kernel)接口的模板参数isUpdate保持一致。 |
40| isBasicBlock | 输入 | 预留参数,暂未启用,必须使用默认值false。 |40| isBasicBlock | 输入 | 预留参数,暂未启用,必须使用默认值false。 |
@@ -39,8 +39,8 @@
39| --- | --- | --- |39| --- | --- | --- |
40| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |40| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
41| dataTypeSize | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |41| dataTypeSize | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |
42-| isUpdate | 输入 | 是否开启刷新功能,和kernel侧SoftmaxFlash接口一致,默认false。 |42+| isUpdate | 输入 | 是否开启刷新功能,和核函数(Kernel)侧SoftmaxFlash接口一致,默认false。 |
43-| isReuseSource | 输入 | 与kernel侧接口配置保持一致。 |43+| isReuseSource | 输入 | 与核函数(Kernel)侧接口配置保持一致。 |
44 44 
45**表2** SoftmaxFlash SoftMaxFlashTilingFunc接口参数列表45**表2** SoftmaxFlash SoftMaxFlashTilingFunc接口参数列表
46 46 
@@ -49,7 +49,7 @@
49| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |49| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
50| dataTypeSize | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |50| dataTypeSize | 输入 | 参与计算的maxTensor和sumTensor的数据类型,比如half=2。 |
51| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxFlash接口计算的空间大小,单位为Byte。localWorkSpaceSize的取值必须大于GetSoftMaxFlashMinTmpSize接口返回的计算所需的最小临时空间大小。 |51| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxFlash接口计算的空间大小,单位为Byte。localWorkSpaceSize的取值必须大于GetSoftMaxFlashMinTmpSize接口返回的计算所需的最小临时空间大小。 |
52-| isUpdate | 输入 | 是否开启刷新功能,和kernel侧SoftmaxFlash接口一致,默认false。 |52+| isUpdate | 输入 | 是否开启刷新功能,和核函数(Kernel)侧SoftmaxFlash接口一致,默认false。 |
53| softmaxFlashTiling | 输出 | 输出SoftmaxFlash接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |53| softmaxFlashTiling | 输出 | 输出SoftmaxFlash接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |
54 54 
55## 返回值说明55## 返回值说明
@@ -37,8 +37,8 @@
37| --- | --- | --- |37| --- | --- | --- |
38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |38| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
39| dataTypeSize | 输入 | 计算的数据类型,比如half=2。 |39| dataTypeSize | 输入 | 计算的数据类型,比如half=2。 |
40-| isFront | 输入 | 是否只计算![](../../../../figures/zh-cn_formulaimage_0000001722356465.png),和kernel侧的SoftmaxGrad接口一致,默认false。 |40+| isFront | 输入 | 是否只计算![](../../../../figures/zh-cn_formulaimage_0000001722356465.png),和核函数(Kernel)侧的SoftmaxGrad接口一致,默认false。 |
41-| isReuseSource | 输入 | 与kernel侧接口配置保持一致。 |41+| isReuseSource | 输入 | 与核函数(Kernel)侧接口配置保持一致。 |
42 42 
43**表2** SoftmaxGrad SoftMaxGradTilingFunc接口参数列表43**表2** SoftmaxGrad SoftMaxGradTilingFunc接口参数列表
44 44 
@@ -47,7 +47,7 @@
47| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |47| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
48| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxGrad接口计算的临时空间大小,单位为Byte。localWorkSpaceSize的取值必须大于GetSoftMaxGradMinTmpSize接口返回的计算所需的最小临时空间大小。 |48| localWorkSpaceSize | 输入 | 剩余的可供SoftmaxGrad接口计算的临时空间大小,单位为Byte。localWorkSpaceSize的取值必须大于GetSoftMaxGradMinTmpSize接口返回的计算所需的最小临时空间大小。 |
49| dataTypeSize | 输入 | 计算的数据类型,比如half=2。 |49| dataTypeSize | 输入 | 计算的数据类型,比如half=2。 |
50-| isFront | 输入 | 是否只计算![](../../../../figures/zh-cn_formulaimage_0000001723260621.png),和kernel侧的SoftmaxGrad接口一致,默认false。 |50+| isFront | 输入 | 是否只计算![](../../../../figures/zh-cn_formulaimage_0000001723260621.png),和核函数(Kernel)侧的SoftmaxGrad接口一致,默认false。 |
51| softmaxGradTiling | 输出 | 输出SoftmaxGrad接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |51| softmaxGradTiling | 输出 | 输出SoftmaxGrad接口所需的tiling信息,支持optiling::SoftMaxTiling形式入参和AscendC::tiling::SoftMaxTiling形式入参。 |
52 52 
53## 返回值说明53## 返回值说明
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧SwiGLU接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧SwiGLU接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,9 +21,9 @@ void GetSwiGLUMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24-| maxValue | 输出 | SwiGLU接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |24+| maxValue | 输出 | SwiGLU接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
25| minValue | 输出 | SwiGLU接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |25| minValue | 输出 | SwiGLU接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
26-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |26+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
27 27 
28## 返回值说明28## 返回值说明
29 29 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧SwiGLU接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧SwiGLU接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**
8 8 
@@ -18,8 +18,8 @@ inline void GetSwishTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
18| --- | --- | --- |18| --- | --- | --- |
19| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |19| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
20| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2,即sizeof(half)。 |20| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2,即sizeof(half)。 |
21-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |21+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
22-| maxValue | 输出 | Swish接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |22+| maxValue | 输出 | Swish接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
23| minValue | 输出 | Swish接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |23| minValue | 输出 | Swish接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
24 24 
25## 返回值说明25## 返回值说明
@@ -80,7 +80,7 @@
80| [DeepNorm](normalization/DeepNorm.md) | 在深层神经网络训练过程中,可以替代LayerNorm的一种归一化方法。 |80| [DeepNorm](normalization/DeepNorm.md) | 在深层神经网络训练过程中,可以替代LayerNorm的一种归一化方法。 |
81| [GroupNorm](normalization/GroupNorm.md) | 将输入的C维度分为groupNum组,对每一组数据进行标准化。 |81| [GroupNorm](normalization/GroupNorm.md) | 将输入的C维度分为groupNum组,对每一组数据进行标准化。 |
82| [LayerNorm](normalization/LayerNorm.md) | 将输入数据收敛到[0, 1]之间,可以规范网络层输入输出数据分布的一种归一化方法。 |82| [LayerNorm](normalization/LayerNorm.md) | 将输入数据收敛到[0, 1]之间,可以规范网络层输入输出数据分布的一种归一化方法。 |
83-| [LayerNorm-Tiling](normalization/LayerNorm-Tiling.md) | LayerNorm的Tiling参数配置接口,用于获取LayerNorm kernel计算时所需的Tiling参数。 |83+| [LayerNorm-Tiling](normalization/LayerNorm-Tiling.md) | LayerNorm的Tiling参数配置接口,用于获取LayerNorm核函数(Kernel)计算时所需的Tiling参数。 |
84| [LayerNormGrad](normalization/LayerNormGrad.md) | 用于计算LayerNorm的反向传播梯度。 |84| [LayerNormGrad](normalization/LayerNormGrad.md) | 用于计算LayerNorm的反向传播梯度。 |
85| [LayerNormGrad-Tiling](normalization/LayerNormGrad-Tiling.md) | LayerNormGrad的Tiling参数配置接口,用于设置反向传播梯度计算所需的分片参数。 |85| [LayerNormGrad-Tiling](normalization/LayerNormGrad-Tiling.md) | LayerNormGrad的Tiling参数配置接口,用于设置反向传播梯度计算所需的分片参数。 |
86| [LayerNormGradBeta](normalization/LayerNormGradBeta.md) | 用于获取反向beta/gmma的数值,和LayerNormGrad共同输出pdx, gmma和beta。 |86| [LayerNormGradBeta](normalization/LayerNormGradBeta.md) | 用于获取反向beta/gmma的数值,和LayerNormGrad共同输出pdx, gmma和beta。 |
@@ -88,14 +88,14 @@ Init主要用于对Matmul对象中的Tiling数据进行初始化,根据Tiling
88 88 
89| 参数名 | 输入/输出 | 描述 |89| 参数名 | 输入/输出 | 描述 |
90| --- | --- | --- |90| --- | --- | --- |
91-| cubeTiling | 输入 | Matmul Tiling参数,TCubeTiling结构体定义请参见[表1 TCubeTiling结构说明](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到kernel侧使用。在kernel侧调用[GET_TILING_DATA](../../../basic_api/Kernel-Tiling/GET_TILING_DATA.md)实现将Tiling参数搬运到AI Core内的栈空间中,本接口传入Tiling参数中TCubeTiling结构体的栈地址。 |91+| cubeTiling | 输入 | Matmul Tiling参数,TCubeTiling结构体定义请参见[表1 TCubeTiling结构说明](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到核函数(Kernel)侧使用。在核函数(Kernel)侧调用[GET_TILING_DATA](../../../basic_api/Kernel-Tiling/GET_TILING_DATA.md)实现将Tiling参数搬运到AI Core内的栈空间中,本接口传入Tiling参数中TCubeTiling结构体的栈地址。 |
92| tpipe | 输入 | Tpipe对象。 |92| tpipe | 输入 | Tpipe对象。 |
93 93 
94**表2** Tiling参数传入GM地址接口参数说明94**表2** Tiling参数传入GM地址接口参数说明
95 95 
96| 参数名 | 输入/输出 | 描述 |96| 参数名 | 输入/输出 | 描述 |
97| --- | --- | --- |97| --- | --- | --- |
98-| gmCubeTiling | 输入 | Matmul Tiling参数,该参数指向gm上的一块内存地址,其中的数据类型是TCubeTiling结构体,TCubeTiling结构体定义请参见[表1 TCubeTiling结构说明](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到kernel侧使用。在kernel侧调用[GET_TILING_DATA_PTR_WITH_STRUCT](../../../basic_api/Kernel-Tiling/GET_TILING_DATA_PTR_WITH_STRUCT.md)获取gm上Tiling参数的指针,本接口传入Tiling参数中TCubeTiling结构体的GM地址。 |98+| gmCubeTiling | 输入 | Matmul Tiling参数,该参数指向gm上的一块内存地址,其中的数据类型是TCubeTiling结构体,TCubeTiling结构体定义请参见[表1 TCubeTiling结构说明](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到核函数(Kernel)侧使用。在核函数(Kernel)侧调用[GET_TILING_DATA_PTR_WITH_STRUCT](../../../basic_api/Kernel-Tiling/GET_TILING_DATA_PTR_WITH_STRUCT.md)获取gm上Tiling参数的指针,本接口传入Tiling参数中TCubeTiling结构体的GM地址。 |
99| tpipe | 输入 | Tpipe对象。 |99| tpipe | 输入 | Tpipe对象。 |
100 100 
101## 返回值说明101## 返回值说明
@@ -18,7 +18,7 @@ REGIST_MATMUL_OBJ(tpipe, workspace, ...)
18| --- | --- | --- |18| --- | --- | --- |
19| tpipe | 输入 | Tpipe对象。 |19| tpipe | 输入 | Tpipe对象。 |
20| workspace | 输入 | 系统workspace指针。 |20| workspace | 输入 | 系统workspace指针。 |
21-| ... | 输入 | 可变参数,传入Matmul对象和与之对应的Tiling结构,要求Tiling结构的数据类型为[TCubeTiling结构](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过Host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到kernel侧使用。 |21+| ... | 输入 | 可变参数,传入Matmul对象和与之对应的Tiling结构,要求Tiling结构的数据类型为[TCubeTiling结构](../Matmul_Tiling/TCubeTiling_struct.md#tcubetiling-struct)。<br><br>Tiling参数可以通过Host侧[GetTiling](../Matmul_Tiling/GetTiling.md)接口获取,并传递到核函数(Kernel)侧使用。 |
22 22 
23## 返回值说明23## 返回值说明
24 24 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-设置A矩阵的位置,数据格式,数据类型,是否转置等信息,这些信息需要和kernel侧的设置保持一致。5+设置A矩阵的位置,数据格式,数据类型,是否转置等信息,这些信息需要和核函数(Kernel)侧的设置保持一致。
6 6 
7## 函数原型7## 函数原型
8 8 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-设置B矩阵的位置,数据格式,数据类型,是否转置等信息,这些信息需要和kernel侧的设置保持一致。5+设置B矩阵的位置,数据格式,数据类型,是否转置等信息,这些信息需要和核函数(Kernel)侧的设置保持一致。
6 6 
7## 函数原型7## 函数原型
8 8 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-设置Bias的位置,数据格式,数据类型等信息,这些信息需要和kernel侧的设置保持一致。5+设置Bias的位置,数据格式,数据类型等信息,这些信息需要和核函数(Kernel)侧的设置保持一致。
6 6 
7## 函数原型7## 函数原型
8 8 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-设置C矩阵的位置,数据格式,数据类型等信息,这些信息需要和kernel侧的设置保持一致。5+设置C矩阵的位置,数据格式,数据类型等信息,这些信息需要和核函数(Kernel)侧的设置保持一致。
6 6 
7## 函数原型7## 函数原型
8 8 
@@ -15,7 +15,7 @@ TCubeTiling结构体包含Matmul Tiling切分算法的相关参数,被传递
15| <a id="deptha1"></a>depthA1, depthB1 | int | depthA1、depthB1分别表示L1 Buffer(A1)、L1 Buffer(B1)中全载基本块的份数,depthA1为L1 Buffer(A1)中全载baseM * baseK的份数,depthB1为L1 Buffer(B1)中全载baseN * baseK的份数。<br><br>注意:该参数取值必须大于0。 |15| <a id="deptha1"></a>depthA1, depthB1 | int | depthA1、depthB1分别表示L1 Buffer(A1)、L1 Buffer(B1)中全载基本块的份数,depthA1为L1 Buffer(A1)中全载baseM * baseK的份数,depthB1为L1 Buffer(B1)中全载baseN * baseK的份数。<br><br>注意:该参数取值必须大于0。 |
16| stepM, stepN,stepKa,stepKb<a name="p139009583566"></a> | int | stepM为左矩阵在L1 Buffer(A1)中缓存的buffer M方向上baseM的倍数。<br><br>stepN为右矩阵在L1 Buffer(B1)中缓存的buffer N方向上baseN的倍数。<br><br>stepKa为左矩阵在L1 Buffer(A1)中缓存的buffer Ka方向上baseK的倍数。<br><br>stepKb为右矩阵在L1 Buffer(B1)中缓存的buffer Kb方向上baseK的倍数。<br><br>注意:该参数取值必须大于0。 |16| stepM, stepN,stepKa,stepKb<a name="p139009583566"></a> | int | stepM为左矩阵在L1 Buffer(A1)中缓存的buffer M方向上baseM的倍数。<br><br>stepN为右矩阵在L1 Buffer(B1)中缓存的buffer N方向上baseN的倍数。<br><br>stepKa为左矩阵在L1 Buffer(A1)中缓存的buffer Ka方向上baseK的倍数。<br><br>stepKb为右矩阵在L1 Buffer(B1)中缓存的buffer Kb方向上baseK的倍数。<br><br>注意:该参数取值必须大于0。 |
17| isBias<a name="p2051215216314"></a> | int | 是否启用Bias,参数取值如下:<br>0:不启用Bias(默认值)。1:启用Bias。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |17| isBias<a name="p2051215216314"></a> | int | 是否启用Bias,参数取值如下:<br>0:不启用Bias(默认值)。1:启用Bias。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
18-| transLength<a name="p1620315053211"></a> | int | max(A1Length, B1Length, C1Length, BiasLength)。其中,A1Length, B1Length, C1Length, BiasLength分别表示A/B/C/Bias矩阵在计算过程中需要临时占用的UB空间大小。 |18+| transLength<a name="p1620315053211"></a> | int | max(A1Length, B1Length, C1Length, BiasLength)。其中,A1Length, B1Length, C1Length, BiasLength分别表示A/B/C/Bias矩阵在计算过程中需要临时占用的Unified Buffer(UB空间大小。 |
19| iterateOrder | int | 一次Iterate计算出[baseM, baseN]大小的C矩阵分片,Iterate完成后,Matmul会自动偏移下一次Iterate输出的C矩阵位置,iterOrder表示自动偏移的顺序。参数取值如下:<br>0:先往M轴方向偏移再往N轴方向偏移。1:先往N轴方向偏移再往M轴方向偏移。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |19| iterateOrder | int | 一次Iterate计算出[baseM, baseN]大小的C矩阵分片,Iterate完成后,Matmul会自动偏移下一次Iterate输出的C矩阵位置,iterOrder表示自动偏移的顺序。参数取值如下:<br>0:先往M轴方向偏移再往N轴方向偏移。1:先往N轴方向偏移再往M轴方向偏移。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
20| dbL0A, dbL0B,<br><br>dbL0C | int | MTE1是否开启double buffer。<br><br>dbL0A:左矩阵MTE1是否开启double buffer;dbL0B:右矩阵MTE1是否开启double buffer;dbL0C:MMAD是否开启double buffer。参数取值如下:<br>1:不开启double buffer。2:开启double buffer。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |20| dbL0A, dbL0B,<br><br>dbL0C | int | MTE1是否开启double buffer。<br><br>dbL0A:左矩阵MTE1是否开启double buffer;dbL0B:右矩阵MTE1是否开启double buffer;dbL0C:MMAD是否开启double buffer。参数取值如下:<br>1:不开启double buffer。2:开启double buffer。<br><br>注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
21| shareMode | int | 该参数预留,开发者无需关注。 |21| shareMode | int | 该参数预留,开发者无需关注。 |
@@ -44,7 +44,7 @@ GetDropOutMaxMinTmpSize无返回值。
44 44 
45## 调用示例45## 调用示例
46 46 
47-下文呈现了一个host侧调用**GetDropOutMaxMinTmpSize**接口的使用示例,通过该接口获取DropOut计算所需的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。配套的kernel侧使用样例请参考[调用示例](DropOut.md#section642mcpsimp)。47+下文呈现了一个host侧调用**GetDropOutMaxMinTmpSize**接口的使用示例,通过该接口获取DropOut计算所需的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。配套的核函数(Kernel)侧使用样例请参考[调用示例](DropOut.md#section642mcpsimp)。
48 48 
49```49```
50#include <vector>50#include <vector>
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Select接口的计算需要开发者申请临时空间,本接口用于在host侧获取申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Select接口的计算需要开发者申请临时空间,本接口用于在host侧获取申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -53,7 +53,7 @@ kernel侧Select接口的计算需要开发者申请临时空间,本接口用
53| srcTypeSize | 输入 | 输入srcTensor的数据类型大小,比如数据类型为half,此处应传入2。 |53| srcTypeSize | 输入 | 输入srcTensor的数据类型大小,比如数据类型为half,此处应传入2。 |
54| maskShape | 输入 | 输入maskTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |54| maskShape | 输入 | 输入maskTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
55| maskTypeSize | 输入 | 输入maskTensor的数据类型大小,比如数据类型为bool,此处应传入1。 |55| maskTypeSize | 输入 | 输入maskTensor的数据类型大小,比如数据类型为bool,此处应传入1。 |
56-| isReuseMask | 输入 | 是否复用maskTensor输入的空间。与kernel侧保持一致。 |56+| isReuseMask | 输入 | 是否复用maskTensor输入的空间。与核函数(Kernel)侧保持一致。 |
57| maxValue | 输出 | Select接口能完成计算所需最大临时空间大小。<br> 说明:maxValue仅作为参考值,有可能大于UB剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |57| maxValue | 输出 | Select接口能完成计算所需最大临时空间大小。<br> 说明:maxValue仅作为参考值,有可能大于UB剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
58| minValue | 输出 | Select接口能完成计算所需最小临时空间大小。 |58| minValue | 输出 | Select接口能完成计算所需最小临时空间大小。 |
59 59 
@@ -4,7 +4,7 @@
4 4 
5本接口为试验接口,在后续版本中可能会调整或改进,不保证后续兼容性。请开发者在使用过程中关注后续版本更新。5本接口为试验接口,在后续版本中可能会调整或改进,不保证后续兼容性。请开发者在使用过程中关注后续版本更新。
6 6 
7-kernel侧BesselI0接口的计算不需要预留/申请临时空间,本接口用于在host侧获取需要预留/申请的最大和最小临时空间大小。对于BesselI0接口,获取到的最大和最小临时空间大小均为0,0表示计算不需要临时空间。7+核函数(Kernel)侧BesselI0接口的计算不需要预留/申请临时空间,本接口用于在host侧获取需要预留/申请的最大和最小临时空间大小。对于BesselI0接口,获取到的最大和最小临时空间大小均为0,0表示计算不需要临时空间。
8 8 
9## 函数原型9## 函数原型
10 10 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Acos接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Acos接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAcosMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Acos接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Acos接口一致。 |
25-| maxValue | 输出 | Acos接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Acos接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Acos接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Acos接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Acosh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Acosh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAcoshMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Acosh接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Acosh接口一致。 |
25-| maxValue | 输出 | Acosh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Acosh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Acosh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Acosh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Acosh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧Acosh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**
8 8 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Asin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Asin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAsinMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Asin接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Asin接口一致。 |
25-| maxValue | 输出 | Asin接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Asin接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Asin接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Asin接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Asinh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Asinh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAsinhMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Asinh接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Asinh接口一致。 |
25-| maxValue | 输出 | Asinh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Asinh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Asinh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Asinh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Asinh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧Asinh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**
8 8 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Atan接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Atan接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAtanMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Atan接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Atan接口一致。 |
25-| maxValue | 输出 | Atan接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Atan接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Atan接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Atan接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Atanh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Atanh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAtanhMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Atanh接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Atanh接口一致。 |
25-| maxValue | 输出 | Atanh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Atanh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Atanh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Atanh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Atanh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧Atanh接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**
8 8 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Axpy接口的计算需要开发者申请临时空间,本接口用于在host侧获取申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Axpy接口的计算需要开发者申请临时空间,本接口用于在host侧获取申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetAxpyMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Axpy接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Axpy接口一致。 |
25-| maxValue | 输出 | Axpy接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Axpy接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Axpy接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Axpy接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Ceil接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Ceil接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetCeilMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Ceil接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Ceil接口一致。 |
25-| maxValue | 输出 | Ceil接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Ceil接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Ceil接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Ceil接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ClampMax/ClampMin/Clamp接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ClampMax/ClampMin/Clamp接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetClampMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与ClampMax/ClampMin接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与ClampMax/ClampMin接口一致。 |
25-| maxValue | 输出 | ClampMax/ClampMin/Clamp接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | ClampMax/ClampMin/Clamp接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | ClampMax/ClampMin/Clamp接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | ClampMax/ClampMin/Clamp接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Cos接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Cos接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -27,7 +27,7 @@ void GetCosMaxMinTmpSize(const CosConfig& config, const AscendC::TensorShape& sr
27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Cos接口的isReuseSource参数保持一致。对于float数据类型的输入支持开启该参数,half数据类型的输入不支持开启该参数。 |29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Cos接口的isReuseSource参数保持一致。对于float数据类型的输入支持开启该参数,half数据类型的输入不支持开启该参数。 |
30-| maxValue | 输出 | Cos接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |30+| maxValue | 输出 | Cos接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
31| minValue | 输出 | Cos接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |31| minValue | 输出 | Cos接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
32 32 
33## 返回值说明33## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Cosh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Cosh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetCoshMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否允许修改源操作数。 |24| isReuseSource | 输入 | 是否允许修改源操作数。 |
25-| maxValue | 输出 | Cosh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Cosh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Cosh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Cosh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧CumSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧CumSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Digamma接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Digamma接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetDigammaMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Digamma接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Digamma接口一致。 |
25-| maxValue | 输出 | Digamma接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Digamma接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Digamma接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Digamma接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -2,7 +2,7 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Digamma接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:5+核函数(Kernel)侧Digamma接口的计算需要开发者预留/申请临时空间,最大临时空间(maxTmpBuffer)和输入所占空间(inputSize \* typeSize)存在以下关系:
6 6 
7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**7**maxTmpBuffer = maxLiveNodeCount \* inputSize \* typeSize + extraBuffer**
8 8 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Erf接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Erf接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetErfMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t ty
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否允许修改源操作数。 |24| isReuseSource | 输入 | 是否允许修改源操作数。 |
25-| maxValue | 输出 | Erf接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Erf接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Erf接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Erf接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Erfc接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Erfc接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetErfcMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Erfc接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Erfc接口一致。 |
25-| maxValue | 输出 | Erfc接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Erfc接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Erfc接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Erfc接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Exp接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Exp接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ bool GetExpMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t ty
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Exp接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Exp接口一致。 |
25-| maxValue | 输出 | Exp接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Exp接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Exp接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Exp接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuffer\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuffer\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Floor接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Floor接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetFloorMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Floor接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Floor接口一致。 |
25-| maxValue | 输出 | Floor接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Floor接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Floor接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Floor接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Fmod接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Fmod接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetFmodMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 该参数预留,传入默认值false即可。 |24| isReuseSource | 输入 | 该参数预留,传入默认值false即可。 |
25-| maxValue | 输出 | Fmod接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Fmod接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Fmod接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Fmod接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Frac接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Frac接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetFracMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否允许修改源操作数输入的空间。 |24| isReuseSource | 输入 | 是否允许修改源操作数输入的空间。 |
25-| maxValue | 输出 | Frac接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Frac接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Frac接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Frac接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Hypot接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Hypot接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetHypotMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 该参数预留,传入默认值false即可。 |24| isReuseSource | 输入 | 该参数预留,传入默认值false即可。 |
25-| maxValue | 输出 | Hypot接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Hypot接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Hypot接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Hypot接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Lgamma接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Lgamma接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetLgammaMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Lgamma接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Lgamma接口一致。 |
25-| maxValue | 输出 | Lgamma接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Lgamma接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Lgamma接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Lgamma接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -27,7 +27,7 @@ void GetLog2MaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Log接口一致。 |29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Log接口一致。 |
30-| maxValue | 输出 | Log接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |30+| maxValue | 输出 | Log接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
31| minValue | 输出 | Log接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |31| minValue | 输出 | Log接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
32 32 
33## 返回值说明33## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Power接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Power接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10接口内部根据srcShape1、srcShape2输入判断接口为Power\(dstTensor, srcTensor1, srcTensor2\)、Power\(dstTensor, srcTensor1, scalarValue\)或Power\(dstTensor, scalarValue, srcTensor2\)类型中的哪一种,进而返回对应临时空间大小。10接口内部根据srcShape1、srcShape2输入判断接口为Power\(dstTensor, srcTensor1, srcTensor2\)、Power\(dstTensor, srcTensor1, scalarValue\)或Power\(dstTensor, scalarValue, srcTensor2\)类型中的哪一种,进而返回对应临时空间大小。
11 11 
@@ -26,7 +26,7 @@ void GetPowerMaxMinTmpSize(const AscendC::TensorShape& srcShape1, const AscendC:
26| typeIsInt | 输入 | bool类型,true表示输入是int32_t。 |26| typeIsInt | 输入 | bool类型,true表示输入是int32_t。 |
27| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |27| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
28| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Power接口一致。 |28| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Power接口一致。 |
29-| maxValue | 输出 | Power接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |29+| maxValue | 输出 | Power接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
30| minValue | 输出 | Power接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |30| minValue | 输出 | Power接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
31 31 
32## 返回值说明32## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Round接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Round接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -23,7 +23,7 @@ void GetRoundMaxMinTmpSize(const platform_ascendc::PlatformAscendC& ascendcPlatf
23| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |23| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
24| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |24| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
25| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Round接口一致。 |25| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Round接口一致。 |
26-| maxValue | 输出 | Round接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |26+| maxValue | 输出 | Round接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
27| minValue | 输出 | Round接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |27| minValue | 输出 | Round接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
28 28 
29## 返回值说明29## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Sign接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Sign接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetSignMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sign接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sign接口一致。 |
25-| maxValue | 输出 | Sign接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Sign接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Sign接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |26| minValue | 输出 | Sign接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Sin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Sin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -27,7 +27,7 @@ void GetSinMaxMinTmpSize(const SinConfig& config, const AscendC::TensorShape& sr
27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |27| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sin接口的isReuseSource参数保持一致。对于float数据类型的输入支持开启该参数,half数据类型的输入不支持开启该参数。 |29| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sin接口的isReuseSource参数保持一致。对于float数据类型的输入支持开启该参数,half数据类型的输入不支持开启该参数。 |
30-| maxValue | 输出 | Sin接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |30+| maxValue | 输出 | Sin接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
31| minValue | 输出 | Sin接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |31| minValue | 输出 | Sin接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
32 32 
33## 返回值说明33## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Sinh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Sinh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetSinhMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sinh接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Sinh接口一致。 |
25-| maxValue | 输出 | Sinh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Sinh接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Sinh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Sinh接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Tan接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Tan接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetTanMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t ty
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否允许修改源操作数。 |24| isReuseSource | 输入 | 是否允许修改源操作数。 |
25-| maxValue | 输出 | Tan接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Tan接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Tan接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Tan接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Tanh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Tanh接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Trunc接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Trunc接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetTruncMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Trunc接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Trunc接口一致。 |
25-| maxValue | 输出 | Trunc接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Trunc接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Trunc接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |26| minValue | 输出 | Trunc接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLivedNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLivedNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLivedNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Xor接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Xor接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -22,7 +22,7 @@ void GetXorMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32_t ty
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为int16_t,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为int16_t,此处应传入2。 |
24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Xor接口一致。 |24| isReuseSource | 输入 | 是否复用源操作数输入的空间,与Xor接口一致。 |
25-| maxValue | 输出 | Xor接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |25+| maxValue | 输出 | Xor接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br><br>请注意,maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
26| minValue | 输出 | Xor接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |26| minValue | 输出 | Xor接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
27 27 
28## 返回值说明28## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,9 +2,9 @@
2 2 
3## 样例一<a name="section5279737173215"></a>3## 样例一<a name="section5279737173215"></a>
4 4 
5-下面的样例展示了数学库kernel侧API和Tiling API GetXxxMaxMinTmpSize的配套使用方法,具体流程如下:5+下面的样例展示了数学库核函数(Kernel)侧API和Tiling API GetXxxMaxMinTmpSize的配套使用方法,具体流程如下:
6 6 
7-Host侧调用Tiling接口,获取所需临时空间的大小,并将其写入tiling data中;kernel侧再读取tiling data,获取相应的临时空间大小,并根据此分配临时空间。7+Host侧调用Tiling接口,获取所需临时空间的大小,并将其写入tiling data中;核函数(Kernel)侧再读取tiling data,获取相应的临时空间大小,并根据此分配临时空间。
8 8 
9Host侧Tiling API使用[AscendC::TensorShape](../data_structures/TensorShape.md)描述输入数据的Tensor形状,使用样例如下:9Host侧Tiling API使用[AscendC::TensorShape](../data_structures/TensorShape.md)描述输入数据的Tensor形状,使用样例如下:
10 10 
@@ -58,7 +58,7 @@ static ge::graphStatus TilingFunc(gert::TilingContext* context)
58} // namespace optiling58} // namespace optiling
59```59```
60 60 
61-kernel侧读取tiling data,获取相应的临时空间大小,并根据此分配临时空间:61+核函数(Kernel)侧读取tiling data,获取相应的临时空间大小,并根据此分配临时空间:
62 62 
63```63```
64#include "kernel_operator.h"64#include "kernel_operator.h"
@@ -249,9 +249,9 @@ extern "C" __global__ __aicore__ void math_custom(GM_ADDR srcGm, GM_ADDR dstGm,
249 249 
250## 样例三<a name="section488747123318"></a>250## 样例三<a name="section488747123318"></a>
251 251 
252-下面的样例展示了数学库kernel侧API和Tiling API GetXxxTmpBufferFactorSize的配套使用方法,具体流程如下:252+下面的样例展示了数学库核函数(Kernel)侧API和Tiling API GetXxxTmpBufferFactorSize的配套使用方法,具体流程如下:
253 253 
254-Host侧调用Tiling接口,获取maxLiveNodeCount和extraBuf,并推算算子单次最大计算元素数量,将其写入tiling data中;kernel侧再读取tiling data,获取该值,基于该值分配临时空间。254+Host侧调用Tiling接口,获取maxLiveNodeCount和extraBuf,并推算算子单次最大计算元素数量,将其写入tiling data中;核函数(Kernel)侧再读取tiling data,获取该值,基于该值分配临时空间。
255 255 
256Host侧Tiling API使用样例:256Host侧Tiling API使用样例:
257 257 
@@ -326,7 +326,7 @@ static ge::graphStatus TilingFunc(gert::TilingContext* context)
326} // namespace optiling326} // namespace optiling
327```327```
328 328 
329-kernel侧样例:329+核函数(Kernel)侧样例:
330 330 
331```331```
332#include "kernel_operator.h"332#include "kernel_operator.h"
@@ -2,18 +2,18 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-BatchNorm Tiling API用于获取BatchNorm kernel计算时所需的Tiling参数。获取Tiling参数主要分为如下两步:5+BatchNorm Tiling API用于获取BatchNorm核函数(Kernel)计算时所需的Tiling参数。获取Tiling参数主要分为如下两步:
6 6 
71. 通过**GetBatchNormMaxMinTmpSize**获取BatchNorm接口计算所需最大和最小临时空间大小。71. 通过**GetBatchNormMaxMinTmpSize**获取BatchNorm接口计算所需最大和最小临时空间大小。
8 8 
9- kernel侧BatchNorm接口的计算需要开发者预留/申请临时空间,**GetBatchNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。9+ 核函数(Kernel)侧BatchNorm接口的计算需要开发者预留/申请临时空间,**GetBatchNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
10 10 
11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
12- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。12+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
13 13 
14-2. 通过**GetBatchNormNDTilingInfo**获取BatchNorm kernel侧接口所需tiling参数。14+2. 通过**GetBatchNormNDTilingInfo**获取BatchNorm核函数(Kernel)侧接口所需tiling参数。
15 15 
16- BatchNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入BatchNorm高阶API接口,直接进行使用即可。16+ BatchNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入BatchNorm高阶API接口,直接进行使用即可。
17 17 
18 ```18 ```
19 struct BatchNormTiling {19 struct BatchNormTiling {
@@ -91,7 +91,7 @@ bool GetBatchNormNDTilingInfo(const AscendC::TensorShape& srcShape, const Ascend
91 91 
92## 调用示例92## 调用示例
93 93 
94-如下样例介绍了host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[16,16,16\],输入的数据类型为half。94+如下样例介绍了host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[16,16,16\],输入的数据类型为half。
95 95 
961. 将BatchNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。961. 将BatchNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
97 97 
@@ -108,7 +108,7 @@ bool GetBatchNormNDTilingInfo(const AscendC::TensorShape& srcShape, const Ascend
108 END_TILING_DATA_DEF;108 END_TILING_DATA_DEF;
109 ```109 ```
110 110 
111-2. Tiling实现函数中,首先调用**GetBatchNormMaxMinTmpSize**接口获取BatchNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取BatchNorm kernel侧接口所需tiling参数。111+2. Tiling实现函数中,首先调用**GetBatchNormMaxMinTmpSize**接口获取BatchNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取BatchNorm核函数(Kernel)侧接口所需tiling参数。
112 112 
113 ```113 ```
114 namespace optiling {114 namespace optiling {
@@ -142,7 +142,7 @@ bool GetBatchNormNDTilingInfo(const AscendC::TensorShape& srcShape, const Ascend
142 } // namespace optiling142 } // namespace optiling
143 ```143 ```
144 144 
145-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的BatchNormTiling信息传入BatchNorm接口参与计算。完整的kernel侧样例请参考[BatchNorm](BatchNorm.md)。145+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的BatchNormTiling信息传入BatchNorm接口参与计算。完整的核函数(Kernel)侧样例请参考[BatchNorm](BatchNorm.md)。
146 146 
147 ```147 ```
148 extern "C" __global__ __aicore__ void func_custom(148 extern "C" __global__ __aicore__ void func_custom(
@@ -2,20 +2,20 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供DeepNorm Tiling API,方便用户获取DeepNorm kernel计算时所需的Tiling参数。5+Ascend C提供DeepNorm Tiling API,方便用户获取DeepNorm核函数(Kernel)计算时所需的Tiling参数。
6 6 
7获取Tiling参数主要分为如下两步:7获取Tiling参数主要分为如下两步:
8 8 
91. 通过**GetDeepNormMaxMinTmpSize**获取DeepNorm接口计算所需最大和最小临时空间大小。91. 通过**GetDeepNormMaxMinTmpSize**获取DeepNorm接口计算所需最大和最小临时空间大小。
10 10 
11- kernel侧DeepNorm接口的计算需要开发者预留/申请临时空间,**GetDeepNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。11+ 核函数(Kernel)侧DeepNorm接口的计算需要开发者预留/申请临时空间,**GetDeepNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
12 12 
13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
14- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。14+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
15 15 
162. 通过**GetDeepNormTilingInfo**获取DeepNormkernel侧接口所需tiling参数。162. 通过**GetDeepNormTilingInfo**获取DeepNormkernel侧接口所需tiling参数。
17 17 
18- DeepNormTiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入DeepNorm高阶API接口,直接进行使用即可。18+ DeepNormTiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入DeepNorm高阶API接口,直接进行使用即可。
19 19 
20 ```20 ```
21 struct DeepNormTiling {21 struct DeepNormTiling {
@@ -72,7 +72,7 @@ bool GetDeepNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::
72| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |72| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
73| isReuseSource | 输入 | 是否复用源操作数输入的空间,与DeepNorm接口一致。 |73| isReuseSource | 输入 | 是否复用源操作数输入的空间,与DeepNorm接口一致。 |
74| isBasicBlock | 输入 | srcShape是否符合基本块定义:尾轴H的长度为64的倍数(不超过2040), B*S为8的倍数。 |74| isBasicBlock | 输入 | srcShape是否符合基本块定义:尾轴H的长度为64的倍数(不超过2040), B*S为8的倍数。 |
75-| maxValue | 输出 | DeepNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |75+| maxValue | 输出 | DeepNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
76| minValue | 输出 | DeepNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |76| minValue | 输出 | DeepNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
77 77 
78**表2** GetDeepNormTilingInfo接口参数说明78**表2** GetDeepNormTilingInfo接口参数说明
@@ -110,7 +110,7 @@ bool GetDeepNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::
110 END_TILING_DATA_DEF;110 END_TILING_DATA_DEF;
111 ```111 ```
112 112 
113-2. Tiling实现函数中,首先调用**GetDeepNormMaxMinTmpSize**接口获取DeepNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取DeepNorm kernel侧接口所需tiling参数。113+2. Tiling实现函数中,首先调用**GetDeepNormMaxMinTmpSize**接口获取DeepNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取DeepNorm核函数(Kernel)侧接口所需tiling参数。
114 114 
115 ```115 ```
116 namespace optiling {116 namespace optiling {
@@ -147,7 +147,7 @@ bool GetDeepNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::
147 } // namespace optiling147 } // namespace optiling
148 ```148 ```
149 149 
150-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的DeepNorm Tiling信息传入DeepNorm接口参与计算。完整的kernel侧样例请参考[DeepNorm](DeepNorm.md)。150+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的DeepNorm Tiling信息传入DeepNorm接口参与计算。完整的核函数(Kernel)侧样例请参考[DeepNorm](DeepNorm.md)。
151 151 
152 ```152 ```
153 extern "C" __global__ __aicore__ void deepnorm_custom(153 extern "C" __global__ __aicore__ void deepnorm_custom(
@@ -2,18 +2,18 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-GroupNorm Tiling API用于获取GroupNorm kernel计算时所需的Tiling参数。获取Tiling参数主要分为如下两步:5+GroupNorm Tiling API用于获取GroupNorm核函数(Kernel)计算时所需的Tiling参数。获取Tiling参数主要分为如下两步:
6 6 
71. 通过**GetGroupNormMaxMinTmpSize**获取GroupNorm接口计算所需最大和最小临时空间大小。71. 通过**GetGroupNormMaxMinTmpSize**获取GroupNorm接口计算所需最大和最小临时空间大小。
8 8 
9- kernel侧GroupNorm接口的计算需要开发者预留/申请临时空间,**GetGroupNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。9+ 核函数(Kernel)侧GroupNorm接口的计算需要开发者预留/申请临时空间,**GetGroupNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
10 10 
11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
12- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。12+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
13 13 
14-2. 通过**GetGroupNormNDTilingInfo**获取GroupNorm kernel侧接口所需tiling参数。14+2. 通过**GetGroupNormNDTilingInfo**获取GroupNorm核函数(Kernel)侧接口所需tiling参数。
15 15 
16- GroupNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入GroupNorm高阶API接口,直接进行使用即可。16+ GroupNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入GroupNorm高阶API接口,直接进行使用即可。
17 17 
18 ```18 ```
19 struct GroupNormTiling {19 struct GroupNormTiling {
@@ -74,7 +74,7 @@ void GetGroupNormNDTilingInfo(const AscendC::TensorShape& srcShape, const uint32
74| typeSize | 输入 | 输入数据inputX的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |74| typeSize | 输入 | 输入数据inputX的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
75| isReuseSource | 输入 | 中间变量是否能够复用输入内存。 |75| isReuseSource | 输入 | 中间变量是否能够复用输入内存。 |
76| groupNum | 输入 | 在C维度上的分组数。 |76| groupNum | 输入 | 在C维度上的分组数。 |
77-| maxValue | 输出 | 输出GroupNorm接口所需的tiling信息(最大临时空间大小)。<br><br>GroupNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |77+| maxValue | 输出 | 输出GroupNorm接口所需的tiling信息(最大临时空间大小)。<br><br>GroupNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
78| minValue | 输出 | 输出GroupNorm接口所需的tiling信息(最小临时空间大小)。<br><br>GroupNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |78| minValue | 输出 | 输出GroupNorm接口所需的tiling信息(最小临时空间大小)。<br><br>GroupNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
79 79 
80**表2** GetGroupNormNDTilingInfo接口参数列表:80**表2** GetGroupNormNDTilingInfo接口参数列表:
@@ -98,7 +98,7 @@ void GetGroupNormNDTilingInfo(const AscendC::TensorShape& srcShape, const uint32
98 98 
99## 调用示例99## 调用示例
100 100 
101-如下样例介绍了host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[2,16,8, 8\],输入的数据类型为half。101+如下样例介绍了host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[2,16,8, 8\],输入的数据类型为half。
102 102 
1031. 将GroupNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。1031. 将GroupNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
104 104 
@@ -116,7 +116,7 @@ void GetGroupNormNDTilingInfo(const AscendC::TensorShape& srcShape, const uint32
116 END_TILING_DATA_DEF;116 END_TILING_DATA_DEF;
117 ```117 ```
118 118 
119-2. Tiling实现函数中,首先调用**GetGroupNormMaxMinTmpSize**接口获取GroupNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取GroupNorm kernel侧接口所需tiling参数。119+2. Tiling实现函数中,首先调用**GetGroupNormMaxMinTmpSize**接口获取GroupNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取GroupNorm核函数(Kernel)侧接口所需tiling参数。
120 120 
121 ```121 ```
122 namespace optiling {122 namespace optiling {
@@ -148,7 +148,7 @@ void GetGroupNormNDTilingInfo(const AscendC::TensorShape& srcShape, const uint32
148 } // namespace optiling148 } // namespace optiling
149 ```149 ```
150 150 
151-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的GroupNorm Tiling信息传入GroupNorm接口参与计算。151+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的GroupNorm Tiling信息传入GroupNorm接口参与计算。
152 152 
153 ```153 ```
154 extern "C" __global__ __aicore__ void groupnorm_custom(154 extern "C" __global__ __aicore__ void groupnorm_custom(
@@ -2,20 +2,20 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计算时所需的Tiling参数。5+Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm核函数(Kernel)计算时所需的Tiling参数。
6 6 
7获取Tiling参数主要分为如下两步:7获取Tiling参数主要分为如下两步:
8 8 
91. 先通过**GetLayerNormMaxMinTmpSize**获取LayerNorm接口计算所需最大和最小临时空间大小,用于合理分配计算空间。91. 先通过**GetLayerNormMaxMinTmpSize**获取LayerNorm接口计算所需最大和最小临时空间大小,用于合理分配计算空间。
10 10 
11- kernel侧LayerNorm接口的计算需要开发者预留/申请临时空间,**GetLayerNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。11+ 核函数(Kernel)侧LayerNorm接口的计算需要开发者预留/申请临时空间,**GetLayerNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
12 12 
13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
14- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。14+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
15 15 
16-2. 通过**GetLayerNormNDTilingInfo**获取LayerNorm kernel侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNorm接口计算的空间大小和计算的数据类型。16+2. 通过**GetLayerNormNDTilingInfo**获取LayerNorm核函数(Kernel)侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNorm接口计算的空间大小和计算的数据类型。
17 17 
18- LayerNorm Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到kernel侧,传入LayerNorm高阶API接口,直接进行使用即可。18+ LayerNorm Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入LayerNorm高阶API接口,直接进行使用即可。
19 19 
20 - 输出归一化结果、均值和方差的LayerNorm接口所需的Tiling结构体20 - 输出归一化结果、均值和方差的LayerNorm接口所需的Tiling结构体
21 21 
@@ -134,19 +134,19 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
134 134 
135| 接口 | 输入/输出 | 功能 |135| 接口 | 输入/输出 | 功能 |
136| --- | --- | --- |136| --- | --- | --- |
137-| srcShape | 输入 | 输出归一化结果、均值和方差的LayerNorm接口:<br>输入数据inputX的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputX的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br>在API支持的场景下,storageHLength和originHLength保持一致。<br><br>输出归一化结果、均值和标准差的倒数的LayerNorm接口:<br>输入数据inputX的shape信息{A, R},A轴长度可以在kernel接口中动态指定,但范围不能超过此参数中A的大小。 |137+| srcShape | 输入 | 输出归一化结果、均值和方差的LayerNorm接口:<br>输入数据inputX的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputX的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br>在API支持的场景下,storageHLength和originHLength保持一致。<br><br>输出归一化结果、均值和标准差的倒数的LayerNorm接口:<br>输入数据inputX的shape信息{A, R},A轴长度可以在核函数(Kernel)接口中动态指定,但范围不能超过此参数中A的大小。 |
138| typeSize | 输入 | 输入数据inputX的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |138| typeSize | 输入 | 输入数据inputX的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
139| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |139| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |
140| isComputeRstd | 输入 | 是否计算标准差的倒数rstd。用于Tiling中区分选择的LayerNorm API。 |140| isComputeRstd | 输入 | 是否计算标准差的倒数rstd。用于Tiling中区分选择的LayerNorm API。 |
141| isOnlyOutput | 输入 | 是否只输出y,不输出均值mean与标准差的倒数rstd。当前该参数仅支持false,y、mean和rstd的结果全都输出。 |141| isOnlyOutput | 输入 | 是否只输出y,不输出均值mean与标准差的倒数rstd。当前该参数仅支持false,y、mean和rstd的结果全都输出。 |
142-| maxValue | 输出 | 输出LayerNorm接口所需的tiling信息(最大临时空间大小)。<br><br>LayerNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |142+| maxValue | 输出 | 输出LayerNorm接口所需的tiling信息(最大临时空间大小)。<br><br>LayerNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
143| minValue | 输出 | 输出LayerNorm接口所需的tiling信息(最小临时空间大小)。<br><br>LayerNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |143| minValue | 输出 | 输出LayerNorm接口所需的tiling信息(最小临时空间大小)。<br><br>LayerNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
144 144 
145**表2** GetLayerNormNDTilingInfo和GetLayerNormNDTillingInfo接口参数列表145**表2** GetLayerNormNDTilingInfo和GetLayerNormNDTillingInfo接口参数列表
146 146 
147| 参数名称 | 输入/输出 | 含义 |147| 参数名称 | 输入/输出 | 含义 |
148| --- | --- | --- |148| --- | --- | --- |
149-| srcShape | 输入 | 输出归一化结果、均值和方差的LayerNorm接口:<br>输入数据inputX的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputX的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>输出归一化结果、均值和标准差的倒数的LayerNorm接口:<br>输入数据inputX的shape信息{A, R},A轴长度可以在kernel接口中动态指定,但范围不能超过此参数中A的大小。 |149+| srcShape | 输入 | 输出归一化结果、均值和方差的LayerNorm接口:<br>输入数据inputX的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputX的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>输出归一化结果、均值和标准差的倒数的LayerNorm接口:<br>输入数据inputX的shape信息{A, R},A轴长度可以在核函数(Kernel)接口中动态指定,但范围不能超过此参数中A的大小。 |
150| stackBufferSize | 输入 | 可供LayerNorm接口使用的空间大小,单位Byte。 |150| stackBufferSize | 输入 | 可供LayerNorm接口使用的空间大小,单位Byte。 |
151| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |151| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
152| isReuseSource | 输入 | 是否可以复用inputX的内存空间。 |152| isReuseSource | 输入 | 是否可以复用inputX的内存空间。 |
@@ -163,7 +163,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
163 163 
164## 调用示例164## 调用示例
165 165 
166-如下样例介绍了使用输出方差的LayerNorm高阶API时,host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。166+如下样例介绍了使用输出方差的LayerNorm高阶API时,host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。
167 167 
1681. 将LayerNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。1681. 将LayerNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
169 169 
@@ -177,7 +177,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
177 END_TILING_DATA_DEF;177 END_TILING_DATA_DEF;
178 ```178 ```
179 179 
180-2. Tiling实现函数中,首先调用GetLayerNormMaxMinTmpSize接口获取LayerNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNorm kernel侧接口所需tiling参数。180+2. Tiling实现函数中,首先调用GetLayerNormMaxMinTmpSize接口获取LayerNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNorm核函数(Kernel)侧接口所需tiling参数。
181 181 
182 ```182 ```
183 namespace optiling {183 namespace optiling {
@@ -210,7 +210,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
210 } // namespace optiling210 } // namespace optiling
211 ```211 ```
212 212 
213-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormTiling信息传入LayerNorm接口参与计算。213+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormTiling信息传入LayerNorm接口参与计算。
214 214 
215 ```215 ```
216 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)216 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -224,7 +224,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
224 }224 }
225 ```225 ```
226 226 
227-如下样例介绍了使用输出标准差的倒数的LayerNorm高阶API时,host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[2, 64\],输入的数据类型为half。227+如下样例介绍了使用输出标准差的倒数的LayerNorm高阶API时,host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[2, 64\],输入的数据类型为half。
228 228 
2291. 将LayerNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。2291. 将LayerNormTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
230 230 
@@ -238,7 +238,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
238 END_TILING_DATA_DEF;238 END_TILING_DATA_DEF;
239 ```239 ```
240 240 
241-2. Tiling实现函数中,首先调用GetLayerNormMaxMinTmpSize接口获取LayerNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNorm kernel侧接口所需tiling参数。241+2. Tiling实现函数中,首先调用GetLayerNormMaxMinTmpSize接口获取LayerNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNorm核函数(Kernel)侧接口所需tiling参数。
242 242 
243 ```243 ```
244 namespace optiling {244 namespace optiling {
@@ -276,7 +276,7 @@ Ascend C提供一组LayerNorm Tiling API,方便用户获取LayerNorm kernel计
276 } // namespace optiling276 } // namespace optiling
277 ```277 ```
278 278 
279-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormTiling信息传入LayerNorm接口参与计算。279+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormTiling信息传入LayerNorm接口参与计算。
280 280 
281 ```281 ```
282 extern "C" __global__ __aicore__ void func_custom(282 extern "C" __global__ __aicore__ void func_custom(
@@ -6,14 +6,14 @@ LayerNormGrad Tiling的功能如下:
6 6 
7- 在host侧获取预留/申请的最大最小临时空间大小:7- 在host侧获取预留/申请的最大最小临时空间大小:
8 8 
9- kernel侧LayerNormGrad接口的计算需要开发者预留/申请临时空间,**GetLayerNormGradMaxMinTmpSize**接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。9+ 核函数(Kernel)侧LayerNormGrad接口的计算需要开发者预留/申请临时空间,**GetLayerNormGradMaxMinTmpSize**接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
10 10 
11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
12- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。12+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
13 13 
14-- 通过**GetLayerNormGradNDTilingInfo**获取LayerNormGrad kernel侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNormGrad接口计算的空间大小和计算的数据类型。14+- 通过**GetLayerNormGradNDTilingInfo**获取LayerNormGrad核函数(Kernel)侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNormGrad接口计算的空间大小和计算的数据类型。
15 15 
16- LayerNormGrad Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到kernel侧,传入LayerNormGrad高阶API接口,直接进行使用即可。16+ LayerNormGrad Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入LayerNormGrad高阶API接口,直接进行使用即可。
17 17 
18 ```18 ```
19 struct LayerNormGradTiling {19 struct LayerNormGradTiling {
@@ -73,7 +73,7 @@ void GetLayerNormGradNDTilingInfo(const AscendC::TensorShape srcShape, const uin
73| srcShape | 输入 | 输入数据inputDy的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputDy的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>在API支持的场景下,storageHLength和originHLength保持一致。 |73| srcShape | 输入 | 输入数据inputDy的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputDy的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>在API支持的场景下,storageHLength和originHLength保持一致。 |
74| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |74| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
75| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |75| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |
76-| maxValue | 输出 | LayerNormGrad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |76+| maxValue | 输出 | LayerNormGrad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
77| minValue | 输出 | LayerNormGrad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |77| minValue | 输出 | LayerNormGrad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
78 78 
79**表2** GetLayerNormGradNDTilingInfo接口参数列表79**表2** GetLayerNormGradNDTilingInfo接口参数列表
@@ -96,7 +96,7 @@ void GetLayerNormGradNDTilingInfo(const AscendC::TensorShape srcShape, const uin
96 96 
97## 调用示例97## 调用示例
98 98 
99-如下样例介绍了使用LayerNormGrad高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。99+如下样例介绍了使用LayerNormGrad高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。
100 100 
1011. 将LayerNormGradTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。1011. 将LayerNormGradTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
102 102 
@@ -110,7 +110,7 @@ void GetLayerNormGradNDTilingInfo(const AscendC::TensorShape srcShape, const uin
110 END_TILING_DATA_DEF;110 END_TILING_DATA_DEF;
111 ```111 ```
112 112 
113-2. Tiling实现函数中,首先调用GetLayerNormGradMaxMinTmpSize接口获取LayerNormGrad接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormGradNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNormGradBeta kernel侧接口所需tiling参数。113+2. Tiling实现函数中,首先调用GetLayerNormGradMaxMinTmpSize接口获取LayerNormGrad接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormGradNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNormGradBeta核函数(Kernel)侧接口所需tiling参数。
114 114 
115 ```115 ```
116 namespace optiling {116 namespace optiling {
@@ -143,7 +143,7 @@ void GetLayerNormGradNDTilingInfo(const AscendC::TensorShape srcShape, const uin
143 } // namespace optiling143 } // namespace optiling
144 ```144 ```
145 145 
146-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormGradTiling信息传入LayerNormGrad接口参与计算。完整的kernel侧样例请参考[调用示例](LayerNormGrad.md#调用示例)。146+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormGradTiling信息传入LayerNormGrad接口参与计算。完整的核函数(Kernel)侧样例请参考[调用示例](LayerNormGrad.md#调用示例)。
147 147 
148 ```148 ```
149 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)149 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -6,14 +6,14 @@ LayerNormGradBeta Tiling的功能如下:
6 6 
7- 在host侧获取预留/申请的最大最小临时空间大小:7- 在host侧获取预留/申请的最大最小临时空间大小:
8 8 
9- kernel侧LayerNormGradBeta接口的计算需要开发者预留/申请临时空间,**GetLayerNormGradBetaMaxMinTmpSize**接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。9+ 核函数(Kernel)侧LayerNormGradBeta接口的计算需要开发者预留/申请临时空间,**GetLayerNormGradBetaMaxMinTmpSize**接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
10 10 
11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;11 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
12- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。12+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
13 13 
14-- 通过**GetLayerNormGradBetaNDTilingInfo**获取LayerNormGradBeta kernel侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNormGradBeta接口计算的空间大小和计算的数据类型。14+- 通过**GetLayerNormGradBetaNDTilingInfo**获取LayerNormGradBeta核函数(Kernel)侧接口所需tiling参数,需要传入输入shape,剩余的可供LayerNormGradBeta接口计算的空间大小和计算的数据类型。
15 15 
16- LayerNormGradBeta Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到kernel侧,传入LayerNormGradBeta高阶API接口,直接进行使用即可。16+ LayerNormGradBeta Tiling结构体的定义如下,开发者无需关注该Tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入LayerNormGradBeta高阶API接口,直接进行使用即可。
17 17 
18 ```18 ```
19 struct LayerNormGradBetaTiling {19 struct LayerNormGradBetaTiling {
@@ -63,7 +63,7 @@ void GetLayerNormGradBetaNDTilingInfo(const AscendC::TensorShape srcShape, const
63| srcShape | 输入 | 输入数据inputDy的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputDy的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>在API支持的场景下,storageHLength和originHLength保持一致。 |63| srcShape | 输入 | 输入数据inputDy的shape信息{B, S, storageHLength, originHLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),包括当前输入的inputDy的shape信息,以及地址对齐前(如存在H轴补齐操作)的原有shape信息。<br><br>在API支持的场景下,storageHLength和originHLength保持一致。 |
64| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |64| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
65| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |65| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[LayerNorm](LayerNorm.md)接口一致。 |
66-| maxValue | 输出 | LayerNormGradBeta接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |66+| maxValue | 输出 | LayerNormGradBeta接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
67| minValue | 输出 | LayerNormGradBeta接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |67| minValue | 输出 | LayerNormGradBeta接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
68 68 
69**表2** GetLayerNormGradBetaNDTilingInfo接口参数列表69**表2** GetLayerNormGradBetaNDTilingInfo接口参数列表
@@ -86,7 +86,7 @@ void GetLayerNormGradBetaNDTilingInfo(const AscendC::TensorShape srcShape, const
86 86 
87## 调用示例87## 调用示例
88 88 
89-如下样例介绍了使用LayerNormGradBeta高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。89+如下样例介绍了使用LayerNormGradBeta高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape大小为\[2, 16, 64\],输入的数据类型为half。
90 90 
911. 将LayerNormGradBetaTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。911. 将LayerNormGradBetaTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
92 92 
@@ -101,7 +101,7 @@ void GetLayerNormGradBetaNDTilingInfo(const AscendC::TensorShape srcShape, const
101 END_TILING_DATA_DEF;101 END_TILING_DATA_DEF;
102 ```102 ```
103 103 
104-2. Tiling实现函数中,首先调用GetLayerNormGradBetaMaxMinTmpSize接口获取LayerNormGradBeta接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormGradBetaNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNormGradBeta kernel侧接口所需tiling参数。104+2. Tiling实现函数中,首先调用GetLayerNormGradBetaMaxMinTmpSize接口获取LayerNormGradBeta接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后调用GetLayerNormGradBetaNDTilingInfo接口根据输入shape、剩余的可供计算的空间大小等信息获取LayerNormGradBeta核函数(Kernel)侧接口所需tiling参数。
105 105 
106 ```106 ```
107 namespace optiling {107 namespace optiling {
@@ -134,7 +134,7 @@ void GetLayerNormGradBetaNDTilingInfo(const AscendC::TensorShape srcShape, const
134 } // namespace optiling134 } // namespace optiling
135 ```135 ```
136 136 
137-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormGradBetaTiling信息传入LayerNormGradBeta接口参与计算。完整的kernel侧样例请参考[LayerNormGradBeta](LayerNormGradBeta.md)。137+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的LayerNormGradBetaTiling信息传入LayerNormGradBeta接口参与计算。完整的核函数(Kernel)侧样例请参考[LayerNormGradBeta](LayerNormGradBeta.md)。
138 138 
139 ```139 ```
140 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)140 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -2,14 +2,14 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供Normalize Tiling API,方便用户获取Normalize kernel计算时所需的Tiling参数。5+Ascend C提供Normalize Tiling API,方便用户获取Normalize核函数(Kernel)计算时所需的Tiling参数。
6 6 
7具体为,通过GetNormalizeMaxMinTmpSize获取Normalize接口计算所需最大和最小临时空间大小。7具体为,通过GetNormalizeMaxMinTmpSize获取Normalize接口计算所需最大和最小临时空间大小。
8 8 
9-kernel侧Normalize接口的计算需要开发者预留/申请临时空间,GetNormalizeMaxMinTmpSize用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。9+核函数(Kernel)侧Normalize接口的计算需要开发者预留/申请临时空间,GetNormalizeMaxMinTmpSize用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
10 10 
11- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;11- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
12-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。12+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
13 13 
14## 函数原型14## 函数原型
15 15 
@@ -29,7 +29,7 @@ void GetNormalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint3
29| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[Normalize](Normalize.md)接口一致。 |29| isReuseSource | 输入 | 是否复用源操作数的内存空间,与[Normalize](Normalize.md)接口一致。 |
30| isComputeRstd | 输入 | 是否计算rstd。该参数的取值只支持true。 |30| isComputeRstd | 输入 | 是否计算rstd。该参数的取值只支持true。 |
31| isOnlyOutput | 输入 | 是否只输出y,不输出标准差的倒数rstd。当前该参数仅支持取值为false,表示y和rstd的结果全部输出。 |31| isOnlyOutput | 输入 | 是否只输出y,不输出标准差的倒数rstd。当前该参数仅支持取值为false,表示y和rstd的结果全部输出。 |
32-| maxValue | 输出 | 输出Normalize接口所需的tiling信息(最大临时空间大小)。<br><br>Normalize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |32+| maxValue | 输出 | 输出Normalize接口所需的tiling信息(最大临时空间大小)。<br><br>Normalize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
33| minValue | 输出 | 输出Normalize接口所需的tiling信息(最小临时空间大小)。<br><br>Normalize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |33| minValue | 输出 | 输出Normalize接口所需的tiling信息(最小临时空间大小)。<br><br>Normalize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
34 34 
35## 返回值说明35## 返回值说明
@@ -57,7 +57,7 @@ void GetNormalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint3
57 END_TILING_DATA_DEF;57 END_TILING_DATA_DEF;
58 ```58 ```
59 59 
60-2. Tiling实现函数中,首先调用**GetNormalizeMaxMinTmpSize**接口获取Normalize接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取Normalize kernel侧接口所需tiling参数。60+2. Tiling实现函数中,首先调用**GetNormalizeMaxMinTmpSize**接口获取Normalize接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取Normalize核函数(Kernel)侧接口所需tiling参数。
61 61 
62 ```62 ```
63 namespace optiling {63 namespace optiling {
@@ -98,7 +98,7 @@ void GetNormalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint3
98 } // namespace optiling98 } // namespace optiling
99 ```99 ```
100 100 
101-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的Normalize Tiling信息传入Normalize接口参与计算。完整的kernel侧样例请参考[Normalize](Normalize.md)。101+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的Normalize Tiling信息传入Normalize接口参与计算。完整的核函数(Kernel)侧样例请参考[Normalize](Normalize.md)。
102 102 
103 ```103 ```
104 extern "C" __global__ __aicore__ void normalize_custom(104 extern "C" __global__ __aicore__ void normalize_custom(
@@ -2,20 +2,20 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供RmsNorm Tiling API,方便用户获取RmsNorm kernel计算时所需的Tiling参数。5+Ascend C提供RmsNorm Tiling API,方便用户获取RmsNorm核函数(Kernel)计算时所需的Tiling参数。
6 6 
7获取Tiling参数主要分为如下两步:7获取Tiling参数主要分为如下两步:
8 8 
91. 通过**GetRmsNormMaxMinTmpSize**获取RmsNorm接口计算所需最大和最小临时空间大小。91. 通过**GetRmsNormMaxMinTmpSize**获取RmsNorm接口计算所需最大和最小临时空间大小。
10 10 
11- kernel侧RmsNorm接口的计算需要开发者预留/申请临时空间,**GetRmsNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。11+ 核函数(Kernel)侧RmsNorm接口的计算需要开发者预留/申请临时空间,**GetRmsNormMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
12 12 
13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;13 - 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
14- - 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。14+ - 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
15 15 
16-2. 通过**GetRmsNormTilingInfo**获取RmsNorm kernel侧接口所需tiling参数。16+2. 通过**GetRmsNormTilingInfo**获取RmsNorm核函数(Kernel)侧接口所需tiling参数。
17 17 
18- RmsNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入RmsNorm高阶API接口,直接进行使用即可。18+ RmsNorm Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入RmsNorm高阶API接口,直接进行使用即可。
19 19 
20 ```20 ```
21 struct RmsNormTiling {21 struct RmsNormTiling {
@@ -56,9 +56,9 @@ bool GetRmsNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::T
56| --- | --- | --- |56| --- | --- | --- |
57| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |57| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
58| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |58| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
59-| maxValue | 输出 | RmsNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |59+| maxValue | 输出 | RmsNorm接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
60| minValue | 输出 | RmsNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |60| minValue | 输出 | RmsNorm接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
61-| isBasicBlock | 输入 | 是否要开启基本块计算,与kernel侧接口一致,默认false。 |61+| isBasicBlock | 输入 | 是否要开启基本块计算,与核函数(Kernel)侧接口一致,默认false。 |
62 62 
63**表2** GetRmsNormTilingInfo接口参数说明63**表2** GetRmsNormTilingInfo接口参数说明
64 64 
@@ -69,7 +69,7 @@ bool GetRmsNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::T
69| stackBufferByteSize | 输入 | 剩余的可供RmsNorm接口计算的空间大小,单位为Byte。通过GetRmsNormMaxMinTmpSize获取最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为stackBufferByteSize传入。 |69| stackBufferByteSize | 输入 | 剩余的可供RmsNorm接口计算的空间大小,单位为Byte。通过GetRmsNormMaxMinTmpSize获取最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为stackBufferByteSize传入。 |
70| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |70| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
71| tiling | 输出 | RmsNorm计算所需Tiling信息。 |71| tiling | 输出 | RmsNorm计算所需Tiling信息。 |
72-| isBasicBlock | 输入 | 是否要开启基本块计算,与kernel侧接口一致,默认false。若开启基本块,则需要保证originSrcShape的H也是32B对齐。 |72+| isBasicBlock | 输入 | 是否要开启基本块计算,与核函数(Kernel)侧接口一致,默认false。若开启基本块,则需要保证originSrcShape的H也是32B对齐。 |
73 73 
74## 返回值说明74## 返回值说明
75 75 
@@ -94,7 +94,7 @@ bool GetRmsNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::T
94 END_TILING_DATA_DEF;94 END_TILING_DATA_DEF;
95 ```95 ```
96 96 
97-2. Tiling实现函数中,首先调用**GetRmsNormMaxMinTmpSize**接口获取RmsNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取RmsNorm kernel侧接口所需tiling参数。97+2. Tiling实现函数中,首先调用**GetRmsNormMaxMinTmpSize**接口获取RmsNorm接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取RmsNorm核函数(Kernel)侧接口所需tiling参数。
98 98 
99 ```99 ```
100 namespace optiling {100 namespace optiling {
@@ -130,7 +130,7 @@ bool GetRmsNormTilingInfo(const AscendC::TensorShape& srcShape, const AscendC::T
130 } // namespace optiling130 } // namespace optiling
131 ```131 ```
132 132 
133-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的RmsNorm Tiling信息传入RmsNorm接口参与计算。完整的kernel侧样例请参考[RmsNorm](RmsNorm.md)。133+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的RmsNorm Tiling信息传入RmsNorm接口参与计算。完整的核函数(Kernel)侧样例请参考[RmsNorm](RmsNorm.md)。
134 134 
135 ```135 ```
136 extern "C" __global__ __aicore__ void rmsnorm_custom(GM_ADDR inputGm, GM_ADDR gammaGm, GM_ADDR outputGm, GM_ADDR tiling)136 extern "C" __global__ __aicore__ void rmsnorm_custom(GM_ADDR inputGm, GM_ADDR gammaGm, GM_ADDR outputGm, GM_ADDR tiling)
@@ -2,16 +2,16 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供WelfordFinalize Tiling API,方便用户获取WelfordFinalize kernel计算时所需的Tiling参数。5+Ascend C提供WelfordFinalize Tiling API,方便用户获取WelfordFinalize核函数(Kernel)计算时所需的Tiling参数。
6 6 
7获取Tiling参数主要步骤如下:7获取Tiling参数主要步骤如下:
8 8 
9具体为,通过**GetWelfordFinalizeMaxMinTmpSize**获取WelfordFinalize接口计算所需最大和最小临时空间大小。9具体为,通过**GetWelfordFinalizeMaxMinTmpSize**获取WelfordFinalize接口计算所需最大和最小临时空间大小。
10 10 
11-kernel侧WelfordFinalize接口的计算需要开发者预留/申请临时空间,**GetWelfordFinalizeMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。11+核函数(Kernel)侧WelfordFinalize接口的计算需要开发者预留/申请临时空间,**GetWelfordFinalizeMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
12 12 
13- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;13- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
14-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。14+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
15 15 
16## 函数原型16## 函数原型
17 17 
@@ -28,7 +28,7 @@ void GetWelfordFinalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const
28| srcShape | 输入 | 输入inputMean/inputVariance的shape信息{abLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |28| srcShape | 输入 | 输入inputMean/inputVariance的shape信息{abLength},参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
29| typeSize | 输入 | 输入inputMean/inputVariance的数据类型大小,单位为字节。比如输入的数据类型为float,此处应传入4。 |29| typeSize | 输入 | 输入inputMean/inputVariance的数据类型大小,单位为字节。比如输入的数据类型为float,此处应传入4。 |
30| isReuseSource | 输入 | 是否允许修改源操作数。该参数取值与[WelfordFinalize](WelfordFinalize.md)接口一致。 |30| isReuseSource | 输入 | 是否允许修改源操作数。该参数取值与[WelfordFinalize](WelfordFinalize.md)接口一致。 |
31-| maxValue | 输出 | WelfordFinalize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |31+| maxValue | 输出 | WelfordFinalize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
32| minValue | 输出 | WelfordFinalize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |32| minValue | 输出 | WelfordFinalize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
33 33 
34## 返回值说明34## 返回值说明
@@ -59,7 +59,7 @@ void GetWelfordFinalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const
59 WelfordFinalizeCustomTilingData) // 将WelfordFinalizeCustomTilingData结构体参数增加至TilingData结构体59 WelfordFinalizeCustomTilingData) // 将WelfordFinalizeCustomTilingData结构体参数增加至TilingData结构体
60 ```60 ```
61 61 
62-2. Tiling实现函数中,首先调用**GetWelfordFinalizeMaxMinTmpSize**接口获取WelfordFinalize接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取WelfordFinalize kernel侧接口所需tiling参数。62+2. Tiling实现函数中,首先调用**GetWelfordFinalizeMaxMinTmpSize**接口获取WelfordFinalize接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取WelfordFinalize核函数(Kernel)侧接口所需tiling参数。
63 63 
64 ```64 ```
65 namespace optiling {65 namespace optiling {
@@ -97,7 +97,7 @@ void GetWelfordFinalizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const
97 } // namespace optiling97 } // namespace optiling
98 ```98 ```
99 99 
100-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的WelfordFinalize Tiling信息传入WelfordFinalize接口参与计算。完整的kernel侧样例请参考[WelfordFinalize](WelfordFinalize.md)。100+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的WelfordFinalize Tiling信息传入WelfordFinalize接口参与计算。完整的核函数(Kernel)侧样例请参考[WelfordFinalize](WelfordFinalize.md)。
101 101 
102 ```102 ```
103 extern "C" __global__ __aicore__ void welford_finalize_custom(103 extern "C" __global__ __aicore__ void welford_finalize_custom(
@@ -2,16 +2,16 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-Ascend C提供WelfordUpdate Tiling API,方便用户获取WelfordUpdate kernel计算时所需的Tiling参数。5+Ascend C提供WelfordUpdate Tiling API,方便用户获取WelfordUpdate核函数(Kernel)计算时所需的Tiling参数。
6 6 
7获取Tiling参数主要步骤如下:7获取Tiling参数主要步骤如下:
8 8 
9具体为,通过**GetWelfordUpdateMaxMinTmpSize**获取WelfordUpdate接口计算所需最大和最小临时空间大小。9具体为,通过**GetWelfordUpdateMaxMinTmpSize**获取WelfordUpdate接口计算所需最大和最小临时空间大小。
10 10 
11-kernel侧WelfordUpdate接口的计算需要开发者预留/申请临时空间,**GetWelfordUpdateMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。11+核函数(Kernel)侧WelfordUpdate接口的计算需要开发者预留/申请临时空间,**GetWelfordUpdateMaxMinTmpSize**用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
12 12 
13- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;13- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
14-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。14+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
15 15 
16## 函数原型16## 函数原型
17 17 
@@ -30,7 +30,7 @@ void GetWelfordUpdateMaxMinTmpSize(const AscendC::TensorShape& srcShape, const u
30| typeSizeU | 输入 | 均值、方差(outputMean、outputVariance、inputMean、inputVariance)的数据类型大小,单位为字节。比如输入的数据类型为float,此处应传入4。 |30| typeSizeU | 输入 | 均值、方差(outputMean、outputVariance、inputMean、inputVariance)的数据类型大小,单位为字节。比如输入的数据类型为float,此处应传入4。 |
31| isReuseSource | 输入 | 是否允许修改源操作数。与[WelfordUpdate](WelfordUpdate.md)接口一致。 |31| isReuseSource | 输入 | 是否允许修改源操作数。与[WelfordUpdate](WelfordUpdate.md)接口一致。 |
32| isInplace | 输入 | 目的操作数是否复用源操作数。与[WelfordUpdate](WelfordUpdate.md)接口一致。 |32| isInplace | 输入 | 目的操作数是否复用源操作数。与[WelfordUpdate](WelfordUpdate.md)接口一致。 |
33-| maxValue | 输出 | WelfordUpdate接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |33+| maxValue | 输出 | WelfordUpdate接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
34| minValue | 输出 | WelfordUpdate接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |34| minValue | 输出 | WelfordUpdate接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
35 35 
36## 返回值说明36## 返回值说明
@@ -58,7 +58,7 @@ void GetWelfordUpdateMaxMinTmpSize(const AscendC::TensorShape& srcShape, const u
58 WelfordUpdateCustomTilingData) // 将WelfordUpdateCustomTilingData结构体参数增加至TilingData结构体58 WelfordUpdateCustomTilingData) // 将WelfordUpdateCustomTilingData结构体参数增加至TilingData结构体
59 ```59 ```
60 60 
61-2. Tiling实现函数中,首先调用**GetWelfordUpdateMaxMinTmpSize**接口获取WelfordUpdate接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取WelfordUpdate kernel侧接口所需tiling参数。61+2. Tiling实现函数中,首先调用**GetWelfordUpdateMaxMinTmpSize**接口获取WelfordUpdate接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入shape、剩余的可供计算的空间大小等信息获取WelfordUpdate核函数(Kernel)侧接口所需tiling参数。
62 62 
63 ```63 ```
64 namespace optiling {64 namespace optiling {
@@ -95,7 +95,7 @@ void GetWelfordUpdateMaxMinTmpSize(const AscendC::TensorShape& srcShape, const u
95 } // namespace optiling95 } // namespace optiling
96 ```96 ```
97 97 
98-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的WelfordUpdate Tiling信息传入WelfordUpdate接口参与计算。完整的kernel侧样例请参考[WelfordUpdate](WelfordUpdate.md)。98+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的WelfordUpdate Tiling信息传入WelfordUpdate接口参与计算。完整的核函数(Kernel)侧样例请参考[WelfordUpdate](WelfordUpdate.md)。
99 99 
100 ```100 ```
101 extern "C" __global__ __aicore__ void welford_update_custom(101 extern "C" __global__ __aicore__ void welford_update_custom(
@@ -80,7 +80,7 @@ Meant<sub>n</sub>的计算过程示意如下图,调用n次本接口后,得
80| T | inputX操作数的数据类型。不同型号支持的数据类型请参考[支持的数据类型](#li1773114612461)。 |80| T | inputX操作数的数据类型。不同型号支持的数据类型请参考[支持的数据类型](#li1773114612461)。 |
81| U | outputMean、outputVariance、inputMean、inputVariance操作数的数据类型。支持的数据类型为:float。 |81| U | outputMean、outputVariance、inputMean、inputVariance操作数的数据类型。支持的数据类型为:float。 |
82| isReuseSource | 是否允许修改源操作数,默认值为false。如果开发者允许源操作数被改写,可以设置该参数取值为true开启,开启后能够节省部分内存空间。<br><br>设置为true,则本接口内部计算时复用inputX的内存空间,节省内存空间;设置为false,则本接口内部计算时不复用inputX的内存空间。<!-- npu="310p" id7 --><br><br>在Atlas 推理系列产品AI Core中,该参数预留,传入默认值false即可。<!-- end id7 --><br><br>isReuseSource的使用样例请参考[更多样例](../math_compute/more_examples.md#section639165323915)。 |82| isReuseSource | 是否允许修改源操作数,默认值为false。如果开发者允许源操作数被改写,可以设置该参数取值为true开启,开启后能够节省部分内存空间。<br><br>设置为true,则本接口内部计算时复用inputX的内存空间,节省内存空间;设置为false,则本接口内部计算时不复用inputX的内存空间。<!-- npu="310p" id7 --><br><br>在Atlas 推理系列产品AI Core中,该参数预留,传入默认值false即可。<!-- end id7 --><br><br>isReuseSource的使用样例请参考[更多样例](../math_compute/more_examples.md#section639165323915)。 |
83-| config | 配置非指定计算范围内的目的操作数与源操作数的复用关系。WelfordUpdateConfig类型,定义如下方代码所示,其中参数的含义如下。<br>isInplace:接口参数para中的abComputeLength参数指定了输入数据内层轴的计算长度,在该指定计算长度之外的输出数据具体为何值,通过本参数设置。本参数表示,在指定计算长度之外的目的操作数是否复用源操作数;若复用,对于指定计算长度之外的输出,直接使用对应位置的源操作数代替输出目的操作数;若不复用,则本接口不会输出计算范围外的目的操作数。<br>false:默认值。表示目的操作数不复用源操作数。<br>true:表示目的操作数复用源操作数。outputMean复用inputMean,outputVariance复用inputVariance。<br><br>此参数一般用于配合kernel侧tiling计算的接口使用。 |83+| config | 配置非指定计算范围内的目的操作数与源操作数的复用关系。WelfordUpdateConfig类型,定义如下方代码所示,其中参数的含义如下。<br>isInplace:接口参数para中的abComputeLength参数指定了输入数据内层轴的计算长度,在该指定计算长度之外的输出数据具体为何值,通过本参数设置。本参数表示,在指定计算长度之外的目的操作数是否复用源操作数;若复用,对于指定计算长度之外的输出,直接使用对应位置的源操作数代替输出目的操作数;若不复用,则本接口不会输出计算范围外的目的操作数。<br>false:默认值。表示目的操作数不复用源操作数。<br>true:表示目的操作数复用源操作数。outputMean复用inputMean,outputVariance复用inputVariance。<br><br>此参数一般用于配合核函数(Kernel)侧tiling计算的接口使用。 |
84 84 
85```85```
86struct WelfordUpdateConfig {86struct WelfordUpdateConfig {
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧AntiQuantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧AntiQuantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -24,7 +24,7 @@ void GetAntiQuantizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const As
24| isTranspose | 输入 | 预留参数。当前仅支持配置为false。 |24| isTranspose | 输入 | 预留参数。当前仅支持配置为false。 |
25| inputDataType | 输入 | 输入srcTensor数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |25| inputDataType | 输入 | 输入srcTensor数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |
26| outputDataType | 输入 | 输出dstTensor数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |26| outputDataType | 输入 | 输出dstTensor数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |
27-| maxValue | 输出 | AntiQuantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |27+| maxValue | 输出 | AntiQuantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
28| minValue | 输出 | AntiQuantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |28| minValue | 输出 | AntiQuantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
29 29 
30## 返回值说明30## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧AscendAntiQuant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧AscendAntiQuant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -32,7 +32,7 @@ uint32_t GetAscendAntiQuantMinTmpSize(const AscendC::TensorShape& srcShape, cons
32| isTranspose | 输入 | 是否转置。 |32| isTranspose | 输入 | 是否转置。 |
33| inputDataType | 输入 | 输入数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |33| inputDataType | 输入 | 输入数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |
34| outputDataType | 输入 | 输出数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |34| outputDataType | 输入 | 输出数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。 |
35-| maxValue | 输出 | AscendAntiQuant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |35+| maxValue | 输出 | AscendAntiQuant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
36| minValue | 输出 | AscendAntiQuant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |36| minValue | 输出 | AscendAntiQuant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
37 37 
38## 返回值说明38## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧AscendDequant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧AscendDequant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,7 +21,7 @@ void GetAscendDequantMaxMinTmpSize(const AscendC::TensorShape& srcShape, const u
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为int32_t,此处应传入4。 |23| typeSize | 输入 | 输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为int32_t,此处应传入4。 |
24-| maxValue | 输出 | AscendDequant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |24+| maxValue | 输出 | AscendDequant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
25| minValue | 输出 | AscendDequant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |25| minValue | 输出 | AscendDequant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
26 26 
27## 返回值说明27## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧AscendQuant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧AscendQuant接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,7 +21,7 @@ void GetAscendQuantMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uin
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |22| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24-| maxValue | 输出 | AscendQuant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |24+| maxValue | 输出 | AscendQuant接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。 <br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
25| minValue | 输出 | AscendQuant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |25| minValue | 输出 | AscendQuant接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
26 26 
27## 返回值说明27## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Dequantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Dequantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,7 +21,7 @@ void GetDequantizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | Dequantize接口的输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |22| srcShape | 输入 | Dequantize接口的输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | Dequantize接口的输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为int32_t,此处应传入4。 |23| typeSize | 输入 | Dequantize接口的输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为int32_t,此处应传入4。 |
24-| maxValue | 输出 | Dequantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |24+| maxValue | 输出 | Dequantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
25| minValue | 输出 | Dequantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |25| minValue | 输出 | Dequantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
26 26 
27## 返回值说明27## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Quantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Quantize接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -21,7 +21,7 @@ void GetQuantizeMaxMinTmpSize(const AscendC::TensorShape& srcShape, const uint32
21| --- | --- | --- |21| --- | --- | --- |
22| srcShape | 输入 | Quantize接口的输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |22| srcShape | 输入 | Quantize接口的输入srcTensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
23| typeSize | 输入 | Quantize接口的输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |23| typeSize | 输入 | Quantize接口的输入srcTensor的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
24-| maxValue | 输出 | Quantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |24+| maxValue | 输出 | Quantize接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
25| minValue | 输出 | Quantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |25| minValue | 输出 | Quantize接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
26 26 
27## 返回值说明27## 返回值说明
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCount / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCount、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCount1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Mean接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Mean接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -10,7 +10,7 @@
10 10 
11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCnt / typeSize**11 **currentShapeSize = \(currBuff - extraBuf\) / maxLiveNodeCnt / typeSize**
12 12 
13-- 算子实现需要调用两个kernel侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCnt、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:13+- 算子实现需要调用两个核函数(Kernel)侧API KernelIntf1、KernelIntf2,利用两个GetXxxTmpBufferFactorSize(其中Xxx为需要调用的两个高阶API)接口的两组输出值\(maxLiveNodeCnt、extraBuf\)以及当前现有的临时空间,推导单次最大计算元素数量currentShapeSize为:
14 14 
15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCnt1 / typeSize**15 **currentShapeSize1 = \(currBuff - extraBuf1\) / maxLiveNodeCnt1 / typeSize**
16 16 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceAll接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceAll接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceAny接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceAny接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceMax接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceMax接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceMean接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceMean接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceMin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceMin接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceProd接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceProd接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧ReduceXorSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧ReduceXorSum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Sum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Sum接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-带SortConfig模板参数的kernel侧Sort接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+带SortConfig模板参数的核函数(Kernel)侧Sort接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -24,7 +24,7 @@ void GetSortMaxMinTmpSize(const AscendC::TensorShape& srcShape, AscendC::TensorD
24| indexType | 输入 | 输入、输出Index的数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。与Sort接口的模板参数U保持一致。 |24| indexType | 输入 | 输入、输出Index的数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。与Sort接口的模板参数U保持一致。 |
25| isReuseSource | 输入 | 是否复用源操作数输入的空间。与Sort接口的参数isReuseSource保持一致。 |25| isReuseSource | 输入 | 是否复用源操作数输入的空间。与Sort接口的参数isReuseSource保持一致。 |
26| config | 输入 | Sort的相应配置:选择的排序算法,排序结果的升降序,输入输出是否带有索引数据。数据类型SortConfig,定义如下方代码所示。其中的参数hasSrcIndex、hasDstIndex与使用的Sort接口是否带有输入索引、输出索引的情况保持一致;当前hasSrcIndex = true, hasDstIndex = false组合不支持。 |26| config | 输入 | Sort的相应配置:选择的排序算法,排序结果的升降序,输入输出是否带有索引数据。数据类型SortConfig,定义如下方代码所示。其中的参数hasSrcIndex、hasDstIndex与使用的Sort接口是否带有输入索引、输出索引的情况保持一致;当前hasSrcIndex = true, hasDstIndex = false组合不支持。 |
27-| maxValue | 输出 | Sort接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br> 说明:maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |27+| maxValue | 输出 | Sort接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br> 说明:maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
28| minValue | 输出 | Sort接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |28| minValue | 输出 | Sort接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
29 29 
30```30```
@@ -81,7 +81,7 @@ __aicore__ inline void MrgSort(const LocalTensor<T>& dst, const MrgSortSrcList<T
81| --- | --- | --- |81| --- | --- | --- |
82| dst | 输出 | 目的操作数,存储经过排序后的数据。<br><br>类型为[LocalTensor](../../basic_api/data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |82| dst | 输出 | 目的操作数,存储经过排序后的数据。<br><br>类型为[LocalTensor](../../basic_api/data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
83| sortList | 输入 | 源操作数,支持2-4个队列,并且每个队列都已经排好序,类型为MrgSortSrcList结构体,具体请参考下表。MrgSortSrcList中传入要合并的队列,定义如下方代码所示。 |83| sortList | 输入 | 源操作数,支持2-4个队列,并且每个队列都已经排好序,类型为MrgSortSrcList结构体,具体请参考下表。MrgSortSrcList中传入要合并的队列,定义如下方代码所示。 |
84-| elementCountList | 输入 | 四个源队列的长度(排序方式一:8Bytes结构的数目,排序方式二:16*sizeof(T)Bytes结构的数目),类型为长度为4的uint16_t数据类型的数组,理论上每个元素取值范围[0, 4095],但不能超出UB的存储空间。 |84+| elementCountList | 输入 | 四个源队列的长度(排序方式一:8Bytes结构的数目,排序方式二:16*sizeof(T)Bytes结构的数目),类型为长度为4的uint16_t数据类型的数组,理论上每个元素取值范围[0, 4095],但不能超出Unified Buffer(UB的存储空间。 |
85| sortedNum | 输出 | 耗尽模式下(即isExhaustedSuspension为true时),停止合并时每个队列已排序的元素个数。 |85| sortedNum | 输出 | 耗尽模式下(即isExhaustedSuspension为true时),停止合并时每个队列已排序的元素个数。 |
86| validBit | 输入 | 有效队列个数,取值如下:<br>0b11:前两条队列有效<br>0b111:前三条队列有效<br>0b1111:四条队列全部有效 |86| validBit | 输入 | 有效队列个数,取值如下:<br>0b11:前两条队列有效<br>0b111:前三条队列有效<br>0b1111:四条队列全部有效 |
87| repeatTime | 输入 | 迭代次数,每一次源操作数和目的操作数跳过四个队列总长度。取值范围:repeatTime∈[1,255]。<br>repeatTime参数生效是有条件的,需要同时满足以下四个条件:<br>srcLocal包含四条队列并且validBit=15。<br>四个源队列的长度一致。<br>四个源队列连续存储。<br>isExhaustedSuspension为false。 |87| repeatTime | 输入 | 迭代次数,每一次源操作数和目的操作数跳过四个队列总长度。取值范围:repeatTime∈[1,255]。<br>repeatTime参数生效是有条件的,需要同时满足以下四个条件:<br>srcLocal包含四条队列并且validBit=15。<br>四个源队列的长度一致。<br>四个源队列连续存储。<br>isExhaustedSuspension为false。 |
@@ -4,14 +4,14 @@
4 4 
5用于获取TopK Tiling参数。5用于获取TopK Tiling参数。
6 6 
7-Ascend C提供TopK Tiling API,方便用户获取TopK kernel计算时所需的Tiling参数。7+Ascend C提供TopK Tiling API,方便用户获取TopK核函数(Kernel)计算时所需的Tiling参数。
8 8 
9获取Tiling参数主要分为如下两步:9获取Tiling参数主要分为如下两步:
10 10 
111. 获取TopK接口计算所需最小和最大临时空间大小,注意该步骤不是必须的,只是作为一个参考,供合理分配计算空间。111. 获取TopK接口计算所需最小和最大临时空间大小,注意该步骤不是必须的,只是作为一个参考,供合理分配计算空间。
12-2. 获取TopK kernel侧接口所需tiling参数。12+2. 获取TopK核函数(Kernel)侧接口所需tiling参数。
13 13 
14- TopK Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到kernel侧,传入TopK高阶API接口,直接进行使用即可。14+ TopK Tiling结构体的定义如下,开发者无需关注该tiling结构的具体信息,只需要传递到核函数(Kernel)侧,传入TopK高阶API接口,直接进行使用即可。
15 15 
16 ```16 ```
17 struct TopkTiling {17 struct TopkTiling {
@@ -78,10 +78,10 @@ bool TopKTilingFunc(const platform_ascendc::PlatformAscendC& ascendcPlatform, co
78| inner | 输入 | 表示TopK接口输入srcLocal的内轴长度,该参数的取值为32的整数倍。 |78| inner | 输入 | 表示TopK接口输入srcLocal的内轴长度,该参数的取值为32的整数倍。 |
79| outter | 输入 | 表示TopK接口输入srcLocal的外轴长度。 |79| outter | 输入 | 表示TopK接口输入srcLocal的外轴长度。 |
80| k | 输入 | 获取前k个最大值或最小值及其对应的索引。 |80| k | 输入 | 获取前k个最大值或最小值及其对应的索引。 |
81-| isReuseSource | 输入 | 中间变量是否能够复用输入内存。与kernel侧接口的isReuseSrc保持一致。 |81+| isReuseSource | 输入 | 中间变量是否能够复用输入内存。与核函数(Kernel)侧接口的isReuseSrc保持一致。 |
82-| isInitIndex | 输入 | 是否传入输入数据对应的索引,与kernel侧接口一致。 |82+| isInitIndex | 输入 | 是否传入输入数据对应的索引,与核函数(Kernel)侧接口一致。 |
83-| mode | 输入 | 选择TopKMode::TOPK_NORMAL模式或者TopKMode::TOPK_NSMALL模式,与kernel侧接口一致。 |83+| mode | 输入 | 选择TopKMode::TOPK_NORMAL模式或者TopKMode::TOPK_NSMALL模式,与核函数(Kernel)侧接口一致。 |
84-| isLargest | 输入 | 表示降序/升序,true表示降序,false表示升序。与kernel侧接口一致。 |84+| isLargest | 输入 | 表示降序/升序,true表示降序,false表示升序。与核函数(Kernel)侧接口一致。 |
85| dataType | 输入 | 表示待排序数据的数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。该参数的取值与核函数(Kernel)接口参数srcLocal的数据类型保持一致。 |85| dataType | 输入 | 表示待排序数据的数据类型,参数类型为[AscendC::TensorDataType](../data_structures/TensorDataType.md)。该参数的取值与核函数(Kernel)接口参数srcLocal的数据类型保持一致。 |
86| config | 输入 | TopK计算的相关配置,TopKConfig类型定义如下方代码所示,包括算法选择、取最大值或最小值、是否对结果排序。该参数的配置需要与TopK核函数(Kernel)接口模板参数的配置保持一致。<br>algo:选择的排序算法。默认为MERGE_SORT算法,当前仅支持RADIX_SELECT算法,用户需要显式指定algo为TopKAlgo::RADIX_SELECT。<br>order:表示获取前k个最大值或者获取前k个最小值,取值如下:UNSET:默认值,按照函数参数isLargest的配置实现。isLargest为true时,取前k个最大值及其对应的索引,isLargest为false,取前k个最小值及其对应的索引。LARGEST:表示取前k个最大值及其对应的索引。取值为LARGEST时,函数参数isLargest的配置不生效。SMALLEST:表示取前k个最小值及其对应的索引。取值为SMALLEST时,函数参数isLargest的配置不生效。<br>sorted:表示是否对输出结果进行排序。取值为true,对输出结果进行排序;取值为false,不对输出结果进行排序。 |86| config | 输入 | TopK计算的相关配置,TopKConfig类型定义如下方代码所示,包括算法选择、取最大值或最小值、是否对结果排序。该参数的配置需要与TopK核函数(Kernel)接口模板参数的配置保持一致。<br>algo:选择的排序算法。默认为MERGE_SORT算法,当前仅支持RADIX_SELECT算法,用户需要显式指定algo为TopKAlgo::RADIX_SELECT。<br>order:表示获取前k个最大值或者获取前k个最小值,取值如下:UNSET:默认值,按照函数参数isLargest的配置实现。isLargest为true时,取前k个最大值及其对应的索引,isLargest为false,取前k个最小值及其对应的索引。LARGEST:表示取前k个最大值及其对应的索引。取值为LARGEST时,函数参数isLargest的配置不生效。SMALLEST:表示取前k个最小值及其对应的索引。取值为SMALLEST时,函数参数isLargest的配置不生效。<br>sorted:表示是否对输出结果进行排序。取值为true,对输出结果进行排序;取值为false,不对输出结果进行排序。 |
87| dataTypeSize | 输入 | 参与计算的srcLocal数据类型的大小,比如half=2, float=4 |87| dataTypeSize | 输入 | 参与计算的srcLocal数据类型的大小,比如half=2, float=4 |
@@ -107,9 +107,9 @@ enum class TopKOrder { UNSET, LARGEST, SMALLEST };
107| outter | 输入 | 表示TopK接口输入srcLocal的外轴长度。 |107| outter | 输入 | 表示TopK接口输入srcLocal的外轴长度。 |
108| k | 输入 | 获取前k个最大值或最小值及其对应的索引。 |108| k | 输入 | 获取前k个最大值或最小值及其对应的索引。 |
109| dataTypeSize | 输入 | 参与计算的srcLocal数据类型的大小,比如half=2, float=4。 |109| dataTypeSize | 输入 | 参与计算的srcLocal数据类型的大小,比如half=2, float=4。 |
110-| isInitIndex | 输入 | 是否传入输入数据对应的索引,与kernel侧接口一致。 |110+| isInitIndex | 输入 | 是否传入输入数据对应的索引,与核函数(Kernel)侧接口一致。 |
111-| mode | 输入 | 选择TopKMode::TOPK_NORMAL模式或者TopKMode::TOPK_NSMALL模式,与kernel侧接口一致。 |111+| mode | 输入 | 选择TopKMode::TOPK_NORMAL模式或者TopKMode::TOPK_NSMALL模式,与核函数(Kernel)侧接口一致。 |
112-| isLargest | 输入 | 表示降序/升序,true表示降序,false表示升序。与kernel侧接口一致。 |112+| isLargest | 输入 | 表示降序/升序,true表示降序,false表示升序。与核函数(Kernel)侧接口一致。 |
113| topKTiling | 输出 | 输出TopK接口所需的tiling信息。 |113| topKTiling | 输出 | 输出TopK接口所需的tiling信息。 |
114 114 
115## 返回值说明115## 返回值说明
@@ -124,7 +124,7 @@ TopKTilingFunc返回值为true/false,true表示成功拿到TopK的Tiling各项
124 124 
125## 调用示例125## 调用示例
126 126 
127-如下样例介绍了使用TopK高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。127+如下样例介绍了使用TopK高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。
128 128 
1291. 将TopK Tiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。1291. 将TopK Tiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
130 130 
@@ -151,7 +151,7 @@ TopKTilingFunc返回值为true/false,true表示成功拿到TopK的Tiling各项
151 } // namespace optiling151 } // namespace optiling
152 ```152 ```
153 153 
154-2. Tiling实现函数中,首先调用GetTopKMaxMinTmpSize接口获取TopK接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape等信息获取TopK kernel侧接口所需tiling参数。MERGE\_SORT算法参考如下调用示例。154+2. Tiling实现函数中,首先调用GetTopKMaxMinTmpSize接口获取TopK接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape等信息获取TopK核函数(Kernel)侧接口所需tiling参数。MERGE\_SORT算法参考如下调用示例。
155 155 
156 ```156 ```
157 namespace optiling {157 namespace optiling {
@@ -273,7 +273,7 @@ TopKTilingFunc返回值为true/false,true表示成功拿到TopK的Tiling各项
273 } // namespace optiling273 } // namespace optiling
274 ```274 ```
275 275 
276-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的TopK Tiling信息传入TopK接口参与计算。完整的kernel侧样例请参考[调用示例](TopK.md#section94691236101419)。276+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的TopK Tiling信息传入TopK接口参与计算。完整的核函数(Kernel)侧样例请参考[调用示例](TopK.md#section94691236101419)。
277 277 
278 ```278 ```
279 extern "C" __global__ __aicore__ void topk_custom(279 extern "C" __global__ __aicore__ void topk_custom(
@@ -93,7 +93,7 @@
93 93 
94另外,提供了一个核函数(Kernel)侧计算Tiling的接口,针对Broadcast的实现计算Tiling,获取Tiling结果。该接口的模板参数功能与支持动态shape的Broadcast接口模板参数相同,其余参数说明请参见[表5](#table5458981523)。94另外,提供了一个核函数(Kernel)侧计算Tiling的接口,针对Broadcast的实现计算Tiling,获取Tiling结果。该接口的模板参数功能与支持动态shape的Broadcast接口模板参数相同,其余参数说明请参见[表5](#table5458981523)。
95 95 
96-- **kernel侧tiling计算接口**96+- **核函数(Kernel)侧tiling计算接口**
97 97 
98 <!-- npu="950" id12 -->98 <!-- npu="950" id12 -->
99 仅在Ascend 950PR/Ascend 950DT上支持。99 仅在Ascend 950PR/Ascend 950DT上支持。
@@ -145,7 +145,7 @@
145| srcShape | 输入 | 输入tensor的shape:uint32_t类型的数组,长度取值范围为[1, 9]。输入/输出的shape维度数目必须一致,且满足条件dstShape[i] >= srcShape[i]。<br><br>当srcShape[i]的值为1,且dstShape[i]不等于srcShape[i]时,表示i轴为广播轴。 |145| srcShape | 输入 | 输入tensor的shape:uint32_t类型的数组,长度取值范围为[1, 9]。输入/输出的shape维度数目必须一致,且满足条件dstShape[i] >= srcShape[i]。<br><br>当srcShape[i]的值为1,且dstShape[i]不等于srcShape[i]时,表示i轴为广播轴。 |
146| tiling | 输入 | Broadcast接口所需的Tiling信息。BroadcastTiling*类型,通过调用核函数(Kernel)侧的tiling计算接口GetBroadcastTilingInfo获取。 |146| tiling | 输入 | Broadcast接口所需的Tiling信息。BroadcastTiling*类型,通过调用核函数(Kernel)侧的tiling计算接口GetBroadcastTilingInfo获取。 |
147 147 
148-**表5** kernel侧tiling计算接口参数说明148+**表5** 核函数(Kernel)侧tiling计算接口参数说明
149 149 
150<a name="table5458981523"></a>150<a name="table5458981523"></a>
151 151 
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧Broadcast接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧Broadcast接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小;
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -23,8 +23,8 @@ void GetBroadCastMaxMinTmpSize(const platform_ascendc::PlatformAscendC& ascendcP
23| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |23| srcShape | 输入 | 输入的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
24| dstShape | 输入 | 输出的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |24| dstShape | 输入 | 输出的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md)。 |
25| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |25| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
26-| isReuseSource | 输入 | 是否复用源操作数输入的空间,与kernel侧接口一致。 |26+| isReuseSource | 输入 | 是否复用源操作数输入的空间,与核函数(Kernel)侧接口一致。 |
27-| maxValue | 输出 | Broadcast接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |27+| maxValue | 输出 | Broadcast接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
28| minValue | 输出 | Broadcast接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |28| minValue | 输出 | Broadcast接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
29 29 
30## 返回值说明30## 返回值说明
@@ -2,10 +2,10 @@
2 2 
3## 功能说明3## 功能说明
4 4 
5-kernel侧TransData接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到kernel侧使用。5+核函数(Kernel)侧TransData接口的计算需要开发者预留/申请临时空间,本接口用于在host侧获取预留/申请的最大和最小临时空间大小,开发者基于此范围选择合适的空间大小作为Tiling参数传递到核函数(Kernel)侧使用。
6 6 
7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。7- 为保证功能正确,预留/申请的临时空间大小不能小于最小临时空间大小。
8-- 在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。8+- 在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。该接口**最大临时空间当前等于最小临时空间**。
9 9 
10## 函数原型10## 函数原型
11 11 
@@ -26,7 +26,7 @@ void PadTilingFunc(const AscendC::TensorShape srcShape, const AscendC::TensorSha
26| --- | --- | --- |26| --- | --- | --- |
27| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),shape为二维。 |27| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),shape为二维。 |
28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |28| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
29-| maxValue | 输出 | Pad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |29+| maxValue | 输出 | Pad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
30| minValue | 输出 | Pad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |30| minValue | 输出 | Pad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
31 31 
32**表2** **PadTilingFunc接口参数说明**32**表2** **PadTilingFunc接口参数说明**
@@ -49,7 +49,7 @@ void PadTilingFunc(const AscendC::TensorShape srcShape, const AscendC::TensorSha
49 49 
50## 调用示例50## 调用示例
51 51 
52-如下样例介绍了使用Pad高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中输入Tensor的shape信息和原始shape的信息为\[320, 63\],输入的数据类型为half。52+如下样例介绍了使用Pad高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中输入Tensor的shape信息和原始shape的信息为\[320, 63\],输入的数据类型为half。
53 53 
541. 将PadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。541. 将PadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
55 55 
@@ -62,7 +62,7 @@ void PadTilingFunc(const AscendC::TensorShape srcShape, const AscendC::TensorSha
62 END_TILING_DATA_DEF;62 END_TILING_DATA_DEF;
63 ```63 ```
64 64 
65-2. Tiling实现函数中,首先调用**GetPadMaxMinTmpSize**接口获取Pad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Pad kernel侧接口所需tiling参数。65+2. Tiling实现函数中,首先调用**GetPadMaxMinTmpSize**接口获取Pad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Pad核函数(Kernel)侧接口所需tiling参数。
66 66 
67 ```67 ```
68 namespace optiling {68 namespace optiling {
@@ -98,7 +98,7 @@ void PadTilingFunc(const AscendC::TensorShape srcShape, const AscendC::TensorSha
98 } // namespace optiling98 } // namespace optiling
99 ```99 ```
100 100 
101-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的Pad Tiling信息传入Pad接口参与计算。完整的kernel侧样例请参考[调用示例](Pad.md#调用示例)。101+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的Pad Tiling信息传入Pad接口参与计算。完整的核函数(Kernel)侧样例请参考[调用示例](Pad.md#调用示例)。
102 102 
103 ```103 ```
104 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)104 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -54,7 +54,7 @@
54| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),具体srcShape传入格式为:<br><br>场景1:[B, N, S, H/N]<br><br>场景2:[B, N, S, H/N]<br><br>场景3:[B, N, S, H/N]<br><br>场景4:[B, N, S, H/N]<br><br>场景5:[B, N, S, H/N]<br><br>场景6:[B, N, S, H/N]<br><br>场景7:[H, W]<!-- npu="950" id1 --><br><br>场景13:[H, W]或者[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景14:[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景15:[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景16:[H, W],仅支持Ascend 950PR/Ascend 950DT。<!-- end id1 --> |54| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),具体srcShape传入格式为:<br><br>场景1:[B, N, S, H/N]<br><br>场景2:[B, N, S, H/N]<br><br>场景3:[B, N, S, H/N]<br><br>场景4:[B, N, S, H/N]<br><br>场景5:[B, N, S, H/N]<br><br>场景6:[B, N, S, H/N]<br><br>场景7:[H, W]<!-- npu="950" id1 --><br><br>场景13:[H, W]或者[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景14:[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景15:[N, H, W],仅支持Ascend 950PR/Ascend 950DT。<br><br>场景16:[H, W],仅支持Ascend 950PR/Ascend 950DT。<!-- end id1 --> |
55| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |55| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
56| transposeTypeIn | 输入 | 选择数据排布及reshape的类型,根据输入数字选择对应的场景,参数范围为[1,7]。<!-- npu="950" id2 -->针对Ascend 950PR/Ascend 950DT,该参数取值范围为[1, 7]和[13, 16]。<!-- end id2 --><br><br>场景1(NZ2ND,1、2轴互换):1<br><br>场景2(NZ2NZ,1、2轴互换):2<br><br>场景3(NZ2NZ,尾轴切分):3<br><br>场景4(NZ2ND,尾轴切分):4<br><br>场景5(NZ2ND,尾轴合并):5<br><br>场景6(NZ2NZ,尾轴合并):6<br><br>场景7(二维转置):7<!-- npu="950" id5 --><br><br>场景13 (二维转置或者三维转置中后两维转置):13,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景14 (三维转置中第一维和第二维互换):14,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景15 (三维转置中第一维和第三维互换):15,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景16 (使用交织指令进行两维ND2NZ转置):16,仅支持Ascend 950PR/Ascend 950DT。<!-- end id5 --> |56| transposeTypeIn | 输入 | 选择数据排布及reshape的类型,根据输入数字选择对应的场景,参数范围为[1,7]。<!-- npu="950" id2 -->针对Ascend 950PR/Ascend 950DT,该参数取值范围为[1, 7]和[13, 16]。<!-- end id2 --><br><br>场景1(NZ2ND,1、2轴互换):1<br><br>场景2(NZ2NZ,1、2轴互换):2<br><br>场景3(NZ2NZ,尾轴切分):3<br><br>场景4(NZ2ND,尾轴切分):4<br><br>场景5(NZ2ND,尾轴合并):5<br><br>场景6(NZ2NZ,尾轴合并):6<br><br>场景7(二维转置):7<!-- npu="950" id5 --><br><br>场景13 (二维转置或者三维转置中后两维转置):13,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景14 (三维转置中第一维和第二维互换):14,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景15 (三维转置中第一维和第三维互换):15,仅支持Ascend 950PR/Ascend 950DT。<br><br>场景16 (使用交织指令进行两维ND2NZ转置):16,仅支持Ascend 950PR/Ascend 950DT。<!-- end id5 --> |
57-| maxValue | 输出 | Transpose接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |57+| maxValue | 输出 | Transpose接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
58| minValue | 输出 | Transpose接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |58| minValue | 输出 | Transpose接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。 |
59 59 
60**表2** **GetTransposeTilingInfo接口参数列表**60**表2** **GetTransposeTilingInfo接口参数列表**
@@ -77,7 +77,7 @@
77 77 
78## 调用示例78## 调用示例
79 79 
80-如下样例介绍了使用Transpose高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中为场景1,输入Tensor的shape大小为\[1, 2, 64, 32\],输入的数据类型为half。80+如下样例介绍了使用Transpose高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中为场景1,输入Tensor的shape大小为\[1, 2, 64, 32\],输入的数据类型为half。
81 81 
821. 将ConfusionTransposeTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。821. 将ConfusionTransposeTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
83 83 
@@ -91,7 +91,7 @@
91 END_TILING_DATA_DEF;91 END_TILING_DATA_DEF;
92 ```92 ```
93 93 
94-2. Tiling实现函数中,首先调用**GetTransposeMaxMinTmpSize**接口获取Transpose接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Transpose kernel侧接口所需Tiling参数。94+2. Tiling实现函数中,首先调用**GetTransposeMaxMinTmpSize**接口获取Transpose接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取Transpose核函数(Kernel)侧接口所需Tiling参数。
95 95 
96 ```96 ```
97 namespace optiling {97 namespace optiling {
@@ -127,7 +127,7 @@
127 } // namespace optiling127 } // namespace optiling
128 ```128 ```
129 129 
130-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的ConfusionTransposeTiling信息传入Transpose接口参与计算。完整的kernel侧样例请参考[Transpose](Transpose.md)。130+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的ConfusionTransposeTiling信息传入Transpose接口参与计算。完整的核函数(Kernel)侧样例请参考[Transpose](Transpose.md)。
131 131 
132 ```132 ```
133 extern "C" __global__ __aicore__ void func_custom(GM_ADDR src_gm, GM_ADDR dst_gm, GM_ADDR workspace, GM_ADDR tiling)133 extern "C" __global__ __aicore__ void func_custom(GM_ADDR src_gm, GM_ADDR dst_gm, GM_ADDR workspace, GM_ADDR tiling)
@@ -27,7 +27,7 @@ void UnPadTilingFunc(const AscendC::TensorShape srcShape, const uint32_t stackBu
27| ascendcPlatform | 输入 | 传入硬件平台的信息,PlatformAscendC定义请参见[构造及析构函数](../../../Utils-API/platform_info/PlatformAscendC/constructor_and_destructor.md)。 |27| ascendcPlatform | 输入 | 传入硬件平台的信息,PlatformAscendC定义请参见[构造及析构函数](../../../Utils-API/platform_info/PlatformAscendC/constructor_and_destructor.md)。 |
28| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),shape为二维。 |28| srcShape | 输入 | 输入Tensor的shape信息,参数类型为[AscendC::TensorShape](../data_structures/TensorShape.md),shape为二维。 |
29| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |29| typeSize | 输入 | 输入的数据类型大小,单位为字节。比如输入的数据类型为half,此处应传入2。 |
30-| maxValue | 输出 | UnPad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |30+| maxValue | 输出 | UnPad接口能完成计算所需的最大临时空间大小,超出该值的空间不会被该接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间预留/申请。最大空间大小为0表示计算不需要临时空间。<br>maxValue仅作为参考值,有可能大于Unified Buffer(UB)剩余空间的大小,该场景下,开发者需要根据UB剩余空间的大小来选取合适的临时空间大小。 |
31| minValue | 输出 | UnPad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |31| minValue | 输出 | UnPad接口能完成计算所需最小临时空间大小。为保证功能正确,接口计算时预留/申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
32 32 
33**表2** **UnPadTilingFunc接口参数说明**33**表2** **UnPadTilingFunc接口参数说明**
@@ -49,7 +49,7 @@ void UnPadTilingFunc(const AscendC::TensorShape srcShape, const uint32_t stackBu
49 49 
50## 调用示例50## 调用示例
51 51 
52-如下样例介绍了使用UnPad高阶API时host侧获取Tiling参数的流程以及该参数如何在kernel侧使用。样例中原始shape的大小为\[320, 64\],unpad后的目标shape大小为\[320, 63\],输入的数据类型为half。52+如下样例介绍了使用UnPad高阶API时host侧获取Tiling参数的流程以及该参数如何在核函数(Kernel)侧使用。样例中原始shape的大小为\[320, 64\],unpad后的目标shape大小为\[320, 63\],输入的数据类型为half。
53 53 
541. 将UnPadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。541. 将UnPadTiling结构体参数增加至TilingData结构体,作为TilingData结构体的一个字段。
55 55 
@@ -62,7 +62,7 @@ void UnPadTilingFunc(const AscendC::TensorShape srcShape, const uint32_t stackBu
62 END_TILING_DATA_DEF;62 END_TILING_DATA_DEF;
63 ```63 ```
64 64 
65-2. Tiling实现函数中,首先调用**GetUnPadMaxMinTmpSize**接口获取UnPad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取UnPad kernel侧接口所需tiling参数。65+2. Tiling实现函数中,首先调用**GetUnPadMaxMinTmpSize**接口获取UnPad接口能完成计算所需最大和最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小;然后根据输入shape、剩余的可供计算的空间大小等信息获取UnPad核函数(Kernel)侧接口所需tiling参数。
66 66 
67 ```67 ```
68 namespace optiling {68 namespace optiling {
@@ -96,7 +96,7 @@ void UnPadTilingFunc(const AscendC::TensorShape srcShape, const uint32_t stackBu
96 } // namespace optiling96 } // namespace optiling
97 ```97 ```
98 98 
99-3. 对应的kernel侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的UnPad Tiling信息传入UnPad接口参与计算。完整的kernel侧样例请参考[调用示例](UnPad.md#调用示例)。99+3. 对应的核函数(Kernel)侧通过在核函数(Kernel)中调用GET\_TILING\_DATA获取TilingData,继而将TilingData中的UnPad Tiling信息传入UnPad接口参与计算。完整的核函数(Kernel)侧样例请参考[调用示例](UnPad.md#调用示例)。
100 100 
101 ```101 ```
102 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)102 extern "C" __global__ __aicore__ void func_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -28,7 +28,7 @@
28 28 
29## 功能说明<a name="zh-cn_topic_0000001526206862_section212607105720"></a>29## 功能说明<a name="zh-cn_topic_0000001526206862_section212607105720"></a>
30 30 
31-用于获取算子kernel入口函数传入的Tiling信息,并填入注册的TilingData结构体中,此函数会以宏展开的方式进行编译。对应的算子host实现中需要定义TilingData结构体,实现并注册计算TilingData的Tiling函数。如果用户通过[TilingData结构注册](../../../Utils-API/Tiling_data_structure_register/TilingData_struct_register.md)注册了多个TilingData结构体,使用该接口返回默认注册的结构体。31+用于获取算子核函数(Kernel)入口函数传入的Tiling信息,并填入注册的TilingData结构体中,此函数会以宏展开的方式进行编译。对应的算子host实现中需要定义TilingData结构体,实现并注册计算TilingData的Tiling函数。如果用户通过[TilingData结构注册](../../../Utils-API/Tiling_data_structure_register/TilingData_struct_register.md)注册了多个TilingData结构体,使用该接口返回默认注册的结构体。
32 32 
33## 函数原型<a name="zh-cn_topic_0000001526206862_section1630753514297"></a>33## 函数原型<a name="zh-cn_topic_0000001526206862_section1630753514297"></a>
34 34 
@@ -66,8 +66,8 @@ GET_TILING_DATA(tiling_data, tiling_arg)
66 66 
67## 约束说明<a name="zh-cn_topic_0000001526206862_section65498832"></a>67## 约束说明<a name="zh-cn_topic_0000001526206862_section65498832"></a>
68 68 
69-- 本函数需在算子kernel代码处使用,并且传入的tiling\_data参数不需要声明类型。69+- 本函数需在算子核函数(Kernel)代码处使用,并且传入的tiling\_data参数不需要声明类型。
70-- 暂不支持kernel直调工程。70+- 暂不支持核函数(Kernel)直调工程。
71 71 
72## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>72## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>
73 73 
@@ -80,7 +80,7 @@ GET_TILING_DATA_MEMBER(struct_name, mem_name, tiling_data, tiling_arg)
80 80 
81## 约束说明<a name="zh-cn_topic_0000001526206862_section65498832"></a>81## 约束说明<a name="zh-cn_topic_0000001526206862_section65498832"></a>
82 82 
83-- 本函数需在算子kernel代码处使用,并且传入的tiling\_data参数不需要声明类型。83+- 本函数需在算子核函数(Kernel)代码处使用,并且传入的tiling\_data参数不需要声明类型。
84- 暂不支持核函数(Kernel)直调工程。84- 暂不支持核函数(Kernel)直调工程。
85 85 
86## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>86## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>
@@ -30,7 +30,7 @@
30 30 
31头文件路径为:`"utils/base/sys_macros.h"`31头文件路径为:`"utils/base/sys_macros.h"`
32 32 
33-用于在kernel侧注册用户使用标准C++语法自定义的默认TilingData结构体。33+用于在核函数(Kernel)侧注册用户使用标准C++语法自定义的默认TilingData结构体。
34 34 
35注册TilingData结构体用于告知框架侧用户使用标准C++语法来定义TilingData,同时告知框架TilingData结构体类型,用于框架做tiling数据解析。35注册TilingData结构体用于告知框架侧用户使用标准C++语法来定义TilingData,同时告知框架TilingData结构体类型,用于框架做tiling数据解析。
36 36 
@@ -71,7 +71,7 @@ REGISTER_TILING_DEFAULT(TILING_STRUCT)
71```71```
72extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *tiling)72extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *tiling)
73{73{
74- REGISTER_TILING_DEFAULT(optiling::TilingData); // 用于在kernel侧注册用户使用标准C++语法自定义的默认TilingData结构体74+ REGISTER_TILING_DEFAULT(optiling::TilingData); // 用于在核函数(Kernel)侧注册用户使用标准C++语法自定义的默认TilingData结构体
75 GET_TILING_DATA(tilingData, tiling);75 GET_TILING_DATA(tilingData, tiling);
76 KernelAdd op;76 KernelAdd op;
77 op.Init(x, y, z, tilingData.blkDim, tilingData.totalSize, tilingData.splitTile);77 op.Init(x, y, z, tilingData.blkDim, tilingData.totalSize, tilingData.splitTile);
@@ -28,7 +28,7 @@
28 28 
29## 功能说明<a name="zh-cn_topic_0000001526206862_section212607105720"></a>29## 功能说明<a name="zh-cn_topic_0000001526206862_section212607105720"></a>
30 30 
31-用于在kernel侧注册与TilingKey相匹配的TilingData自定义结构体;该接口需提供一个逻辑表达式,逻辑表达式以字符串“TILING\_KEY\_VAR”代指实际TilingKey,表达TilingKey所满足的范围。31+用于在核函数(Kernel)侧注册与TilingKey相匹配的TilingData自定义结构体;该接口需提供一个逻辑表达式,逻辑表达式以字符串“TILING\_KEY\_VAR”代指实际TilingKey,表达TilingKey所满足的范围。
32 32 
33## 函数原型<a name="zh-cn_topic_0000001526206862_section1630753514297"></a>33## 函数原型<a name="zh-cn_topic_0000001526206862_section1630753514297"></a>
34 34 
@@ -70,7 +70,7 @@ REGISTER_TILING_FOR_TILINGKEY(EXPRESSION, TILING_STRUCT)
70- EXPRESSION当前支持位运算:&、|、\~、^;移位运算符:<<、\>\>;算术运算:+、-、\*、/、%;条件运算符:==、!=、\>、<、\>=、<=;逻辑与&&、或||以及\(\)。优先级同C++。70- EXPRESSION当前支持位运算:&、|、\~、^;移位运算符:<<、\>\>;算术运算:+、-、\*、/、%;条件运算符:==、!=、\>、<、\>=、<=;逻辑与&&、或||以及\(\)。优先级同C++。
71- 若TilingData结构体在命名空间内,注册时需要携带对应的命名空间作用域符。71- 若TilingData结构体在命名空间内,注册时需要携带对应的命名空间作用域符。
72- 不支持同个TilingKey指向不同TilingData结构体,会出现拦截报错。72- 不支持同个TilingKey指向不同TilingData结构体,会出现拦截报错。
73-- 暂不支持kernel直调工程。73+- 暂不支持核函数(Kernel)直调工程。
74 74 
75## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>75## 调用示例<a name="zh-cn_topic_0000001526206862_section97001499599"></a>
76 76 
@@ -30,7 +30,7 @@
30 30 
31头文件路径为:`"utils/base/sys_macros.h"`31头文件路径为:`"utils/base/sys_macros.h"`
32 32 
33-在核函数(Kernel)中判断本次执行时的tiling\_key是否等于host侧运行时设置的某个key,从而标识tiling\_key==key的一条kernel分支。33+在核函数(Kernel)中判断本次执行时的tiling\_key是否等于host侧运行时设置的某个key,从而标识tiling\_key==key的一条核函数(Kernel)分支。
34 34 
35## 函数原型<a name="zh-cn_topic_0000001610027821_section1630753514297"></a>35## 函数原型<a name="zh-cn_topic_0000001610027821_section1630753514297"></a>
36 36 
@@ -30,11 +30,11 @@
30 30 
31头文件路径为:`"utils/base/sys_macros.h"`31头文件路径为:`"utils/base/sys_macros.h"`
32 32 
33-用于用户自定义设置kernel类型,控制算子执行时只启动该类型的核,避免启动不需要工作的核,缩短核启动开销。33+用于用户自定义设置核函数(Kernel)类型,控制算子执行时只启动该类型的核,避免启动不需要工作的核,缩短核启动开销。
34 34 
35## 函数原型<a name="zh-cn_topic_0000001610027821_section1630753514297"></a>35## 函数原型<a name="zh-cn_topic_0000001610027821_section1630753514297"></a>
36 36 
37-- 设置全局默认的kernel type,对所有的tiling key生效。37+- 设置全局默认的核函数(Kernel)类型,对所有的tiling key生效。
38 38 
39 当前支持在自定义算子工程和核函数(Kernel)直调工程中使用。39 当前支持在自定义算子工程和核函数(Kernel)直调工程中使用。
40 40 
@@ -42,7 +42,7 @@
42 KERNEL_TASK_TYPE_DEFAULT(value)42 KERNEL_TASK_TYPE_DEFAULT(value)
43 ```43 ```
44 44 
45-- 设置某一个具体的tiling key对应的kernel type45+- 设置某一个具体的tiling key对应的核函数(Kernel)类型
46 46 
47 当前仅支持在自定义算子工程中使用。47 当前仅支持在自定义算子工程中使用。
48 48 
@@ -74,7 +74,7 @@
74</td>74</td>
75<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.2.4.1.2 "><p id="p18921181812316"><a name="p18921181812316"></a><a name="p18921181812316"></a>输入</p>75<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.2.4.1.2 "><p id="p18921181812316"><a name="p18921181812316"></a><a name="p18921181812316"></a>输入</p>
76</td>76</td>
77-<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.2.4.1.3 "><p id="p14921918033"><a name="p14921918033"></a><a name="p14921918033"></a>设置的kernel类型,可选值范围,kernel类型具体说明请参考<a href="#table76335324910">表2</a>。不同硬件架构支持的参数取值不同,具体支持的参数取值请参考<a href="#li693212153417">kernel&nbsp;type取值约束</a>。</p>77+<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.2.4.1.3 "><p id="p14921918033"><a name="p14921918033"></a><a name="p14921918033"></a>设置的核函数(Kernel)类型,可选值范围,核函数(Kernel)类型具体说明请参考<a href="#table76335324910">表2</a>。不同硬件架构支持的参数取值不同,具体支持的参数取值请参考<a href="#li693212153417">kernel&nbsp;type取值约束</a>。</p>
78<a name="screen2031620461932"></a><a name="screen2031620461932"></a><pre class="screen" codetype="Cpp" id="screen2031620461932">enum KernelMetaType {78<a name="screen2031620461932"></a><a name="screen2031620461932"></a><pre class="screen" codetype="Cpp" id="screen2031620461932">enum KernelMetaType {
79 KERNEL_TYPE_AIV_ONLY,79 KERNEL_TYPE_AIV_ONLY,
80 KERNEL_TYPE_AIC_ONLY,80 KERNEL_TYPE_AIC_ONLY,
@@ -93,7 +93,7 @@
93</tbody>93</tbody>
94</table>94</table>
95 95 
96-**表2** kernel type取值说明96+**表2** 核函数(Kernel)类型取值说明
97 97 
98<a name="table76335324910"></a>98<a name="table76335324910"></a>
99<table><thead align="left"><tr id="row13633133211918"><th class="cellrowborder" valign="top" width="35.8%" id="mcps1.2.3.1.1"><p id="p196346329913"><a name="p196346329913"></a><a name="p196346329913"></a>参数</p>99<table><thead align="left"><tr id="row13633133211918"><th class="cellrowborder" valign="top" width="35.8%" id="mcps1.2.3.1.1"><p id="p196346329913"><a name="p196346329913"></a><a name="p196346329913"></a>参数</p>
@@ -160,7 +160,7 @@
160 160 
161## 约束说明<a name="zh-cn_topic_0000001610027821_section65498832"></a>161## 约束说明<a name="zh-cn_topic_0000001610027821_section65498832"></a>
162 162 
163-- <a name="li693212153417"></a>kernel type取值约束163+- <a name="li693212153417"></a>核函数(Kernel)类型取值约束
164 <!-- npu="950" id100 -->164 <!-- npu="950" id100 -->
165 - Ascend 950PR/Ascend 950DT,支持KERNEL\_TYPE\_AIV\_ONLY、 KERNEL\_TYPE\_AIC\_ONLY、KERNEL\_TYPE\_MIX\_AIV\_1\_0、KERNEL\_TYPE\_MIX\_AIC\_1\_0、KERNEL\_TYPE\_MIX\_AIC\_1\_1、KERNEL\_TYPE\_MIX\_AIC\_1\_2。165 - Ascend 950PR/Ascend 950DT,支持KERNEL\_TYPE\_AIV\_ONLY、 KERNEL\_TYPE\_AIC\_ONLY、KERNEL\_TYPE\_MIX\_AIV\_1\_0、KERNEL\_TYPE\_MIX\_AIC\_1\_0、KERNEL\_TYPE\_MIX\_AIC\_1\_1、KERNEL\_TYPE\_MIX\_AIC\_1\_2。
166 <!-- end id100 -->166 <!-- end id100 -->
@@ -174,16 +174,16 @@
174 - Atlas 推理系列产品,支持KERNEL\_TYPE\_AICORE、KERNEL\_TYPE\_MIX\_VECTOR\_CORE。174 - Atlas 推理系列产品,支持KERNEL\_TYPE\_AICORE、KERNEL\_TYPE\_MIX\_VECTOR\_CORE。
175 <!-- end id103 -->175 <!-- end id103 -->
176 176 
177-- **KERNEL\_TASK\_TYPE**优先级高于**KERNEL\_TASK\_TYPE\_DEFAULT**,同时设置了全局kernel type和某一个tiling key的kernel type,该tiling key的kernel type以**KERNEL\_TASK\_TYPE**设置的为准。177+- **KERNEL\_TASK\_TYPE**优先级高于**KERNEL\_TASK\_TYPE\_DEFAULT**,同时设置了全局核函数(Kernel)类型和某一个tiling key的核函数(Kernel)类型,该tiling key的核函数(Kernel)类型以**KERNEL\_TASK\_TYPE**设置的为准。
178-- 没有设置全局默认kernel type的情况下,如果开发者只为其中的某几个tiling key设置kernel type,即部分tiling key没有设置kernel type,会导致算子kernel编译报错。178+- 没有设置全局默认核函数(Kernel)类型的情况下,如果开发者只为其中的某几个tiling key设置核函数(Kernel)类型,即部分tiling key没有设置核函数(Kernel)类型,会导致算子核函数(Kernel)编译报错。
179-- 当设置具体的kernel task type时,用户的算子实现需要与kernel type相匹配。比如用户设置kernel type为KERNEL\_TYPE\_MIX\_AIC\_1\_2,则算子内部实现应与核配比AIC:AIV为1:2相对应;若用户设置kernel type为KERNEL\_TYPE\_AIC\_ONLY,则算子内部实现应该为纯cube逻辑,不应该存在vector部分的逻辑。其他的kernel type类似。179+- 当设置具体的核函数(Kernel)任务类型时,用户的算子实现需要与核函数(Kernel)类型相匹配。比如用户设置核函数(Kernel)类型为KERNEL\_TYPE\_MIX\_AIC\_1\_2,则算子内部实现应与核配比AIC:AIV为1:2相对应;若用户设置核函数(Kernel)类型为KERNEL\_TYPE\_AIC\_ONLY,则算子内部实现应该为纯cube逻辑,不应该存在vector部分的逻辑。其他的核函数(Kernel)型类似。
180-- 当纯cube或者纯vec算子强制设定kernel type为MIX类型时,workspace的大小不能设置为0,需要设置一个大于0的值(比如16、32等)。180+- 当纯cube或者纯vec算子强制设定核函数(Kernel)类型为MIX类型时,workspace的大小不能设置为0,需要设置一个大于0的值(比如16、32等)。
181- 使用[Tiling模板编程](../../../Utils-API/Tiling_template_programming/Tiling_template_programming.md)时,需要通过ASCENDC\_TPL\_KERNEL\_TYPE\_SEL设置核函数(Kernel)类型即可,无需再通过该接口进行设置,本接口不生效。181- 使用[Tiling模板编程](../../../Utils-API/Tiling_template_programming/Tiling_template_programming.md)时,需要通过ASCENDC\_TPL\_KERNEL\_TYPE\_SEL设置核函数(Kernel)类型即可,无需再通过该接口进行设置,本接口不生效。
182 182 
183## 调用示例<a name="zh-cn_topic_0000001610027821_section97001499599"></a>183## 调用示例<a name="zh-cn_topic_0000001610027821_section97001499599"></a>
184 184 
185- 示例一:启用VectorCore样例185- 示例一:启用VectorCore样例
186- 1. 完成算子kernel侧开发时,需要通过本接口启用Vector Core,算子执行时会同时启动AI Core和Vector Core,此时AI Core会当成Vector Core使用。示例如下:186+ 1. 完成算子核函数(Kernel)侧开发时,需要通过本接口启用Vector Core,算子执行时会同时启动AI Core和Vector Core,此时AI Core会当成Vector Core使用。示例如下:
187 187 
188 ```188 ```
189 extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *workspace, __gm__ uint8_t *tiling)189 extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *workspace, __gm__ uint8_t *tiling)
@@ -221,7 +221,7 @@
221 }221 }
222 ```222 ```
223 223 
224-- 示例二:设置某一个具体的tiling key对应的kernel type。如下代码为伪代码,不可直接运行。224+- 示例二:设置某一个具体的tiling key对应的核函数(Kernel)类型。如下代码为伪代码,不可直接运行。
225 225 
226 ```226 ```
227 extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *workspace, __gm__ uint8_t *tiling)227 extern "C" __global__ __aicore__ void add_custom(__gm__ uint8_t *x, __gm__ uint8_t *y, __gm__ uint8_t *z, __gm__ uint8_t *workspace, __gm__ uint8_t *tiling)
@@ -232,12 +232,12 @@
232 }232 }
233 KernelAdd op;233 KernelAdd op;
234 op.Init(x, y, z, tilingData.numBlocks, tilingData.totalLength, tilingData.tileNum);234 op.Init(x, y, z, tilingData.numBlocks, tilingData.totalLength, tilingData.tileNum);
235- KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY); // 设置默认的kernel类型为纯AIV类型235+ KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY); // 设置默认的核函数(Kernel)类型为纯AIV类型
236 if (TILING_KEY_IS(1)) {236 if (TILING_KEY_IS(1)) {
237- KERNEL_TASK_TYPE(1, KERNEL_TYPE_MIX_AIV_1_0); // 设置tiling key=1对应的kernel类型为MIX AIV 1:0237+ KERNEL_TASK_TYPE(1, KERNEL_TYPE_MIX_AIV_1_0); // 设置tiling key=1对应的核函数(Kernel)类型为MIX AIV 1:0
238 op.Process1();238 op.Process1();
239 } else if (TILING_KEY_IS(2)) {239 } else if (TILING_KEY_IS(2)) {
240- KERNEL_TASK_TYPE(2, KERNEL_TYPE_AIV_ONLY); // 设置tiling key=2对应的kernel类型为纯AIV类型240+ KERNEL_TASK_TYPE(2, KERNEL_TYPE_AIV_ONLY); // 设置tiling key=2对应的核函数(Kernel)类型为纯AIV类型
241 op.Process2();241 op.Process2();
242 }242 }
243 // ...243 // ...
@@ -28,7 +28,7 @@
28 28 
29## 功能说明<a name="section195171847105215"></a>29## 功能说明<a name="section195171847105215"></a>
30 30 
31-ListTensorDesc用来解析符合以下内存排布格式的数据,并在kernel侧根据索引获取储存对应数据的地址及shape信息。31+ListTensorDesc用来解析符合以下内存排布格式的数据,并在核函数(Kernel)侧根据索引获取储存对应数据的地址及shape信息。
32 32 
33![](../../../figures/ListTensorDesc.png)33![](../../../figures/ListTensorDesc.png)
34 34 
@@ -10,7 +10,7 @@
10| [Layout](aux_data_structures/Layout/Layout.md) | Layout数据结构是描述多维张量内存布局的基础模板类,通过编译时的形状(Shape)和步长(Stride)信息,实现逻辑坐标空间到一维内存地址空间的映射。 |10| [Layout](aux_data_structures/Layout/Layout.md) | Layout数据结构是描述多维张量内存布局的基础模板类,通过编译时的形状(Shape)和步长(Stride)信息,实现逻辑坐标空间到一维内存地址空间的映射。 |
11| [TensorTrait](aux_data_structures/TensorTrait/TensorTrait.md) | TensorTrait数据结构是描述Tensor相关信息的基础模板类,包含Tensor的数据类型、逻辑位置和Layout内存布局。 |11| [TensorTrait](aux_data_structures/TensorTrait/TensorTrait.md) | TensorTrait数据结构是描述Tensor相关信息的基础模板类,包含Tensor的数据类型、逻辑位置和Layout内存布局。 |
12| [ShapeInfo](aux_data_structures/ShapeInfo.md) | 存放LocalTensor或GlobalTensor的shape信息。 |12| [ShapeInfo](aux_data_structures/ShapeInfo.md) | 存放LocalTensor或GlobalTensor的shape信息。 |
13-| [ListTensorDesc](aux_data_structures/ListTensorDesc.md) | 解析符合指定内存排布格式的数据,在kernel侧根据索引获取存储对应数据的地址及shape信息。 |13+| [ListTensorDesc](aux_data_structures/ListTensorDesc.md) | 解析符合指定内存排布格式的数据,在核函数(Kernel)侧根据索引获取存储对应数据的地址及shape信息。 |
14| [TensorDesc](aux_data_structures/TensorDesc/TensorDesc.md) | 储存ListTensorDesc.GetDesc()中根据index获取对应的Tensor描述信息。 |14| [TensorDesc](aux_data_structures/TensorDesc/TensorDesc.md) | 储存ListTensorDesc.GetDesc()中根据index获取对应的Tensor描述信息。 |
15| [UnaryRepeatParams](aux_data_structures/UnaryRepeatParams.md) | 控制单操作数地址步长的数据结构,包含相邻迭代间和同一迭代内DataBlock的地址步长参数。 |15| [UnaryRepeatParams](aux_data_structures/UnaryRepeatParams.md) | 控制单操作数地址步长的数据结构,包含相邻迭代间和同一迭代内DataBlock的地址步长参数。 |
16| [BinaryRepeatParams](aux_data_structures/BinaryRepeatParams.md) | 控制双操作数地址步长的数据结构,包含相邻迭代间和同一迭代内DataBlock的地址步长参数。 |16| [BinaryRepeatParams](aux_data_structures/BinaryRepeatParams.md) | 控制双操作数地址步长的数据结构,包含相邻迭代间和同一迭代内DataBlock的地址步长参数。 |
@@ -550,14 +550,14 @@
550| [DumpAccChkPoint](debug_interface/onboard_print/DumpAccChkPoint.md) | 该接口Dump指定Tensor的内容。同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。区别于DumpTensor,使用该接口可以支持指定偏移位置的Tensor打印。 |550| [DumpAccChkPoint](debug_interface/onboard_print/DumpAccChkPoint.md) | 该接口Dump指定Tensor的内容。同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。区别于DumpTensor,使用该接口可以支持指定偏移位置的Tensor打印。 |
551| [PrintTimeStamp](debug_interface/onboard_print/PrintTimeStamp.md) | 提供时间戳打点功能,用于在算子核函数(Kernel)代码中标记关键执行点。 |551| [PrintTimeStamp](debug_interface/onboard_print/PrintTimeStamp.md) | 提供时间戳打点功能,用于在算子核函数(Kernel)代码中标记关键执行点。 |
552| [Trap](debug_interface/exception_detection/Trap.md) | 在核函数(Kernel)侧调用,NPU模式下会中断AI Core的运行,CPU模式下等同于assert。可用于核函数(Kernel)侧异常场景的调试。 |552| [Trap](debug_interface/exception_detection/Trap.md) | 在核函数(Kernel)侧调用,NPU模式下会中断AI Core的运行,CPU模式下等同于assert。可用于核函数(Kernel)侧异常场景的调试。 |
553-| [CheckLocalMemoryIA(ISASI)](debug_interface/exception_detection/CheckLocalMemoryIA_ISASI.md) | check设定范围内的UB读写行为,如果有设定范围的读写行为则会出现EXCEPTION报错,无设定范围的读写行为则不会报错。 |553+| [CheckLocalMemoryIA(ISASI)](debug_interface/exception_detection/CheckLocalMemoryIA_ISASI.md) | check设定范围内的Unified Buffer(UB读写行为,如果有设定范围的读写行为则会出现EXCEPTION报错,无设定范围的读写行为则不会报错。 |
554| [GmAlloc](debug_interface/cpu_twin_debug/GmAlloc.md) | 进行核函数(Kernel)的CPU侧运行验证时,用于创建共享内存:在/tmp目录下创建一个共享文件,并返回该文件的映射指针。 |554| [GmAlloc](debug_interface/cpu_twin_debug/GmAlloc.md) | 进行核函数(Kernel)的CPU侧运行验证时,用于创建共享内存:在/tmp目录下创建一个共享文件,并返回该文件的映射指针。 |
555| [ICPU_RUN_KF](debug_interface/cpu_twin_debug/ICPU_RUN_KF.md) | 进行核函数(Kernel)的CPU侧运行验证时,CPU调测总入口,完成CPU侧的算子程序调用。 |555| [ICPU_RUN_KF](debug_interface/cpu_twin_debug/ICPU_RUN_KF.md) | 进行核函数(Kernel)的CPU侧运行验证时,CPU调测总入口,完成CPU侧的算子程序调用。 |
556| [ICPU_SET_TILING_KEY](debug_interface/cpu_twin_debug/ICPU_SET_TILING_KEY.md) | 用于指定本次CPU调测使用的tilingKey。调测执行时,将只执行算子核函数(Kernel)中该tilingKey对应的分支。 |556| [ICPU_SET_TILING_KEY](debug_interface/cpu_twin_debug/ICPU_SET_TILING_KEY.md) | 用于指定本次CPU调测使用的tilingKey。调测执行时,将只执行算子核函数(Kernel)中该tilingKey对应的分支。 |
557| [GmFree](debug_interface/cpu_twin_debug/GmFree.md) | 进行核函数(Kernel)的CPU侧运行验证时,用于释放通过GmAlloc申请的共享内存。 |557| [GmFree](debug_interface/cpu_twin_debug/GmFree.md) | 进行核函数(Kernel)的CPU侧运行验证时,用于释放通过GmAlloc申请的共享内存。 |
558| [SetKernelMode](debug_interface/cpu_twin_debug/SetKernelMode.md) | 针对分离模式,CPU调测时,设置内核模式为单AIV模式,单AIC模式或者MIX模式,以分别支持单AIV矢量算子,单AIC矩阵算子,MIX混合算子的CPU调试。不调用该接口的情况下,默认为MIX模式。为保证算子代码在多个硬件平台兼容,耦合模式下也可以调用,该场景下接口不会生效,不影响正常调试。 |558| [SetKernelMode](debug_interface/cpu_twin_debug/SetKernelMode.md) | 针对分离模式,CPU调测时,设置内核模式为单AIV模式,单AIC模式或者MIX模式,以分别支持单AIV矢量算子,单AIC矩阵算子,MIX混合算子的CPU调试。不调用该接口的情况下,默认为MIX模式。为保证算子代码在多个硬件平台兼容,耦合模式下也可以调用,该场景下接口不会生效,不影响正常调试。 |
559-| [MetricsProfStart](debug_interface/performance_stats/MetricsProfStart.md) | 用于设置性能数据采集信号启动,和MetricsProfStop配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |559+| [MetricsProfStart](debug_interface/performance_stats/MetricsProfStart.md) | 用于设置性能数据采集信号启动,和MetricsProfStop配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |
560-| [MetricsProfStop](debug_interface/performance_stats/MetricsProfStop.md) | 设置性能数据采集信号停止,和MetricsProfStart配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |560+| [MetricsProfStop](debug_interface/performance_stats/MetricsProfStop.md) | 设置性能数据采集信号停止,和MetricsProfStart配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |
561| [MarkStamp](debug_interface/performance_stats/MarkStamp.md) | 用户通过调用接口,用于在算子执行过程中标记特定位置,便于后期通过流水图分析代码执行路径与性能热点。 |561| [MarkStamp](debug_interface/performance_stats/MarkStamp.md) | 用户通过调用接口,用于在算子执行过程中标记特定位置,便于后期通过流水图分析代码执行路径与性能热点。 |
562 562 
563## 工具接口563## 工具接口
@@ -610,18 +610,18 @@
610 610 
611| 接口名 | 功能描述 |611| 接口名 | 功能描述 |
612| --- | --- |612| --- | --- |
613-| [GET_TILING_DATA](Kernel-Tiling/GET_TILING_DATA.md) | 用于获取算子kernel入口函数传入的Tiling信息,并填入注册的TilingData结构体中,此函数会以宏展开的方式进行编译。对应的算子host实现中需要定义TilingData结构体,实现并注册计算TilingData的Tiling函数。如果用户通过TilingData结构注册注册了多个TilingData结构体,使用该接口返回默认注册的结构体。 |613+| [GET_TILING_DATA](Kernel-Tiling/GET_TILING_DATA.md) | 用于获取算子核函数(Kernel)入口函数传入的Tiling信息,并填入注册的TilingData结构体中,此函数会以宏展开的方式进行编译。对应的算子host实现中需要定义TilingData结构体,实现并注册计算TilingData的Tiling函数。如果用户通过TilingData结构注册注册了多个TilingData结构体,使用该接口返回默认注册的结构体。 |
614| [GET_TILING_DATA_WITH_STRUCT](Kernel-Tiling/GET_TILING_DATA_WITH_STRUCT.md) | 使用该接口指定结构体名称,可获取指定的tiling信息,并填入对应的Tiling结构体中,此函数会以宏展开的方式进行编译。与GET\_TILING\_DATA的区别是:GET\_TILING\_DATA只能获取默认注册的结构体,该接口可以根据指定的结构体名称获取对应的结构体,常用于针对不同的TilingKey注册了不同结构体的情况下。 |614| [GET_TILING_DATA_WITH_STRUCT](Kernel-Tiling/GET_TILING_DATA_WITH_STRUCT.md) | 使用该接口指定结构体名称,可获取指定的tiling信息,并填入对应的Tiling结构体中,此函数会以宏展开的方式进行编译。与GET\_TILING\_DATA的区别是:GET\_TILING\_DATA只能获取默认注册的结构体,该接口可以根据指定的结构体名称获取对应的结构体,常用于针对不同的TilingKey注册了不同结构体的情况下。 |
615| [GET_TILING_DATA_MEMBER](Kernel-Tiling/GET_TILING_DATA_MEMBER.md) | 用于获取tiling结构体的成员变量。 |615| [GET_TILING_DATA_MEMBER](Kernel-Tiling/GET_TILING_DATA_MEMBER.md) | 用于获取tiling结构体的成员变量。 |
616| [GET_TILING_DATA_PTR_WITH_STRUCT](Kernel-Tiling/GET_TILING_DATA_PTR_WITH_STRUCT.md) | 在使用该宏时,开发者可以通过指定结构体名称来获取相应的Tiling信息,并将其填入对应的Tiling结构体中。完成填充后,该宏将返回一个指向该Tiling结构体的指针,并使用\_\_tiling\_data\_ptr\_\_修饰符对该指针进行修饰。这种修饰方式能够确保在动静态Shape场景下代码的统一性和兼容性。 |616| [GET_TILING_DATA_PTR_WITH_STRUCT](Kernel-Tiling/GET_TILING_DATA_PTR_WITH_STRUCT.md) | 在使用该宏时,开发者可以通过指定结构体名称来获取相应的Tiling信息,并将其填入对应的Tiling结构体中。完成填充后,该宏将返回一个指向该Tiling结构体的指针,并使用\_\_tiling\_data\_ptr\_\_修饰符对该指针进行修饰。这种修饰方式能够确保在动静态Shape场景下代码的统一性和兼容性。 |
617| [COPY_TILING_WITH_STRUCT](Kernel-Tiling/COPY_TILING_WITH_STRUCT.md) | 拷贝Tiling结构体,并返回指向拷贝后的Tiling结构体的指针。该宏适用于嵌套结构体场景,可拷贝结构体的子结构体成员变量。该宏将指定结构体拷贝至栈上,适用于频繁访问Tiling数据的场景,能够加快数据访问速度。 |617| [COPY_TILING_WITH_STRUCT](Kernel-Tiling/COPY_TILING_WITH_STRUCT.md) | 拷贝Tiling结构体,并返回指向拷贝后的Tiling结构体的指针。该宏适用于嵌套结构体场景,可拷贝结构体的子结构体成员变量。该宏将指定结构体拷贝至栈上,适用于频繁访问Tiling数据的场景,能够加快数据访问速度。 |
618| [COPY_TILING_WITH_ARRAY](Kernel-Tiling/COPY_TILING_WITH_ARRAY.md) | 拷贝指定大小的数组内容到目标数组中,并返回指向拷贝后数组的指针。适用于拷贝一个结构体的数组成员变量的场景。该宏将指定数组拷贝至栈上,适用于频繁访问Tiling数据的场景,能够加快数据访问速度。 |618| [COPY_TILING_WITH_ARRAY](Kernel-Tiling/COPY_TILING_WITH_ARRAY.md) | 拷贝指定大小的数组内容到目标数组中,并返回指向拷贝后数组的指针。适用于拷贝一个结构体的数组成员变量的场景。该宏将指定数组拷贝至栈上,适用于频繁访问Tiling数据的场景,能够加快数据访问速度。 |
619-| [TILING_KEY_IS](Kernel-Tiling/TILING_KEY_IS.md) | 在核函数(Kernel)中判断本次执行时的tiling_key是否等于host侧运行时设置的某个key,从而标识tiling_key==key的一条kernel分支。 |619+| [TILING_KEY_IS](Kernel-Tiling/TILING_KEY_IS.md) | 在核函数(Kernel)中判断本次执行时的tiling_key是否等于host侧运行时设置的某个key,从而标识tiling_key==key的一条核函数(Kernel)分支。 |
620| [TILING_KEY_LIST](Kernel-Tiling/TILING_KEY_LIST.md) | TILING_KEY_LIST函数用于在核函数(Kernel)中判断当前执行的TilingKey是否与Host侧配置的指定TilingKey匹配,从而标识满足TilingKey == key1或TilingKey == key2条件的分支逻辑。 |620| [TILING_KEY_LIST](Kernel-Tiling/TILING_KEY_LIST.md) | TILING_KEY_LIST函数用于在核函数(Kernel)中判断当前执行的TilingKey是否与Host侧配置的指定TilingKey匹配,从而标识满足TilingKey == key1或TilingKey == key2条件的分支逻辑。 |
621-| [REGISTER_TILING_DEFAULT](Kernel-Tiling/REGISTER_TILING_DEFAULT.md) | 用于在kernel侧注册用户使用标准C++语法自定义的默认TilingData结构体。 |621+| [REGISTER_TILING_DEFAULT](Kernel-Tiling/REGISTER_TILING_DEFAULT.md) | 用于在核函数(Kernel)侧注册用户使用标准C++语法自定义的默认TilingData结构体。 |
622-| [REGISTER_TILING_FOR_TILINGKEY](Kernel-Tiling/REGISTER_TILING_FOR_TILINGKEY.md) | 用于在kernel侧注册与TilingKey相匹配的TilingData自定义结构体;该接口需提供一个逻辑表达式,逻辑表达式以字符串“TILING_KEY_VAR”代指实际TilingKey,表达TilingKey所满足的范围。 |622+| [REGISTER_TILING_FOR_TILINGKEY](Kernel-Tiling/REGISTER_TILING_FOR_TILINGKEY.md) | 用于在核函数(Kernel)侧注册与TilingKey相匹配的TilingData自定义结构体;该接口需提供一个逻辑表达式,逻辑表达式以字符串“TILING_KEY_VAR”代指实际TilingKey,表达TilingKey所满足的范围。 |
623| [REGISTER_NONE_TILING](Kernel-Tiling/REGISTER_NONE_TILING.md) | 在核函数(Kernel)侧使用标准C++语法自定义的TilingData结构体时,若用户不确定需要注册哪些结构体,可使用该接口告知框架侧需使用未注册的标准C++语法来定义TilingData,并配套GET\_TILING\_DATA\_WITH\_STRUCT,GET\_TILING\_DATA\_MEMBER, |623| [REGISTER_NONE_TILING](Kernel-Tiling/REGISTER_NONE_TILING.md) | 在核函数(Kernel)侧使用标准C++语法自定义的TilingData结构体时,若用户不确定需要注册哪些结构体,可使用该接口告知框架侧需使用未注册的标准C++语法来定义TilingData,并配套GET\_TILING\_DATA\_WITH\_STRUCT,GET\_TILING\_DATA\_MEMBER, |
624-| [设置核函数(Kernel)类型](Kernel-Tiling/set_Kernel_type.md) | 用于用户自定义设置kernel类型,控制算子执行时只启动该类型的核,避免启动不需要工作的核,缩短核启动开销。 |624+| [设置核函数(Kernel)类型](Kernel-Tiling/set_Kernel_type.md) | 用于用户自定义设置核函数(Kernel)类型,控制算子执行时只启动该类型的核,避免启动不需要工作的核,缩短核启动开销。 |
625 625 
626## 特殊寄存器访问626## 特殊寄存器访问
627 627 
@@ -69,7 +69,7 @@
69 69 
70## 约束说明70## 约束说明
71 71 
72-仅支持在Kernel侧调用。72+仅支持在核函数(Kernel侧调用。
73 73 
74## 调用示例74## 调用示例
75 75 
@@ -126,7 +126,7 @@ $$
126- 搬运至L1 Buffer的数据不能重叠,如果存在重叠写入,硬件不会产生任何警告或错误,并且不保证重叠数据的写入顺序。126- 搬运至L1 Buffer的数据不能重叠,如果存在重叠写入,硬件不会产生任何警告或错误,并且不保证重叠数据的写入顺序。
127 127 
128<!-- npu="950" id13 -->128<!-- npu="950" id13 -->
129-- 针对Ascend 950PR/Ascend 950DT,支持ub->L1 Buffer的1:2硬通道的方式;同时提供1:1的兼容模式,解决A2/A3的代码迁移兼容问题,这种模式通过Global Memory进行中转,效率稍低。129+- 针对Ascend 950PR/Ascend 950DT,支持UB->L1 Buffer的1:2硬通道的方式;同时提供1:1的兼容模式,解决A2/A3的代码迁移兼容问题,这种模式通过Global Memory进行中转,效率稍低。
130<!-- end id13 -->130<!-- end id13 -->
131 131 
132- Nd2NzParams结构体参数的值需在取值范围内,参数取值范围如[表4](#table_ub_nd2nz_range)所示。132- Nd2NzParams结构体参数的值需在取值范围内,参数取值范围如[表4](#table_ub_nd2nz_range)所示。
@@ -49,7 +49,7 @@
49 49 
50| 参数名称 | 输入/输出 | 描述 |50| 参数名称 | 输入/输出 | 描述 |
51| ------ | ------ | ------ |51| ------ | ------ | ------ |
52-| func | 输入 | 算子的kernel函数指针。|52+| func | 输入 | 算子的函数(Kernel)指针。|
53| numBlocks | 输入 | 算子的核心数,corenum。|53| numBlocks | 输入 | 算子的核心数,corenum。|
54| ... | 输入 | 所有的入参和出参,依次填入,当前参数个数限制为32个,超出32时会出现编译错误。 |54| ... | 输入 | 所有的入参和出参,依次填入,当前参数个数限制为32个,超出32时会出现编译错误。 |
55 55 
@@ -60,7 +60,7 @@
60## 约束说明<a name="zh-cn_topic_0000001963799134_zh-cn_topic_0000001541924164_section794123819592"></a>60## 约束说明<a name="zh-cn_topic_0000001963799134_zh-cn_topic_0000001541924164_section794123819592"></a>
61 61 
62- 为了保留接口兼容,推荐[<<<>>>](../../../../../guide/programming_guide/debug_and_tuning/functional_debug/cpu_twin_debug.md)编译使用。62- 为了保留接口兼容,推荐[<<<>>>](../../../../../guide/programming_guide/debug_and_tuning/functional_debug/cpu_twin_debug.md)编译使用。
63-- 除了func、blkdim以外,其他的变量都必须是通过[GmAlloc](GmAlloc.md)分配的共享内存的指针;传入的参数的数量和顺序都必须和kernel保持一致。63+- 除了func、blkdim以外,其他的变量都必须是通过[GmAlloc](GmAlloc.md)分配的共享内存的指针;传入的参数的数量和顺序都必须和核函数(Kernel)保持一致。
64 64 
65## 调用示例<a name="zh-cn_topic_0000001963799134_zh-cn_topic_0000001541924164_section82241477610"></a>65## 调用示例<a name="zh-cn_topic_0000001963799134_zh-cn_topic_0000001541924164_section82241477610"></a>
66 66 
@@ -26,7 +26,7 @@
26 ```26 ```
27 27 
28 - 宏定义控制方式28 - 宏定义控制方式
29-kernel代码文件的开头位置添加#define ASCENDC_DUMP 0,示例如下:29+核函数(Kernel)代码文件的开头位置添加#define ASCENDC_DUMP 0,示例如下:
30 ```cpp30 ```cpp
31 #define ASCENDC_DUMP 0 // 在包含头文件之前添加31 #define ASCENDC_DUMP 0 // 在包含头文件之前添加
32 #include "..." // 包含所需的头文件32 #include "..." // 包含所需的头文件
@@ -37,7 +37,7 @@
37 37 
38该接口Dump指定Tensor的内容。同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。区别于[DumpTensor](DumpTensor.md),使用该接口可以支持指定偏移位置的Tensor打印。38该接口Dump指定Tensor的内容。同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。区别于[DumpTensor](DumpTensor.md),使用该接口可以支持指定偏移位置的Tensor打印。
39 39 
40-在算子kernel侧实现代码中需要打印偏移后Tensor数据的地方,调用DumpAccChkPoint接口打印相关内容。样例如下:40+在算子核函数(Kernel)侧实现代码中需要打印偏移后Tensor数据的地方,调用DumpAccChkPoint接口打印相关内容。样例如下:
41 41 
42```cpp42```cpp
43AscendC::DumpAccChkPoint(srcLocal, 5, 32, dataLen);43AscendC::DumpAccChkPoint(srcLocal, 5, 32, dataLen);
@@ -36,7 +36,7 @@
36头文件路径为:`"basic_api/kernel_operator_dump_tensor_intf.h"`36头文件路径为:`"basic_api/kernel_operator_dump_tensor_intf.h"`
37 37 
38该接口可以打印Tensor的内容,同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。38该接口可以打印Tensor的内容,同时支持打印自定义的标签(仅支持uint32_t数据类型的信息),比如打印当前行号等。
39-在算子kernel侧实现代码中需要打印Tensor数据的地方,调用DumpTensor接口打印相关内容。样例如下:39+在算子核函数(Kernel)侧实现代码中需要打印Tensor数据的地方,调用DumpTensor接口打印相关内容。样例如下:
40 40 
41```cpp41```cpp
42AscendC::DumpTensor(srcLocal, 5, dataLen);42AscendC::DumpTensor(srcLocal, 5, dataLen);
@@ -31,7 +31,7 @@
31 31 
32推荐使用[asc_prof_start](../../../../Utils-API/tuning_interface/asc_prof_start.md)接口进行性能数据采集信号启动的设置,该接口同时适用于C语言和C++语言编程。32推荐使用[asc_prof_start](../../../../Utils-API/tuning_interface/asc_prof_start.md)接口进行性能数据采集信号启动的设置,该接口同时适用于C语言和C++语言编程。
33 33 
34-用于设置性能数据采集信号启动,和[MetricsProfStop](MetricsProfStop.md)配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。34+用于设置性能数据采集信号启动,和[MetricsProfStop](MetricsProfStop.md)配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。
35 35 
36## 函数原型<a name="zh-cn_topic_0000001963799138_zh-cn_topic_0000001997078721_section2067518173415"></a>36## 函数原型<a name="zh-cn_topic_0000001963799138_zh-cn_topic_0000001997078721_section2067518173415"></a>
37 37 
@@ -55,6 +55,6 @@ __aicore__ inline void MetricsProfStart()
55 55 
56```cpp56```cpp
57MetricsProfStart();57MetricsProfStart();
58-... // 需要调优的kernel侧代码段。58+... // 需要调优的核函数(Kernel)侧代码段。
59MetricsProfStop();59MetricsProfStop();
60```60```
@@ -31,7 +31,7 @@
31 31 
32推荐使用[asc_prof_stop](../../../../Utils-API/tuning_interface/asc_prof_stop.md)接口进行性能数据采集信号启动的设置,该接口同时适用于C语言和C++语言编程。32推荐使用[asc_prof_stop](../../../../Utils-API/tuning_interface/asc_prof_stop.md)接口进行性能数据采集信号启动的设置,该接口同时适用于C语言和C++语言编程。
33 33 
34-设置性能数据采集信号停止,和[MetricsProfStart](MetricsProfStart.md)配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。34+设置性能数据采集信号停止,和[MetricsProfStart](MetricsProfStart.md)配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。
35 35 
36## 函数原型<a name="zh-cn_topic_0000002000280001_zh-cn_topic_0000001960477980_section2067518173415"></a>36## 函数原型<a name="zh-cn_topic_0000002000280001_zh-cn_topic_0000001960477980_section2067518173415"></a>
37 37 
@@ -55,6 +55,6 @@ __aicore__ inline void MetricsProfStop()
55 55 
56```cpp56```cpp
57MetricsProfStart();57MetricsProfStart();
58-... // 需要调优的kernel侧代码段。58+... // 需要调优的核函数(Kernel)侧代码段。
59MetricsProfStop();59MetricsProfStop();
60```60```
@@ -110,7 +110,7 @@ $$
110| :----- | :-------- | :--- |110| :----- | :-------- | :--- |
111| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |111| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
112| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |112| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |
113-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |113+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
114| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |114| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
115| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |115| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
116| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |116| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -80,7 +80,7 @@ $$
80| :----- | :-------- | :--- |80| :----- | :-------- | :--- |
81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |
83-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |83+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md) |84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md) |
85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分API](../SIMD_compute/high_dim_split.md)。 |85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分API](../SIMD_compute/high_dim_split.md)。 |
86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -131,7 +131,7 @@ Atlas 推理系列产品 AI Core,支持的数据类型为:int16_t、half、f
131 <!-- end id17 -->131 <!-- end id17 -->
132<!-- end id13 -->132<!-- end id13 -->
133<!-- npu="950" id18 -->133<!-- npu="950" id18 -->
134-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:134+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
135 - tensor高维切分计算接口占用8KB UB临时空间。135 - tensor高维切分计算接口占用8KB UB临时空间。
136 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。136 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
137<!-- end id18 -->137<!-- end id18 -->
@@ -81,7 +81,7 @@ $$
81| :----- | :-------- | :--- |81| :----- | :-------- | :--- |
82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |
83| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |83| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |
84-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |84+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
85| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |85| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
86| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |86| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
87| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |87| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -176,7 +176,7 @@ $$
176 <!-- end id17 -->176 <!-- end id17 -->
177<!-- end id13 -->177<!-- end id13 -->
178<!-- npu="950" id18 -->178<!-- npu="950" id18 -->
179-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:179+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
180 - tensor高维切分计算接口占用8KB UB临时空间。180 - tensor高维切分计算接口占用8KB UB临时空间。
181 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。181 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
182<!-- end id18 -->182<!-- end id18 -->
@@ -97,7 +97,7 @@
97|---|---|---|97|---|---|---|
98|dst|输出|目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。|98|dst|输出|目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。|
99|src|输入|源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。|99|src|输入|源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。|
100-|count|输入|参与计算的元素个数。<br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。|100+|count|输入|参与计算的元素个数。<br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。|
101|mask/mask[]|输入|mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../mask_operations/mask_operations.md)。|101|mask/mask[]|输入|mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../mask_operations/mask_operations.md)。|
102|repeatTime|输入|重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。|102|repeatTime|输入|重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。|
103|repeatParams|输入|控制操作数地址步长的参数。[UnaryRepeatParams](../../aux_data_structures//UnaryRepeatParams.md)类型,包含操作数相邻迭代间相同DataBlock的地址步长,操作数同一迭代内不同DataBlock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。|103|repeatParams|输入|控制操作数地址步长的参数。[UnaryRepeatParams](../../aux_data_structures//UnaryRepeatParams.md)类型,包含操作数相邻迭代间相同DataBlock的地址步长,操作数同一迭代内不同DataBlock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。|
@@ -177,7 +177,7 @@
177 <!-- end id16 -->177 <!-- end id16 -->
178<!-- end id12 -->178<!-- end id12 -->
179<!-- npu="950" id17 -->179<!-- npu="950" id17 -->
180-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:180+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
181 - tensor高维切分计算接口占用8KB UB临时空间。181 - tensor高维切分计算接口占用8KB UB临时空间。
182 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。182 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
183<!-- end id17 -->183<!-- end id17 -->
@@ -80,7 +80,7 @@ $$
80| :----- | :-------- | :--- |80| :----- | :-------- | :--- |
81| dst | 输入/输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |81| dst | 输入/输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |
83-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |83+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -142,7 +142,7 @@ Kirin 9030,支持的数据类型为:half、float。
142 142 
143 地址不重叠场景下,无法在一拍读取dst、src0、src1三块不同地址下的数据,因此只能达到一半的理论并行度,理论并行度将在原有基础上减半;在地址重叠场景下,则保持原有理论并行度。143 地址不重叠场景下,无法在一拍读取dst、src0、src1三块不同地址下的数据,因此只能达到一半的理论并行度,理论并行度将在原有基础上减半;在地址重叠场景下,则保持原有理论并行度。
144<!-- npu="950" id22 -->144<!-- npu="950" id22 -->
145-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:145+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
146 - tensor高维切分计算接口占用8KB UB临时空间。146 - tensor高维切分计算接口占用8KB UB临时空间。
147 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。147 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
148<!-- end id22 -->148<!-- end id22 -->
@@ -80,7 +80,7 @@ $$
80| :----- | :-------- | :--- |80| :----- | :-------- | :--- |
81| dst | 输入/输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |81| dst | 输入/输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |
83-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |83+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -134,7 +134,7 @@ Atlas 推理系列产品AI Core,支持的数据类型为:half、float。
134 134 
135 地址不重叠场景下,无法在一拍读取dst、src0、src1三块不同地址下的数据,因此只能达到一半的理论并行度,理论并行度将在原有基础上减半;在地址重叠场景下,则保持原有理论并行度。135 地址不重叠场景下,无法在一拍读取dst、src0、src1三块不同地址下的数据,因此只能达到一半的理论并行度,理论并行度将在原有基础上减半;在地址重叠场景下,则保持原有理论并行度。
136<!-- npu="950" id18 -->136<!-- npu="950" id18 -->
137-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:137+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
138 - tensor高维切分计算接口占用8KB UB临时空间。138 - tensor高维切分计算接口占用8KB UB临时空间。
139 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。139 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
140<!-- end id18 -->140<!-- end id18 -->
@@ -75,7 +75,7 @@ $$
75| :----- | :-------- | :--- |75| :----- | :-------- | :--- |
76| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |76| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |
77| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |77| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>LocalTensor的起始地址需要32字节对齐。 |
78-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |78+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
79| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |79| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
80| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |80| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
81| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |81| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -167,7 +167,7 @@ $$
167<!-- end id13 -->167<!-- end id13 -->
168- 本指令涉及精度转换,转换规则参考[精度转换规则](../../data_structures/precision_conversion.md)。168- 本指令涉及精度转换,转换规则参考[精度转换规则](../../data_structures/precision_conversion.md)。
169<!-- npu="950" id18 -->169<!-- npu="950" id18 -->
170-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:170+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
171 - tensor高维切分计算接口占用8KB UB临时空间。171 - tensor高维切分计算接口占用8KB UB临时空间。
172 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。172 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
173<!-- end id18 -->173<!-- end id18 -->
@@ -80,7 +80,7 @@ $$
80| :----- | :-------- | :--- |80| :----- | :-------- | :--- |
81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>两个源操作数的数据类型需要与目的操作数保持一致。 |82| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br>两个源操作数的数据类型需要与目的操作数保持一致。 |
83-| count | 输入 | 参与计算的元素个数。<br><br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |83+| count | 输入 | 参与计算的元素个数。<br><br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |84| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |85| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |86| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -131,7 +131,7 @@ Atlas 推理系列产品AI Core,支持的数据类型为:int16_t、half、fl
131 <!-- end id17 -->131 <!-- end id17 -->
132<!-- end id13 -->132<!-- end id13 -->
133<!-- npu="950" id18 -->133<!-- npu="950" id18 -->
134-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:134+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
135 - tensor高维切分计算接口占用8KB UB临时空间。135 - tensor高维切分计算接口占用8KB UB临时空间。
136 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。136 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
137<!-- end id18 -->137<!-- end id18 -->
@@ -81,7 +81,7 @@ $$
81| :----- | :-------- | :--- |81| :----- | :-------- | :--- |
82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN/VECCALC/VECOUT。 |
83| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |83| src0、src1 | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |
84-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |84+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
85| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |85| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
86| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |86| repeatTime | 输入 | 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
87| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同Datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |87| repeatParams | 输入 | 控制操作数地址步长的参数。[BinaryRepeatParams](../../aux_data_structures/BinaryRepeatParams.md)类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同Datablock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -176,7 +176,7 @@ $$
176<!-- end id13 -->176<!-- end id13 -->
177- 本指令涉及精度转换,转换规则参考[精度转换规则](../../data_structures/precision_conversion.md)。177- 本指令涉及精度转换,转换规则参考[精度转换规则](../../data_structures/precision_conversion.md)。
178<!-- npu="950" id18 -->178<!-- npu="950" id18 -->
179-- 对Unified Buffer(UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:179+- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
180 - tensor高维切分计算接口占用8KB UB临时空间。180 - tensor高维切分计算接口占用8KB UB临时空间。
181 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。181 - tensor前n个数据连续计算接口不涉及8KB UB临时空间的占用。
182<!-- end id18 -->182<!-- end id18 -->
@@ -82,7 +82,7 @@
82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
83| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |83| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
84| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |84| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
85-| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过UB大小限制。 |85+| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过Unified Buffer(UB大小限制。 |
86| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |86| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |
87| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |87| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |
88| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |88| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |
@@ -145,7 +145,7 @@
145 <!-- end id22 -->145 <!-- end id22 -->
146<!-- end id18 -->146<!-- end id18 -->
147 147 
148-- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合Unified Buffer(UB的实际大小避免出现越界。148+- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合UB的实际大小避免出现越界。
149- 如果存在多个最大值,该指令会将最小索引写入目的操作数。149- 如果存在多个最大值,该指令会将最小索引写入目的操作数。
150- `dst`结果存储顺序为最大值,最大值索引,若不需要索引,只会存储最大值。150- `dst`结果存储顺序为最大值,最大值索引,若不需要索引,只会存储最大值。
151- 索引按操作数的数据类型存储,读取索引需要将类型转换到整型。请参考[ReduceRepeat关键特性说明](./ReduceRepeat.md#关键特性说明)。151- 索引按操作数的数据类型存储,读取索引需要将类型转换到整型。请参考[ReduceRepeat关键特性说明](./ReduceRepeat.md#关键特性说明)。
@@ -82,7 +82,7 @@
82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |82| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
83| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |83| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
84| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |84| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
85-| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过UB大小限制。 |85+| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过Unified Buffer(UB大小限制。 |
86| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |86| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |
87| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |87| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |
88| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |88| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |
@@ -146,7 +146,7 @@
146 <!-- end id22 -->146 <!-- end id22 -->
147<!-- end id18 -->147<!-- end id18 -->
148 148 
149-- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合Unified Buffer(UB的实际大小避免出现越界。149+- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合UB的实际大小避免出现越界。
150- 如果存在多个最小值,该指令会将最小索引写入目的操作数。150- 如果存在多个最小值,该指令会将最小索引写入目的操作数。
151- `dst`结果存储顺序为最小值,最小值索引,若不需要索引,只会存储最小值。151- `dst`结果存储顺序为最小值,最小值索引,若不需要索引,只会存储最小值。
152- 索引按操作数的数据类型存储,读取索引需要将类型转换到整型。请参考[ReduceRepeat关键特性说明](./ReduceRepeat.md#关键特性说明)。152- 索引按操作数的数据类型存储,读取索引需要将类型转换到整型。请参考[ReduceRepeat关键特性说明](./ReduceRepeat.md#关键特性说明)。
@@ -81,7 +81,7 @@
81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |81| dst | 输出 | 目的操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
82| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |82| src | 输入 | 源操作数。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
83| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |83| sharedTmpBuffer | 输入 | 指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小。详情请参考[关键特性说明](#关键特性说明)。<br>类型为[LocalTensor](../../data_structures/LocalTensor/LocalTensor.md),支持的TPosition为VECIN、VECCALC、VECOUT。 |
84-| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过UB大小限制。 |84+| count | 输入 | 参与计算的元素个数。关于该参数的具体说明请参考[连续计算](../SIMD_compute/continuous_compute.md)。最大处理的数据量不能超过Unified Buffer(UB大小限制。 |
85| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |85| mask/mask[] | 输入 | `mask`用于控制每次迭代内参与计算的源操作数。详细设置参考[掩码概述](../SIMD_compute/mask.md)。 |
86| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |86| repeatTime | 输入 | 迭代次数。关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。**注:与高维切分中不同的是,`repeatTime`可以支持更大的取值范围,保证不超过int32_t的最大值即可。** |
87| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |87| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。 |
@@ -144,7 +144,7 @@
144 <!-- end id22 -->144 <!-- end id22 -->
145<!-- end id18 -->145<!-- end id18 -->
146 146 
147-- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合Unified Buffer(UB的实际大小避免出现越界。147+- `srcRepStride`取值范围为[0, $2^{16}-1$],需要结合UB的实际大小避免出现越界。
148 148 
149<!-- npu="950,910,310p,310b,x90,9030" id23 -->149<!-- npu="950,910,310p,310b,x90,9030" id23 -->
150- 针对以下型号,模板参数`isSetMask`参数不生效,保持默认值即可:150- 针对以下型号,模板参数`isSetMask`参数不生效,保持默认值即可:
@@ -84,7 +84,7 @@ def Gather(dst, src, count, srcOffset, srcBaseAddr):
84| src | 输入 | 源操作数,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要按照32字节对齐。<br><br>数据类型和dst保持一致。 |84| src | 输入 | 源操作数,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要按照32字节对齐。<br><br>数据类型和dst保持一致。 |
85| srcOffset | 输入 | 每个元素在src中对应的地址偏移,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要32字节对齐。<br><br>该偏移量是相对于src的起始基地址srcBaseAddr而言的。单位为字节。取值要求见[约束说明](#约束说明)。 |85| srcOffset | 输入 | 每个元素在src中对应的地址偏移,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要32字节对齐。<br><br>该偏移量是相对于src的起始基地址srcBaseAddr而言的。单位为字节。取值要求见[约束说明](#约束说明)。 |
86| srcBaseAddr | 输入 | 用于指定Gather操作中源操作数的起始位置,单位为字节。取值应保证src元素类型位宽对齐,否则会导致非预期行为。 |86| srcBaseAddr | 输入 | 用于指定Gather操作中源操作数的起始位置,单位为字节。取值应保证src元素类型位宽对齐,否则会导致非预期行为。 |
87-| count | 输入 | 参与计算的元素个数。<br><br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。 |87+| count | 输入 | 参与计算的元素个数。<br><br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。 |
88| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br><br>设置详见[掩码操作](../mask_operations/mask_operations.md)。 |88| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br><br>设置详见[掩码操作](../mask_operations/mask_operations.md)。 |
89| repeatTime | 输入 | 指令迭代次数。针对不同的型号,每个迭代处理的DataBlock可能存在差异,详见[约束说明](#约束说明)。|89| repeatTime | 输入 | 指令迭代次数。针对不同的型号,每个迭代处理的DataBlock可能存在差异,详见[约束说明](#约束说明)。|
90| dstRepStride | 输入 | 相邻迭代间的地址步长,单位是DataBlock(32Bytes)。 |90| dstRepStride | 输入 | 相邻迭代间的地址步长,单位是DataBlock(32Bytes)。 |
@@ -116,7 +116,7 @@ Atlas 推理系列产品AI Core,支持的数据类型为:int16_t、uint16_t
116- 不支持源操作数与目的操作数使用同一块内存地址。116- 不支持源操作数与目的操作数使用同一块内存地址。
117- srcOffset的取值要求如下:117- srcOffset的取值要求如下:
118 - 取值应保证src元素类型位宽对齐。118 - 取值应保证src元素类型位宽对齐。
119- - 偏移地址后不能超出Unified Buffer(UB大小数据的范围。119+ - 偏移地址后不能超出UB大小数据的范围。
120 <!-- npu="950,310b" id13 -->120 <!-- npu="950,310b" id13 -->
121 - 针对以下型号,地址偏移的取值范围:当操作数为8位时,取值范围为[0, 2^16-1];当操作数为16位时,取值范围为[0, 2^17-1],当操作数为32位或者64位时,不能超出uint32_t的范围。121 - 针对以下型号,地址偏移的取值范围:当操作数为8位时,取值范围为[0, 2^16-1];当操作数为16位时,取值范围为[0, 2^17-1],当操作数为32位或者64位时,不能超出uint32_t的范围。
122 <!-- npu="950" id14 -->122 <!-- npu="950" id14 -->
@@ -79,7 +79,7 @@
79| src | 输入 | 源操作数,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要按照32字节对齐。 |79| src | 输入 | 源操作数,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要按照32字节对齐。 |
80| dstOffset | 输入 | 每个元素在dst中对应的地址偏移,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要32字节对齐。<br><br>该偏移量是相对于dst的起始基地址dstBaseAddr而言的。单位为字节。取值要求见[约束说明](#约束说明)。|80| dstOffset | 输入 | 每个元素在dst中对应的地址偏移,类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。<br><br>LocalTensor的起始地址需要32字节对齐。<br><br>该偏移量是相对于dst的起始基地址dstBaseAddr而言的。单位为字节。取值要求见[约束说明](#约束说明)。|
81| dstBaseAddr | 输入 | 用于指定dst的起始偏移地址,单位为字节。取值应保证dst元素类型位宽对齐,否则会导致非预期行为。 |81| dstBaseAddr | 输入 | 用于指定dst的起始偏移地址,单位为字节。取值应保证dst元素类型位宽对齐,否则会导致非预期行为。 |
82-| count | 输入 | 参与计算的元素个数。<br><br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。 |82+| count | 输入 | 参与计算的元素个数。<br><br>参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。 |
83| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br><br>设置详见[掩码操作](../mask_operations/mask_operations.md)。 |83| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br><br>设置详见[掩码操作](../mask_operations/mask_operations.md)。 |
84| repeatTime | 输入 | 指令迭代次数。针对不同的型号,每个迭代处理的DataBlock可能存在差异,详见[约束说明](#约束说明)。|84| repeatTime | 输入 | 指令迭代次数。针对不同的型号,每个迭代处理的DataBlock可能存在差异,详见[约束说明](#约束说明)。|
85| srcRepStride | 输入 | 相邻迭代间的地址步长,单位是DataBlock(32Bytes)。 |85| srcRepStride | 输入 | 相邻迭代间的地址步长,单位是DataBlock(32Bytes)。 |
@@ -106,7 +106,7 @@ Atlas 推理系列产品AI Core,支持的数据类型为:uint16_t、half、u
106- dstOffset的取值要求如下:106- dstOffset的取值要求如下:
107 - 偏移地址不能有相同值,如果存在2个或者多个偏移重复的情况,行为是不可预期的。 107 - 偏移地址不能有相同值,如果存在2个或者多个偏移重复的情况,行为是不可预期的。
108 - 取值应保证dst元素类型位宽对齐。108 - 取值应保证dst元素类型位宽对齐。
109- - 偏移地址后不能超出Unified Buffer(UB大小数据的范围。109+ - 偏移地址后不能超出UB大小数据的范围。
110 <!-- npu="950,310b" id12 -->110 <!-- npu="950,310b" id12 -->
111 - 针对以下型号,地址偏移的取值范围:当操作数为8位时,取值范围为[0, 2^16-1];当操作数为16位时,取值范围为[0, 2^17-1],当操作数为32位或者64位时,不能超出uint32_t的范围。111 - 针对以下型号,地址偏移的取值范围:当操作数为8位时,取值范围为[0, 2^16-1];当操作数为16位时,取值范围为[0, 2^17-1],当操作数为32位或者64位时,不能超出uint32_t的范围。
112 <!-- npu="950" id13 -->112 <!-- npu="950" id13 -->
@@ -78,7 +78,7 @@
78| dst | 输出 | 目的操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |78| dst | 输出 | 目的操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 |
79| src | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。|79| src | 输入 | 源操作数。<br>类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。|
80| roundMode | 输入 | 精度转换处理模式,类型是RoundMode。<br>RoundMode为枚举类型,用以控制精度转换处理模式,可参考[精度转换规则](../../data_structures/precision_conversion.md)。RoundMode取值说明请参考[RoundMode取值说明](#roundmode取值说明)。 |80| roundMode | 输入 | 精度转换处理模式,类型是RoundMode。<br>RoundMode为枚举类型,用以控制精度转换处理模式,可参考[精度转换规则](../../data_structures/precision_conversion.md)。RoundMode取值说明请参考[RoundMode取值说明](#roundmode取值说明)。 |
81-| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过UB大小限制。** |81+| count | 输入 | 参与计算的元素个数。<br>**注:参数取值范围和操作数的数据类型有关,数据类型不同,能够处理的元素个数最大值不同,最大处理的数据量不能超过Unified Buffer(UB大小限制。** |
82| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |82| mask/mask[] | 输入 | mask用于控制每次迭代内参与计算的元素。<br>注意:数据类型转换的mask会按照输入和输出类型中sizeof(dtype)较大的来筛选。<br>设置详见[掩码操作](../SIMD_compute/mask.md)。 |
83| repeatTime | 输入| 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |83| repeatTime | 输入| 重复迭代次数。<br>矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。<br>关于该参数的具体描述请参考[高维切分](../SIMD_compute/high_dim_split.md)。 |
84| repeatParams | 输入 | 控制操作数地址步长的参数。[UnaryRepeatParams](../../aux_data_structures//UnaryRepeatParams.md)类型,包含操作数相邻迭代间相同DataBlock的地址步长,操作数同一迭代内不同DataBlock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |84| repeatParams | 输入 | 控制操作数地址步长的参数。[UnaryRepeatParams](../../aux_data_structures//UnaryRepeatParams.md)类型,包含操作数相邻迭代间相同DataBlock的地址步长,操作数同一迭代内不同DataBlock的地址步长等参数。<br>相邻迭代间的地址步长参数说明请参考[repeatStride](../SIMD_compute/high_dim_split.md);同一迭代内DataBlock的地址步长参数说明请参考[dataBlockStride](../SIMD_compute/high_dim_split.md)。 |
@@ -43,7 +43,7 @@
43| CastDequant不开启向量量化的s162b8场景 | 0~31 | scale | 一个float类型数据M(硬件在计算时将其视为(1,8,10)格式,即1个符号位、8个指数位和10个尾数位)。 |43| CastDequant不开启向量量化的s162b8场景 | 0~31 | scale | 一个float类型数据M(硬件在计算时将其视为(1,8,10)格式,即1个符号位、8个指数位和10个尾数位)。 |
44| CastDequant不开启向量量化的s162b8场景 | 37~45 | offset | 一个有符号的9位整数。 |44| CastDequant不开启向量量化的s162b8场景 | 37~45 | offset | 一个有符号的9位整数。 |
45| CastDequant不开启向量量化的s162b8场景 | 46 | signMode | 用于指示量化结果是否有符号(其中0表示无符号,1表示有符号)。 |45| CastDequant不开启向量量化的s162b8场景 | 46 | signMode | 用于指示量化结果是否有符号(其中0表示无符号,1表示有符号)。 |
46-| CastDequant开启向量量化的s162b8场景 | 0~13 | vdeqAddr | 被硬件视为一个地址,指向UB中的一块空间,该空间大小为128B。空间被切分为16个64bit,每64bit可用于1次量化计算。 |46+| CastDequant开启向量量化的s162b8场景 | 0~13 | vdeqAddr | 被硬件视为一个地址,指向Unified Buffer(UB中的一块空间,该空间大小为128B。空间被切分为16个64bit,每64bit可用于1次量化计算。 |
47 47 
48## 函数原型<a name="zh-cn_topic_0000002563051145_section21861260618"></a>48## 函数原型<a name="zh-cn_topic_0000002563051145_section21861260618"></a>
49 49 
@@ -71,8 +71,8 @@ __simd_callee__ inline void GatherB(U& dstReg, __ubuf__ T* baseAddr, S& index, M
71| 参数名 | 输入/输出 | 描述 |71| 参数名 | 输入/输出 | 描述 |
72|-----|-----|-----|72|-----|-----|-----|
73| dstReg | 输出 | 目的操作数,类型为[RegTensor](../register_data_types/RegTensor.md)。|73| dstReg | 输出 | 目的操作数,类型为[RegTensor](../register_data_types/RegTensor.md)。|
74-| baseAddr | 输入 | 源操作数,UB中的基地址,需要32字节对齐。 |74+| baseAddr | 输入 | 源操作数,Unified Buffer(UB中的基地址,需要32字节对齐。 |
75-| index | 输入 | 索引值,dstReg中的每个DataBlock在Unified Buffer(UB中相对于baseAddr的位置,仅前8个元素有效。单位:字节。类型为[RegTensor](../register_data_types/RegTensor.md)。索引值必须32B对齐,即一个索引值对应1个DataBlock。index中的值可以重复。例如:<br>baseAddr: [DataBlock0, DataBlock1, DataBlock2, DataBlock3, DataBlock4, DataBlock5, DataBlock6, DataBlock7, ... , DataBlock32, ...]。<br>index: [0\*32, 1\*32, 2\*32, 3\*32, 4\*32, 5\*32, 6\*32, 32\*32]<br>dstReg: [DataBlock0, DataBlock1, DataBlock2, DataBlock3, DataBlock4, DataBlock5, DataBlock6, DataBlock32]。 |75+| index | 输入 | 索引值,dstReg中的每个DataBlock在UB中相对于baseAddr的位置,仅前8个元素有效。单位:字节。类型为[RegTensor](../register_data_types/RegTensor.md)。索引值必须32B对齐,即一个索引值对应1个DataBlock。index中的值可以重复。例如:<br>baseAddr: [DataBlock0, DataBlock1, DataBlock2, DataBlock3, DataBlock4, DataBlock5, DataBlock6, DataBlock7, ... , DataBlock32, ...]。<br>index: [0\*32, 1\*32, 2\*32, 3\*32, 4\*32, 5\*32, 6\*32, 32\*32]<br>dstReg: [DataBlock0, DataBlock1, DataBlock2, DataBlock3, DataBlock4, DataBlock5, DataBlock6, DataBlock32]。 |
76| mask | 输入 | DataBlock搬运的有效指示,按b32格式解释。一个DataBlock对应4bit,仅每4bit中的最低位有效。由于index仅前8个元素有效,因此mask仅使用前8个b32元素对应的bit 0、4、8、12、16、20、24、28,分别控制dstReg中DataBlock0至DataBlock7是否更新,其余bit无效。详细说明请参考[MaskReg](../register_data_types/MaskReg.md)。 |76| mask | 输入 | DataBlock搬运的有效指示,按b32格式解释。一个DataBlock对应4bit,仅每4bit中的最低位有效。由于index仅前8个元素有效,因此mask仅使用前8个b32元素对应的bit 0、4、8、12、16、20、24、28,分别控制dstReg中DataBlock0至DataBlock7是否更新,其余bit无效。详细说明请参考[MaskReg](../register_data_types/MaskReg.md)。 |
77 77 
78## 数据类型78## 数据类型
@@ -60,8 +60,8 @@ __simd_callee__ inline void Gather(T3& dstReg, __ubuf__ T1* baseAddr, T4& index,
60| 参数名 | 输入/输出 | 描述 |60| 参数名 | 输入/输出 | 描述 |
61|-----|-----|-----|61|-----|-----|-----|
62| dstReg | 输出 | 目的操作数,类型为[RegTensor](../register_data_types/RegTensor.md)。 |62| dstReg | 输出 | 目的操作数,类型为[RegTensor](../register_data_types/RegTensor.md)。 |
63-| baseAddr | 输入 | 源操作数,UB中的基地址,需要32字节对齐。 |63+| baseAddr | 输入 | 源操作数,Unified Buffer(UB中的基地址,需要32字节对齐。 |
64-| index | 输入 | 索引值,dstReg中的每个元素在Unified Buffer(UB中相对于baseAddr的位置,单位:元素。类型为[RegTensor](../register_data_types/RegTensor.md)。index中的值可以重复。<br>例:baseAddr:[elem0, elem1, elem2, elem3, elem4, elem5, elem6, elem7, ...]。 <br>每个元素相对于baseAddr的索引位置为:[0, 1, 2, 3, 4, 5, 6, 7, ...]。 |64+| index | 输入 | 索引值,dstReg中的每个元素在UB中相对于baseAddr的位置,单位:元素。类型为[RegTensor](../register_data_types/RegTensor.md)。index中的值可以重复。<br>例:baseAddr:[elem0, elem1, elem2, elem3, elem4, elem5, elem6, elem7, ...]。 <br>每个元素相对于baseAddr的索引位置为:[0, 1, 2, 3, 4, 5, 6, 7, ...]。 |
65| mask | 输入 | 源操作数元素操作的有效指示,详细说明请参考[MaskReg](../register_data_types/MaskReg.md)。 |65| mask | 输入 | 源操作数元素操作的有效指示,详细说明请参考[MaskReg](../register_data_types/MaskReg.md)。 |
66 66 
67## 数据类型67## 数据类型
@@ -227,7 +227,7 @@
227 227 
228- InitBuffer申请的内存会在TPipe对象销毁时通过析构函数自动释放,无需手动释放。228- InitBuffer申请的内存会在TPipe对象销毁时通过析构函数自动释放,无需手动释放。
229- 如果需要重新分配InitBuffer申请的内存,可以调用[Reset](Reset.md),再调用InitBuffer接口。229- 如果需要重新分配InitBuffer申请的内存,可以调用[Reset](Reset.md),再调用InitBuffer接口。
230-- 一个kernel中所有使用的Buffer数量之和不能超过64。230+- 一个核函数(Kernel)中所有使用的Buffer数量之和不能超过64。
231- 自定义地址InitBuffer方式分配不建议与不指定地址的混用,可能会导致内存冲突。231- 自定义地址InitBuffer方式分配不建议与不指定地址的混用,可能会导致内存冲突。
232<!-- npu="950" id10 -->232<!-- npu="950" id10 -->
233- 针对Ascend 950PR/Ascend 950DT,对Unified Buffer(UB)的内存分配,会基于静态内存的基础上进行分配,即动态内存初始位置,参考[内存层级](../../../../../guide/programming_guide/advanced_programming/advanced_ai_core_programming_model/simd_simt_hybrid_programming/memory_hierarchy.md)。233- 针对Ascend 950PR/Ascend 950DT,对Unified Buffer(UB)的内存分配,会基于静态内存的基础上进行分配,即动态内存初始位置,参考[内存层级](../../../../../guide/programming_guide/advanced_programming/advanced_ai_core_programming_model/simd_simt_hybrid_programming/memory_hierarchy.md)。
@@ -34,7 +34,7 @@
34 34 
35## 功能说明<a name="section618mcpsimp"></a>35## 功能说明<a name="section618mcpsimp"></a>
36 36 
37-获取用户使用的workspace指针。核函数(Kernel)直调开发方式下,如果未开启HAVE\_WORKSPACE编译选项,框架不会自动设置系统workspace。如果使用了[Matmul核函数(Kernel)侧接口](../../../adv_api/cube_compute/Matmul_Kernel/Matmul_Kernel.md)等需要系统workspace的高阶API,kernel侧需要通过[SetSysWorkSpace](SetSysWorkSpace.md)设置系统workspace,此时用户workspace需要通过该接口获取。37+获取用户使用的workspace指针。核函数(Kernel)直调开发方式下,如果未开启HAVE\_WORKSPACE编译选项,框架不会自动设置系统workspace。如果使用了[Matmul核函数(Kernel)侧接口](../../../adv_api/cube_compute/Matmul_Kernel/Matmul_Kernel.md)等需要系统workspace的高阶API,核函数(Kernel)侧需要通过[SetSysWorkSpace](SetSysWorkSpace.md)设置系统workspace,此时用户workspace需要通过该接口获取。
38 38 
39## 函数原型<a name="section620mcpsimp"></a>39## 函数原型<a name="section620mcpsimp"></a>
40 40 
@@ -34,9 +34,9 @@
34 34 
35## 功能说明<a name="section618mcpsimp"></a>35## 功能说明<a name="section618mcpsimp"></a>
36 36 
37-框架需要使用的workspace称之为系统workspace。[Matmul核函数(Kernel)侧接口](../../../adv_api/cube_compute/Matmul_Kernel/Matmul_Kernel.md)等高阶API需要系统workspace,所以在使用该类API时,需要调用该接口,设置系统workspace的指针。采用工程化算子开发方式或者kernel直调方式(开启HAVE\_WORKSPACE编译选项)时,不需要开发者手动设置,框架会自动设置。其他场景下,需要开发者调用SetSysWorkSpace进行设置。37+框架需要使用的workspace称之为系统workspace。[Matmul核函数(Kernel)侧接口](../../../adv_api/cube_compute/Matmul_Kernel/Matmul_Kernel.md)等高阶API需要系统workspace,所以在使用该类API时,需要调用该接口,设置系统workspace的指针。采用工程化算子开发方式或者核函数(Kernel)直调方式(开启HAVE\_WORKSPACE编译选项)时,不需要开发者手动设置,框架会自动设置。其他场景下,需要开发者调用SetSysWorkSpace进行设置。
38 38 
39-kernel侧调用该接口前,需要在host侧调用GetLibApiWorkSpaceSize获取系统workspace的大小,并在host侧设置workspacesize大小。样例如下:39+核函数(Kernel)侧调用该接口前,需要在host侧调用GetLibApiWorkSpaceSize获取系统workspace的大小,并在host侧设置workspacesize大小。样例如下:
40 40 
41```41```
42// 用户自定义的tiling函数42// 用户自定义的tiling函数
@@ -163,7 +163,7 @@ SyncAll硬件同步和软件同步接口的内部实现不同,约束条件也
163- 软件同步接口约束:163- 软件同步接口约束:
164 - gmWorkspace缓存申请的空间大小要求大于等于GetBlockNum()*32Bytes,并且缓存的值需要初始化为0。目前常见的有两种初始化方式:164 - gmWorkspace缓存申请的空间大小要求大于等于GetBlockNum()*32Bytes,并且缓存的值需要初始化为0。目前常见的有两种初始化方式:
165 - 通过在host侧进行初始化操作,确保传入该接口时,gmWorkspace缓存已经初始化为0;165 - 通过在host侧进行初始化操作,确保传入该接口时,gmWorkspace缓存已经初始化为0;
166- - 在kernel侧初始化的时候对gmWorkspace缓存初始化,需要注意的是,每个核上都需要初始化全部的gmWorkspace缓存空间。166+ - 在核函数(Kernel)侧初始化的时候对gmWorkspace缓存初始化,需要注意的是,每个核上都需要初始化全部的gmWorkspace缓存空间。
167 - ubWorkspace申请的空间大小要求大于等于GetBlockNum()*32Bytes。167 - ubWorkspace申请的空间大小要求大于等于GetBlockNum()*32Bytes。
168 - 在纯Vector算子场景中,若所有AIV核默认参与同步,推荐采用性能更优的硬件同步接口;若需指定部分AIV核参与同步,则应使用软件同步接口,并通过入参usedCores完成配置。168 - 在纯Vector算子场景中,若所有AIV核默认参与同步,推荐采用性能更优的硬件同步接口;若需指定部分AIV核参与同步,则应使用软件同步接口,并通过入参usedCores完成配置。
169 - usedCores传入数值不能超过算子调用时指定的逻辑AI Core中AIV的数量:GetBlockNum()*GetTaskRatio(),不传此参数表示全核软同步。169 - usedCores传入数值不能超过算子调用时指定的逻辑AI Core中AIV的数量:GetBlockNum()*GetTaskRatio(),不传此参数表示全核软同步。
@@ -15,7 +15,7 @@
15**图1** 同步控制模式示意图<a id="sync_control_mode_diagram"></a> 15**图1** 同步控制模式示意图<a id="sync_control_mode_diagram"></a>
16![](../../../../figures/3510_sync_control_mode_diagram.png "同步控制模式示意图")16![](../../../../figures/3510_sync_control_mode_diagram.png "同步控制模式示意图")
17 17 
18-下述同步特性均以如下场景配置为例:核函数使用`__mix__(1, 2)`修饰,即每个AI Core包含1个AIC和2个AIV,并设置逻辑核数`numBlocks=2`,即共启动2个AI Core,因此存在2个AIC和4个AIV。为便于描述,将2个AIC分别编号为AIC0、AIC1;AI Core0中的2个AIV分别编号为AIV0-0、AIV0-1,AI Core1中的2个AIV分别编号为AIV1-0、AIV1-1。**各核中与`flagId`对应的计数器初始值均为0。**18+下述同步特性均以如下场景配置为例:核函数(Kernel)使用`__mix__(1, 2)`修饰,即每个AI Core包含1个AIC和2个AIV,并设置逻辑核数`numBlocks=2`,即共启动2个AI Core,因此存在2个AIC和4个AIV。为便于描述,将2个AIC分别编号为AIC0、AIC1;AI Core0中的2个AIV分别编号为AIV0-0、AIV0-1,AI Core1中的2个AIV分别编号为AIV1-0、AIV1-1。**各核中与`flagId`对应的计数器初始值均为0。**
19 19 
20<!-- npu="A3,910b" id1 -->20<!-- npu="A3,910b" id1 -->
21 21 
@@ -41,7 +41,7 @@
41以图2为例,演示2个AI Core中的2个AIC(AIC0、AIC1)进行全核同步,代码片段如下:41以图2为例,演示2个AI Core中的2个AIC(AIC0、AIC1)进行全核同步,代码片段如下:
42 42 
43```cpp43```cpp
44-// 进行核间同步时,即使只有AIC参与同步也不能用__cube__修饰核函数,具体原因请参考CrossCoreSetFlag的约束说明。44+// 进行核间同步时,即使只有AIC参与同步也不能用__cube__修饰核函数(Kernel),具体原因请参考CrossCoreSetFlag的约束说明。
45if (ASCEND_IS_AIC) {45if (ASCEND_IS_AIC) {
46 // 每个核都应该有类似如下的成对调用CrossCoreSetFlag和CrossCoreWaitFlag。46 // 每个核都应该有类似如下的成对调用CrossCoreSetFlag和CrossCoreWaitFlag。
47 // modeId必须配置为0,flagId要一致;CrossCoreWaitFlag的pipe使用默认值。47 // modeId必须配置为0,flagId要一致;CrossCoreWaitFlag的pipe使用默认值。
@@ -69,7 +69,7 @@ AIC1的CrossCoreSetFlag执行完后,此时调度模块感知到2个AIC均已
69以图3为例,演示第0个AI Core中的2个AIV(AIV0-0、AIV0-1)进行全核同步,代码片段如下:69以图3为例,演示第0个AI Core中的2个AIV(AIV0-0、AIV0-1)进行全核同步,代码片段如下:
70 70 
71```cpp71```cpp
72-// 进行核间同步时,即使只有AIV参与同步也不能用__vector__修饰核函数,具体原因请参考CrossCoreSetFlag的约束说明。72+// 进行核间同步时,即使只有AIV参与同步也不能用__vector__修饰核函数(Kernel),具体原因请参考CrossCoreSetFlag的约束说明。
73if (ASCEND_IS_AIV) {73if (ASCEND_IS_AIV) {
74 if (AscendC:: GetBlockIdx() <= 1) {74 if (AscendC:: GetBlockIdx() <= 1) {
75 // 参与同步的2个AIV属于第0个AI Core。75 // 参与同步的2个AIV属于第0个AI Core。
@@ -132,7 +132,7 @@ SuperKernel是一种算子的二进制融合技术,与源码融合不同,它
132 132 
133```cpp133```cpp
134AscendC::DataCopy(dstGlobal, dstLocal, TOTAL_LENGTH);134AscendC::DataCopy(dstGlobal, dstLocal, TOTAL_LENGTH);
135-// 在最后一条搬运指令后调用,使之后的指令可与后续子kernel并行执行。135+// 在最后一条搬运指令后调用,使之后的指令可与后续子核函数(Kernel)并行执行。
136AscendC::SetNextTaskStart();136AscendC::SetNextTaskStart();
137```137```
138 138 
@@ -82,7 +82,7 @@ AscendC::LocalTensor<T> src0Local = ubAllocator.Alloc<T, TOTAL_LENGTH>();
82AscendC::LocalTensor<T> src1Local = ubAllocator.Alloc<T, TOTAL_LENGTH>();82AscendC::LocalTensor<T> src1Local = ubAllocator.Alloc<T, TOTAL_LENGTH>();
83AscendC::LocalTensor<T> dstLocal = ubAllocator.Alloc<T, TOTAL_LENGTH>();83AscendC::LocalTensor<T> dstLocal = ubAllocator.Alloc<T, TOTAL_LENGTH>();
84 84 
85-// 在第一条搬运指令前调用,使之前的指令可与前序子kernel并行执行。85+// 在第一条搬运指令前调用,使之前的指令可与前序子核函数(Kernel)并行执行。
86AscendC::WaitPreTaskEnd();86AscendC::WaitPreTaskEnd();
87 87 
88AscendC::DataCopy(src0Local, src0Global, TOTAL_LENGTH);88AscendC::DataCopy(src0Local, src0Global, TOTAL_LENGTH);
@@ -263,7 +263,7 @@ AscendC::Add(zLocal, xLocal, yLocal, blockLength);
263根据开发场景不同,添加该编译选项的方式如下:263根据开发场景不同,添加该编译选项的方式如下:
264 264 
265- 直接使用毕昇编译器的场景,可以直接在编译命令中添加该编译选项。265- 直接使用毕昇编译器的场景,可以直接在编译命令中添加该编译选项。
266-- 使用Ascend C kernel直调算子工程,可以通过`ascendc_compile_options`添加该编译选项。266+- 使用Ascend C核函数(Kernel)直调算子工程,可以通过`ascendc_compile_options`添加该编译选项。
267- 使用Ascend C自定义算子开发工程,可以通过`add_ops_compile_options`添加该编译选项。267- 使用Ascend C自定义算子开发工程,可以通过`add_ops_compile_options`添加该编译选项。
268 268 
269如下的代码文件sync_log_test.h:269如下的代码文件sync_log_test.h:
@@ -31,7 +31,7 @@ C API是Ascend C三层梯度化编程接口中的**语言扩展层SIMD API**,
31|名称|描述|31|名称|描述|
32|-----------------------|-----------------------|32|-----------------------|-----------------------|
33|\_\_gm\_\_|存储空间定义修饰符,表示被修饰的变量位于Global Memory地址空间。|33|\_\_gm\_\_|存储空间定义修饰符,表示被修饰的变量位于Global Memory地址空间。|
34-|\_\_ubuf\_\_|存储空间定义修饰符,表示被修饰的变量位于UB地址空间。|34+|\_\_ubuf\_\_|存储空间定义修饰符,表示被修饰的变量位于Unified Buffer(UB地址空间。|
35|\_\_aicore\_\_|执行空间限定符。表示该函数只能在Ai Core上执行。|35|\_\_aicore\_\_|执行空间限定符。表示该函数只能在Ai Core上执行。|
36|\_\_cbuf\_\_|存储空间定义修饰符,表示被修饰的变量位于L1 Buffer地址空间。|36|\_\_cbuf\_\_|存储空间定义修饰符,表示被修饰的变量位于L1 Buffer地址空间。|
37|\_\_simd\_callee\_\_|执行空间限定符。表示该函数只能在Reg上执行。|37|\_\_simd\_callee\_\_|执行空间限定符。表示该函数只能在Reg上执行。|
@@ -42,7 +42,7 @@ NPU内部有不同的计算单元,在计算时往往需要把计算数据搬
42- PIPE_S:标量流水线,负责指令分发和标量计算。42- PIPE_S:标量流水线,负责指令分发和标量计算。
43- PIPE_V:矢量计算流水线。43- PIPE_V:矢量计算流水线。
44- PIPE_M:矩阵计算流水线。44- PIPE_M:矩阵计算流水线。
45-- PIPE_MTE1:搬运操作。包括从L1 Buffer到L0A Buffer或L0B Buffer,从L1 Buffer到Unified Buffer(UB的搬运操作和L0A Buffer或L0B Buffer的初始化操作。45+- PIPE_MTE1:搬运操作。包括从L1 Buffer到L0A Buffer或L0B Buffer,从L1 Buffer到UB的搬运操作和L0A Buffer或L0B Buffer的初始化操作。
46- PIPE_MTE2:搬运操作。包括从GM到L1 Buffer、从GM到L0A Buffer或L0B Buffer、从GM到UB的搬运操作和L1 Buffer的初始化操作。46- PIPE_MTE2:搬运操作。包括从GM到L1 Buffer、从GM到L0A Buffer或L0B Buffer、从GM到UB的搬运操作和L1 Buffer的初始化操作。
47- PIPE_MTE3:搬运操作。包括从UB到GM、从UB到L1 Buffer、从L1 Buffer到GM的操作和从UB到UB的搬运操作。47- PIPE_MTE3:搬运操作。包括从UB到GM、从UB到L1 Buffer、从L1 Buffer到GM的操作和从UB到UB的搬运操作。
48- PIPE_FIX:Fixpipe流水线。48- PIPE_FIX:Fixpipe流水线。
@@ -342,7 +342,7 @@ C API文档按最细粒度公共头文件归类。除试验接口外,整体使
342 342 
343|API名称|说明|最细粒度公共头文件|343|API名称|说明|最细粒度公共头文件|
344|---|---|---|344|---|---|---|
345-|[asc_loadalign](reg_compute/load/asc_loadalign.md)|对齐数据搬运接口,从UB连续对齐搬入目的操作数,NORM搬入模式。|`c_api/reg_compute/load/loadalign.h`|345+|[asc_loadalign](reg_compute/load/asc_loadalign.md)|对齐数据搬运接口,从Unified Buffer(UB连续对齐搬入目的操作数,NORM搬入模式。|`c_api/reg_compute/load/loadalign.h`|
346|[asc_loadalign_datablock_strided](reg_compute/load/asc_loadalign_datablock_strided.md)|对齐数据搬运接口,从UB非连续对齐搬入8个DataBlock,通过函数返回值返回矢量数据寄存器。|`c_api/reg_compute/load/loadalign.h`|346|[asc_loadalign_datablock_strided](reg_compute/load/asc_loadalign_datablock_strided.md)|对齐数据搬运接口,从UB非连续对齐搬入8个DataBlock,通过函数返回值返回矢量数据寄存器。|`c_api/reg_compute/load/loadalign.h`|
347|[asc_loadalign_mask](reg_compute/load/asc_loadalign_mask.md)|对齐数据搬运接口,从UB连续对齐搬入掩码数据,通过函数返回值返回掩码寄存器。|`c_api/reg_compute/load/loadalign.h`|347|[asc_loadalign_mask](reg_compute/load/asc_loadalign_mask.md)|对齐数据搬运接口,从UB连续对齐搬入掩码数据,通过函数返回值返回掩码寄存器。|`c_api/reg_compute/load/loadalign.h`|
348|[asc_loadalign_brc_datablock](reg_compute/load/asc_loadalign_brc_datablock.md)|对齐数据搬运接口,从UB连续对齐搬入目的操作数,读取一个DataBlock并广播到VL。|`c_api/reg_compute/load/loadalign.h`|348|[asc_loadalign_brc_datablock](reg_compute/load/asc_loadalign_brc_datablock.md)|对齐数据搬运接口,从UB连续对齐搬入目的操作数,读取一个DataBlock并广播到VL。|`c_api/reg_compute/load/loadalign.h`|
@@ -30,7 +30,7 @@
30 30 
31如图1所示,在AI Core内部,访问Global Memory(GM)与Unified Buffer(UB)的方式分为以下两种:31如图1所示,在AI Core内部,访问Global Memory(GM)与Unified Buffer(UB)的方式分为以下两种:
32 32 
33-- DMA搬运单元读写GM,数据通过[asc_copy_ub2gm](../vector_datamove/asc_copy_ub2gm/asc_copy_ub2gm.md)和[asc_copy_gm2ub](../vector_datamove/asc_copy_gm2ub/asc_copy_gm2ub.md)等接口在Unified Buffer(UB等Local Memory和GM间交互,不经过DCache,因此不需要考虑Cache一致性问题。33+- DMA搬运单元读写GM,数据通过[asc_copy_ub2gm](../vector_datamove/asc_copy_ub2gm/asc_copy_ub2gm.md)和[asc_copy_gm2ub](../vector_datamove/asc_copy_gm2ub/asc_copy_gm2ub.md)等接口在UB等Local Memory和GM间交互,不经过DCache,因此不需要考虑Cache一致性问题。
34- Scalar单元访问GM,若经过Dcache,首先会访问每个核内的DCache,因此存在DCache与GM的Cache一致性问题,具体原因请参考[缓存一致性](../../../../guide/programming_guide/advanced_programming/memory_model/cache_coherence.md)。34- Scalar单元访问GM,若经过Dcache,首先会访问每个核内的DCache,因此存在DCache与GM的Cache一致性问题,具体原因请参考[缓存一致性](../../../../guide/programming_guide/advanced_programming/memory_model/cache_coherence.md)。
35 35 
36**图1** DataCache内存层次示意图36**图1** DataCache内存层次示意图
@@ -228,7 +228,7 @@ int main()
228 }228 }
229 }229 }
230 230 
231- // 分配Device内存、启动Kernel并校验结果。231+ // 分配Device内存、启动核函数(Kernel并校验结果。
232 aclInit(nullptr);232 aclInit(nullptr);
233 aclrtSetDevice(0);233 aclrtSetDevice(0);
234 int8_t *a_device = nullptr, *b_device = nullptr;234 int8_t *a_device = nullptr, *b_device = nullptr;
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/cube_datamove/cube_datamove.h"`29头文件路径为:`"c_api/cube_datamove/cube_datamove.h"`
30 30 
31-将矩阵计算结果从L0C Buffer搬运至Unified Buffer,搬运过程中可同步支持随路量化、随路激活、随路格式转换(Nz2ND/Nz2DN)等能力组合。31+将矩阵计算结果从L0C Buffer搬运至Unified Buffer(UB),搬运过程中可同步支持随路量化、随路激活、随路格式转换(Nz2ND/Nz2DN)等能力组合。
32 32 
33下图展示了随路量化、随路ReLU、随路格式转换、随路通道拆分以及随路通道合并的有效组合、中间数据类型和数据路径,通过连线颜色区分支持的场景组合。下图中的F32-\>F16与F32-\>BF16为Cast,其余为随路scalar/tensor量化模式。33下图展示了随路量化、随路ReLU、随路格式转换、随路通道拆分以及随路通道合并的有效组合、中间数据类型和数据路径,通过连线颜色区分支持的场景组合。下图中的F32-\>F16与F32-\>BF16为Cast,其余为随路scalar/tensor量化模式。
34 34 
@@ -245,7 +245,7 @@ int main()
245 }245 }
246 }246 }
247 247 
248- // 分配Device内存、执行Kernel并取回结果。248+ // 分配Device内存、执行核函数(Kernel并取回结果。
249 aclInit(nullptr);249 aclInit(nullptr);
250 aclrtSetDevice(0);250 aclrtSetDevice(0);
251 int8_t *a_device = nullptr, *b_device = nullptr;251 int8_t *a_device = nullptr, *b_device = nullptr;
@@ -217,7 +217,7 @@ int main()
217 }217 }
218 }218 }
219 219 
220- // 分配Device内存、执行Kernel并取回结果。220+ // 分配Device内存、执行核函数(Kernel并取回结果。
221 aclInit(nullptr);221 aclInit(nullptr);
222 aclrtSetDevice(0);222 aclrtSetDevice(0);
223 uint8_t *a_device = nullptr, *b_device = nullptr;223 uint8_t *a_device = nullptr, *b_device = nullptr;
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/cube_datamove/cube_datamove.h"`29头文件路径为:`"c_api/cube_datamove/cube_datamove.h"`
30 30 
31-将数据从L1 Buffer搬运到Unified Buffer,按数据块个数、单个数据块长度以及源/目间隔实现连续与非连续搬运。数据搬运时格式和内容保持不变。31+将数据从L1 Buffer搬运到Unified Buffer(UB),按数据块个数、单个数据块长度以及源/目间隔实现连续与非连续搬运。数据搬运时格式和内容保持不变。
32 32 
33本接口仅在AIC上执行有效。33本接口仅在AIC上执行有效。
34 34 
@@ -180,7 +180,7 @@ int main()
180 std::vector<float> output(ELEMENTS);180 std::vector<float> output(ELEMENTS);
181 const std::vector<float> golden(ELEMENTS, static_cast<float>(K));181 const std::vector<float> golden(ELEMENTS, static_cast<float>(K));
182 182 
183- // 分配Device内存、启动Kernel并校验结果。183+ // 分配Device内存、启动核函数(Kernel并校验结果。
184 aclInit(nullptr);184 aclInit(nullptr);
185 aclrtSetDevice(0);185 aclrtSetDevice(0);
186 float* output_device = nullptr;186 float* output_device = nullptr;
@@ -84,7 +84,7 @@ bisheng examples.asc -o main --npu-arch=dav-3510
84#include <cstdint>84#include <cstdint>
85#include "c_api/asc_simd.h"85#include "c_api/asc_simd.h"
86 86 
87-// 该核函数在AIC上执行GM到L1的搬运。87+// 该核函数(Kernel)在AIC上执行GM到L1的搬运。
88__global__ __cube__ void Gm2L1AlignPadExample(__gm__ uint8_t* src)88__global__ __cube__ void Gm2L1AlignPadExample(__gm__ uint8_t* src)
89{89{
90 asc_init();90 asc_init();
@@ -229,7 +229,7 @@ int main()
229 }229 }
230 }230 }
231 231 
232- // 分配Device内存、启动Kernel并校验结果。232+ // 分配Device内存、启动核函数(Kernel并校验结果。
233 aclInit(nullptr);233 aclInit(nullptr);
234 aclrtSetDevice(0);234 aclrtSetDevice(0);
235 int8_t *a_device = nullptr, *b_device = nullptr;235 int8_t *a_device = nullptr, *b_device = nullptr;
@@ -28,7 +28,7 @@
28 28 
29**高维切分搬运接口已废弃,请使用`asc_load_l2_cache_mode`类型枚举值进行L2 Cache管理策略配置,新接口形式请参见[asc_copy_gm2ub_align高维切分数据搬运接口](../vector_datamove/asc_copy_gm2ub_align/asc_copy_gm2ub_align_arch_3510.md#高维切分数据搬运)。**29**高维切分搬运接口已废弃,请使用`asc_load_l2_cache_mode`类型枚举值进行L2 Cache管理策略配置,新接口形式请参见[asc_copy_gm2ub_align高维切分数据搬运接口](../vector_datamove/asc_copy_gm2ub_align/asc_copy_gm2ub_align_arch_3510.md#高维切分数据搬运)。**
30 30 
31-提供数据非对齐搬运的功能,将数据从Global Memory (GM)搬运到Unified Buffer (UB),并支持8位/16位/32位数据类型搬运。31+提供数据非对齐搬运的功能,将数据从Global Memory (GM)搬运到Unified BufferUB,并支持8位/16位/32位数据类型搬运。
32 32 
33本接口为高维切分搬运方式。若搬运数据长度非32字节对齐,会将搬运数据补齐至32字节对齐。可通过配置参数`dst_stride`选择Normal模式或Compact模式。非32字节对齐场景支持以下两种填充方式:33本接口为高维切分搬运方式。若搬运数据长度非32字节对齐,会将搬运数据补齐至32字节对齐。可通过配置参数`dst_stride`选择Normal模式或Compact模式。非32字节对齐场景支持以下两种填充方式:
34 34 
@@ -30,7 +30,7 @@
30 30 
31**`asc_copy_gm2ub_align_sync`接口已废弃,请使用[asc_copy_gm2ub_align连续数据搬运](../vector_datamove/asc_copy_gm2ub_align/asc_copy_gm2ub_align_arch_3510.md#连续数据搬运)和同步接口[asc_sync](../sync/asc_sync.md)替代。**31**`asc_copy_gm2ub_align_sync`接口已废弃,请使用[asc_copy_gm2ub_align连续数据搬运](../vector_datamove/asc_copy_gm2ub_align/asc_copy_gm2ub_align_arch_3510.md#连续数据搬运)和同步接口[asc_sync](../sync/asc_sync.md)替代。**
32 32 
33-提供数据非对齐搬运的功能,将数据从Global Memory (GM)搬运到Unified Buffer (UB),并支持8位/16位/32位数据类型搬运。33+提供数据非对齐搬运的功能,将数据从Global Memory (GM)搬运到Unified BufferUB,并支持8位/16位/32位数据类型搬运。
34 34 
35本接口为同步搬运接口。若搬运数据长度非32字节对齐,搬运数据会补齐至32字节对齐,支持以下两种填充方式:35本接口为同步搬运接口。若搬运数据长度非32字节对齐,搬运数据会补齐至32字节对齐,支持以下两种填充方式:
36 36 
@@ -30,7 +30,7 @@
30 30 
31**`asc_copy_l0c2ub_sync`接口已废弃,请使用[对应的非同步接口](../cube_datamove/asc_copy_l0c2ub.md)和同步接口[asc_sync](../sync/asc_sync.md)替代。**31**`asc_copy_l0c2ub_sync`接口已废弃,请使用[对应的非同步接口](../cube_datamove/asc_copy_l0c2ub.md)和同步接口[asc_sync](../sync/asc_sync.md)替代。**
32 32 
33-将矩阵计算结果从L0C Buffer搬运至Unified Buffer,搬运过程中可同步支持随路量化、随路激活、随路格式转换(Nz2ND/Nz2DN)等能力组合。33+将矩阵计算结果从L0C Buffer搬运至Unified Buffer(UB),搬运过程中可同步支持随路量化、随路激活、随路格式转换(Nz2ND/Nz2DN)等能力组合。
34 34 
35下图展示了随路量化、随路ReLU、随路格式转换、随路通道拆分以及随路通道合并的有效组合、中间数据类型和数据路径。下图中的F32-\>F16与F32-\>BF16为Cast,其余为随路scalar/tensor量化模式。35下图展示了随路量化、随路ReLU、随路格式转换、随路通道拆分以及随路通道合并的有效组合、中间数据类型和数据路径。下图中的F32-\>F16与F32-\>BF16为Cast,其余为随路scalar/tensor量化模式。
36 36 
@@ -220,7 +220,7 @@ int main()
220 }220 }
221 }221 }
222 222 
223- // 分配Device内存、执行Kernel并取回结果。223+ // 分配Device内存、执行核函数(Kernel并取回结果。
224 aclInit(nullptr);224 aclInit(nullptr);
225 aclrtSetDevice(0);225 aclrtSetDevice(0);
226 uint8_t *a_device = nullptr, *b_device = nullptr;226 uint8_t *a_device = nullptr, *b_device = nullptr;
@@ -219,7 +219,7 @@ int main()
219 }219 }
220 }220 }
221 221 
222- // 分配Device内存、执行Kernel并取回结果。222+ // 分配Device内存、执行核函数(Kernel并取回结果。
223 aclInit(nullptr);223 aclInit(nullptr);
224 aclrtSetDevice(0);224 aclrtSetDevice(0);
225 int8_t *a_device = nullptr, *b_device = nullptr;225 int8_t *a_device = nullptr, *b_device = nullptr;
@@ -28,7 +28,7 @@
28 28 
29**高维切分搬运接口已废弃,请使用`asc_store_l2_cache_mode`类型枚举值进行L2 Cache管理策略配置,新接口形式请参见[asc_copy_ub2gm_align高维切分数据搬运接口](../vector_datamove/asc_copy_ub2gm_align/asc_copy_ub2gm_align_arch_3510.md#高维切分数据搬运)。**29**高维切分搬运接口已废弃,请使用`asc_store_l2_cache_mode`类型枚举值进行L2 Cache管理策略配置,新接口形式请参见[asc_copy_ub2gm_align高维切分数据搬运接口](../vector_datamove/asc_copy_ub2gm_align/asc_copy_ub2gm_align_arch_3510.md#高维切分数据搬运)。**
30 30 
31-提供数据非对齐搬运的功能,将数据从Unified Buffer (UB)搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。31+提供数据非对齐搬运的功能,将数据从Unified BufferUB搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。
32 32 
33本接口为高维切分搬运方式,不支持设置填充值。若搬运数据长度非32字节对齐,硬件在读取UB数据时补充dummy假数据,将搬运数据补齐至32字节对齐。写入GM时会丢弃补充的dummy假数据。可通过配置参数`src_stride`选择Normal模式或Compact模式:33本接口为高维切分搬运方式,不支持设置填充值。若搬运数据长度非32字节对齐,硬件在读取UB数据时补充dummy假数据,将搬运数据补齐至32字节对齐。写入GM时会丢弃补充的dummy假数据。可通过配置参数`src_stride`选择Normal模式或Compact模式:
34 34 
@@ -30,7 +30,7 @@
30 30 
31**`asc_copy_ub2gm_align_sync`接口已废弃,请使用[asc_copy_ub2gm_align连续数据搬运](../vector_datamove/asc_copy_ub2gm_align/asc_copy_ub2gm_align_arch_3510.md#连续数据搬运)和同步接口[asc_sync](../sync/asc_sync.md)替代。**31**`asc_copy_ub2gm_align_sync`接口已废弃,请使用[asc_copy_ub2gm_align连续数据搬运](../vector_datamove/asc_copy_ub2gm_align/asc_copy_ub2gm_align_arch_3510.md#连续数据搬运)和同步接口[asc_sync](../sync/asc_sync.md)替代。**
32 32 
33-提供数据非对齐搬运的功能,将数据从Unified Buffer (UB)搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。33+提供数据非对齐搬运的功能,将数据从Unified BufferUB搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。
34 34 
35本接口为同步搬运接口,不支持设置填充值。若搬运数据长度非32字节对齐,硬件在读取UB数据时自动补充dummy假数据,将搬运数据补齐至32字节对齐。写入GM时会丢弃补充的dummy假数据。35本接口为同步搬运接口,不支持设置填充值。若搬运数据长度非32字节对齐,硬件在读取UB数据时自动补充dummy假数据,将搬运数据补齐至32字节对齐。写入GM时会丢弃补充的dummy假数据。
36 36 
@@ -173,7 +173,7 @@ int main()
173 std::vector<float> output(ELEMENTS);173 std::vector<float> output(ELEMENTS);
174 const std::vector<float> golden(ELEMENTS, static_cast<float>(K));174 const std::vector<float> golden(ELEMENTS, static_cast<float>(K));
175 175 
176- // 分配Device内存、启动Kernel并校验结果。176+ // 分配Device内存、启动核函数(Kernel并校验结果。
177 aclInit(nullptr);177 aclInit(nullptr);
178 aclrtSetDevice(0);178 aclrtSetDevice(0);
179 float* output_device = nullptr;179 float* output_device = nullptr;
@@ -61,7 +61,7 @@ AI Core内外包含多级存储单元,各存储单元的主要用途如下:
61 61 
62使用高维切分计算API可充分发挥硬件优势,支持开发者控制指令的迭代执行和操作数的地址间隔,功能更加灵活。62使用高维切分计算API可充分发挥硬件优势,支持开发者控制指令的迭代执行和操作数的地址间隔,功能更加灵活。
63 63 
64-矢量计算通过Vector计算单元完成,矢量计算的源操作数和目的操作数均通过Unified Buffer(UB来进行存储。Vector计算单元每个迭代会从UB中取出8个DataBlock(每个DataBlock数据块内部地址连续,长度32Byte),进行计算,并写入对应的8个DataBlock中。下图为单次迭代内的8个DataBlock进行Exp计算的示意图。64+矢量计算通过Vector计算单元完成,矢量计算的源操作数和目的操作数均通过UB来进行存储。Vector计算单元每个迭代会从UB中取出8个DataBlock(每个DataBlock数据块内部地址连续,长度32Byte),进行计算,并写入对应的8个DataBlock中。下图为单次迭代内的8个DataBlock进行Exp计算的示意图。
65 65 
66**图2** 单次迭代内的8个DataBlock进行Exp计算示意图66**图2** 单次迭代内的8个DataBlock进行Exp计算示意图
67 67 
@@ -80,7 +80,7 @@ __simd_callee__ inline void asc_duplicate(vector_int8_t& dst,
80## 约束说明80## 约束说明
81 81 
82- 本接口为Reg矢量计算接口,只能在使用`__simd_vf__`标记的VF函数内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。82- 本接口为Reg矢量计算接口,只能在使用`__simd_vf__`标记的VF函数内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。
83-- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。83+- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一Unified Buffer(UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。
84- 使用mask前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。84- 使用mask前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。
85- mask仅筛选dst中写入广播值的位置,不筛选src中的元素。无论mask的最低位是否有效,待广播的数据均为src的最低位元素。85- mask仅筛选dst中写入广播值的位置,不筛选src中的元素。无论mask的最低位是否有效,待广播的数据均为src的最低位元素。
86 86 
@@ -76,7 +76,7 @@ __simd_callee__ inline void asc_duplicate_highest(vector_float& dst,
76- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。76- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。
77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。
78- `mask`仅筛选`dst`中写入广播值的位置,不筛选`src`中的元素。无论`mask`的最高位是否有效,待广播的数据均为`src`的最高位元素。78- `mask`仅筛选`dst`中写入广播值的位置,不筛选`src`中的元素。无论`mask`的最高位是否有效,待广播的数据均为`src`的最高位元素。
79-- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。79+- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一Unified Buffer(UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。
80 80 
81## 调用示例81## 调用示例
82 82 
@@ -77,7 +77,7 @@ __simd_callee__ inline void asc_duplicate_highest_merge(vector_float& dst,
77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。
78- `mask`仅筛选`dst`中写入广播值的位置,不筛选`src`中的元素。无论`mask`的最高位是否有效,待广播的数据均为`src`的最高位元素。78- `mask`仅筛选`dst`中写入广播值的位置,不筛选`src`中的元素。无论`mask`的最高位是否有效,待广播的数据均为`src`的最高位元素。
79- 调用接口前需要初始化`dst`,否则未被`mask`筛选的元素值不确定。79- 调用接口前需要初始化`dst`,否则未被`mask`筛选的元素值不确定。
80-- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。80+- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一Unified Buffer(UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。
81 81 
82## 调用示例82## 调用示例
83 83 
@@ -112,7 +112,7 @@ __simd_callee__ inline void asc_duplicate_scalar(vector_int8_t& dst,
112## 约束说明112## 约束说明
113 113 
114- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。114- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。
115-- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。115+- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一Unified Buffer(UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。
116- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。116- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。
117- 调用带返回值接口时,应使用类型明确的变量或显式类型转换,例如`static_cast<uint8_t>(1)`,以匹配正确的函数原型。117- 调用带返回值接口时,应使用类型明确的变量或显式类型转换,例如`static_cast<uint8_t>(1)`,以匹配正确的函数原型。
118 118 
@@ -76,7 +76,7 @@ __simd_callee__ inline void asc_duplicate_scalar_merge(vector_float& dst,
76- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。76- 本接口只能在使用`__simd_vf__`标记的Vector Function内调用,不支持在`__aicore__`函数中直接调用,仅在AIV上生效,在AIC上调用将直接返回。
77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。77- 使用`mask`前,需要通过掩码设置或搬入接口完成初始化;未初始化的掩码寄存器内容不确定。
78- 调用接口前需要初始化`dst`,否则未被`mask`筛选的元素值不确定。78- 调用接口前需要初始化`dst`,否则未被`mask`筛选的元素值不确定。
79-- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。79+- 同一寄存器的数据依赖由硬件保序,无需额外插入同步指令。本接口与前后Reg数据搬运接口之间,如果不同寄存器访问同一Unified Buffer(UB地址且存在写后读或写后写依赖,需要调用[asc_mem_bar](../reg_sync/asc_mem_bar.md)进行同步。
80 80 
81## 调用示例81## 调用示例
82 82 
@@ -30,7 +30,7 @@
30 30 
31将src中被mask筛选的有效元素复制到返回值对应位置,未被mask筛选的位置置为0(ZEROING模式),并通过函数返回值返回结果。支持以下两种模式:31将src中被mask筛选的有效元素复制到返回值对应位置,未被mask筛选的位置置为0(ZEROING模式),并通过函数返回值返回结果。支持以下两种模式:
32 32 
33-- 矢量数据寄存器复制到矢量数据寄存器:将src中被mask筛选的有效元素复制到返回值对应位置,未被mask筛选的位置保持原值。33+- 矢量数据寄存器复制到矢量数据寄存器:将src中被mask筛选的有效元素复制到返回值对应位置,未被mask筛选的位置值未定义
34- 掩码寄存器复制到掩码寄存器:将src中被mask筛选的bit复制到返回值中,未被mask筛选的位置置为0。支持带mask和不带mask两种重载:34- 掩码寄存器复制到掩码寄存器:将src中被mask筛选的bit复制到返回值中,未被mask筛选的位置置为0。支持带mask和不带mask两种重载:
35 - 带mask:将src中被mask筛选的bit复制到返回值。对于b8模式,mask的每个bit控制src的一个bit;对于b16模式,mask的每2bit为一组、仅LSB控制src的一个bit;对于b32模式,mask的每4bit为一组、仅LSB控制src的一个bit。35 - 带mask:将src中被mask筛选的bit复制到返回值。对于b8模式,mask的每个bit控制src的一个bit;对于b16模式,mask的每2bit为一组、仅LSB控制src的一个bit;对于b32模式,mask的每4bit为一组、仅LSB控制src的一个bit。
36 - 不带mask:将src的所有bit复制到返回值。36 - 不带mask:将src的所有bit复制到返回值。
@@ -65,7 +65,7 @@ vector_bool,掩码寄存器。
65## 约束说明65## 约束说明
66 66 
67- 本接口仅在AIV上生效,非AIV调用直接返回。67- 本接口仅在AIV上生效,非AIV调用直接返回。
68-- 掩码寄存器的数量上限为8,超过上限的掩码寄存器会写入预留的8K UB内存中,可能引起性能劣化。编译器会自动复用生命周期结束的寄存器和预留内存,若两者均可用,优先复用寄存器。68+- 掩码寄存器的数量上限为8,超过上限的掩码寄存器会写入预留的8K Unified Buffer(UB内存中,可能引起性能劣化。编译器会自动复用生命周期结束的寄存器和预留内存,若两者均可用,优先复用寄存器。
69- 本接口需在Vector Function(`__simd_vf__`标记的函数)内调用。69- 本接口需在Vector Function(`__simd_vf__`标记的函数)内调用。
70 70 
71## 调用示例71## 调用示例
@@ -52,7 +52,7 @@
52 52 
53本接口仅在AIV上执行有效。53本接口仅在AIV上执行有效。
54 54 
55-从矢量数据寄存器压缩搬出到Unified Buffer(UB的接口,根据`mask`将`src`中有效元素的低半部分bit数据连续存储于`dst`中,支持数据类型为`b16`、`b32`、`b64`。55+从矢量数据寄存器压缩搬出到UB的接口,根据`mask`将`src`中有效元素的低半部分bit数据连续存储于`dst`中,支持数据类型为`b16`、`b32`、`b64`。
56 56 
57## 函数原型57## 函数原型
58 58 
@@ -30,7 +30,7 @@
30 30 
31根据索引位置`index`将源操作数`src`按元素收集到目的操作数`dst`中。31根据索引位置`index`将源操作数`src`按元素收集到目的操作数`dst`中。
32 32 
33-**UB源收集模式**:源操作数为UB地址,目的操作数为矢量数据寄存器。按`index`矢量寄存器中保存的逐元素索引,从UB中读取对应位置的元素写入`dst`对应位置,受`mask`掩码控制;`mask`比特位为0的位置对应`dst`位置写0。33+**UB源收集模式**:源操作数为Unified Buffer(UB地址,目的操作数为矢量数据寄存器。按`index`矢量寄存器中保存的逐元素索引,从UB中读取对应位置的元素写入`dst`对应位置,受`mask`掩码控制;`mask`比特位为0的位置对应`dst`位置写0。
34 34 
35**图 1** UB源收集模式35**图 1** UB源收集模式
36 36 
@@ -54,7 +54,7 @@ PIPE_S
54 54 
55## 调用示例55## 调用示例
56 56 
57-本示例模拟稀疏数据压缩场景:输入包含256个`uint16_t`数据,掩码选择每4个数据中的第1个,连续筛选并搬出64个有效数据。Kernel通过`asc_get_squeeze_status`获取已搬出的有效字节数,Host侧检查返回值是否为128字节。筛选流程完成后,需要调用[asc_squeeze_and_storeunalign_finalize](../reg_compute/reg_permute_sel/asc_squeeze_and_storeunalign_finalize.md)搬出尾块。57+本示例模拟稀疏数据压缩场景:输入包含256个`uint16_t`数据,掩码选择每4个数据中的第1个,连续筛选并搬出64个有效数据。核函数(Kernel通过`asc_get_squeeze_status`获取已搬出的有效字节数,Host侧检查返回值是否为128字节。筛选流程完成后,需要调用[asc_squeeze_and_storeunalign_finalize](../reg_compute/reg_permute_sel/asc_squeeze_and_storeunalign_finalize.md)搬出尾块。
58 58 
59将代码保存为`example.asc`后,可通过`bisheng`命令编译运行。产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。59将代码保存为`example.asc`后,可通过`bisheng`命令编译运行。产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。
60 60 
@@ -67,7 +67,7 @@ PIPE_S
67 67 
68## 约束说明68## 约束说明
69 69 
70-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_block_arrive`和`asc_sync_block_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。70+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_block_arrive`和`asc_sync_block_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。
71- 针对`asc_sync_block_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_block_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_block_wait](asc_sync_block_wait.md#约束说明)的约束说明。71- 针对`asc_sync_block_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_block_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_block_wait](asc_sync_block_wait.md#约束说明)的约束说明。
72- 不同NPU架构中AIC和AIV支持的`pipe`取值存在差异,具体情况如下:<a id="supported_pipe_combinations"></a>72- 不同NPU架构中AIC和AIV支持的`pipe`取值存在差异,具体情况如下:<a id="supported_pipe_combinations"></a>
73 <!-- npu="950" id9 -->73 <!-- npu="950" id9 -->
@@ -128,7 +128,7 @@ constexpr int64_t FLAG_ID = 8;
128 128 
129/*129/*
130 * 本示例说明:130 * 本示例说明:
131- * - 采用__mix__(1, 2)标识核函数,同一AI Core内包含1个AIC和2个AIV。131+ * - 采用__mix__(1, 2)标识核函数(Kernel),同一AI Core内包含1个AIC和2个AIV。
132 * - AIV0和AIV1分别将矩阵从GM搬入UB,通过asc_get_sub_block_id区分不同的AIV。132 * - AIV0和AIV1分别将矩阵从GM搬入UB,通过asc_get_sub_block_id区分不同的AIV。
133 * - 两个AIV将矩阵从UB搬运至L1 Buffer(PIPE_MTE3)操作执行完后,才能执行asc_sync_block_arrive向调度模块发送通知。133 * - 两个AIV将矩阵从UB搬运至L1 Buffer(PIPE_MTE3)操作执行完后,才能执行asc_sync_block_arrive向调度模块发送通知。
134 * - AIC中从L1 Buffer搬运数据到L0A Buffer、L0B Buffer(PIPE_MTE1)的操作被asc_sync_block_wait阻塞,直到两个AIV均执行了asc_sync_block_arrive后才能执行。134 * - AIC中从L1 Buffer搬运数据到L0A Buffer、L0B Buffer(PIPE_MTE1)的操作被asc_sync_block_wait阻塞,直到两个AIV均执行了asc_sync_block_arrive后才能执行。
@@ -65,7 +65,7 @@ PIPE_S
65 65 
66## 约束说明66## 约束说明
67 67 
68-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_block_arrive`和`asc_sync_block_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。68+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_block_arrive`和`asc_sync_block_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。
69- 针对`asc_sync_block_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_block_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:69- 针对`asc_sync_block_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_block_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:
70 <!-- npu="950" id8 -->70 <!-- npu="950" id8 -->
71 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_block_wait`会阻塞由**`pipe`指定的流水**的后续指令。AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe_3510)所示。71 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_block_wait`会阻塞由**`pipe`指定的流水**的后续指令。AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe_3510)所示。
@@ -114,7 +114,7 @@ __global__ __vector__ void asc_sync_data_barrier_kernel(__gm__ int32_t* shared,
114 }114 }
115 const int32_t value = asc_load_dev(shared + 1);115 const int32_t value = asc_load_dev(shared + 1);
116 asc_store_dev(output, 2 * value);116 asc_store_dev(output, 2 * value);
117- // 等待结果写入GM后退出核函数。117+ // 等待结果写入GM后退出核函数(Kernel)
118 asc_sync_data_barrier(mem_dsb_t::DSB_DDR);118 asc_sync_data_barrier(mem_dsb_t::DSB_DDR);
119 }119 }
120}120}
@@ -67,7 +67,7 @@ PIPE_S
67 67 
68## 约束说明68## 约束说明
69 69 
70-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_inter_arrive`和`asc_sync_inter_wait`这对接口,支持的函数执行空间限定符为`__mix__(0, 1)`、`__mix__(1, 0)`、`__mix__(1, 1)`、`__mix__(1, 2)`。70+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_inter_arrive`和`asc_sync_inter_wait`这对接口,支持的函数执行空间限定符为`__mix__(0, 1)`、`__mix__(1, 0)`、`__mix__(1, 1)`、`__mix__(1, 2)`。
71- 针对`asc_sync_inter_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_inter_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_inter_wait](asc_sync_inter_wait.md#约束说明)的约束说明。71- 针对`asc_sync_inter_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_inter_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_inter_wait](asc_sync_inter_wait.md#约束说明)的约束说明。
72- 不同NPU架构中AIC和AIV支持的`pipe`取值存在差异,具体情况如下:<a id="supported_pipe_combinations"></a>72- 不同NPU架构中AIC和AIV支持的`pipe`取值存在差异,具体情况如下:<a id="supported_pipe_combinations"></a>
73 <!-- npu="950" id9 -->73 <!-- npu="950" id9 -->
@@ -128,7 +128,7 @@ constexpr int64_t FLAG_ID = 8;
128 128 
129/*129/*
130 * 本示例说明:130 * 本示例说明:
131- * - 采用__mix__(1, 2)标识核函数,核函数启动2个AI Core,共包含4个AIV。131+ * - 采用__mix__(1, 2)标识核函数(Kernel),核函数(Kernel)启动2个AI Core,共包含4个AIV。
132 * - 每个AIV将各自的数据从GM搬入UB。132 * - 每个AIV将各自的数据从GM搬入UB。
133 * - 每个AIV将一组数据从UB搬运至GM(PIPE_MTE3)操作执行完后,才能执行asc_sync_inter_arrive向调度模块发送通知。133 * - 每个AIV将一组数据从UB搬运至GM(PIPE_MTE3)操作执行完后,才能执行asc_sync_inter_arrive向调度模块发送通知。
134 * - 各AIV中从GM读取数据(PIPE_MTE2)的操作被asc_sync_inter_wait阻塞,直到所有AIV均执行了asc_sync_inter_arrive后才能执行。134 * - 各AIV中从GM读取数据(PIPE_MTE2)的操作被asc_sync_inter_wait阻塞,直到所有AIV均执行了asc_sync_inter_arrive后才能执行。
@@ -65,7 +65,7 @@ PIPE_S
65 65 
66## 约束说明66## 约束说明
67 67 
68-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_inter_arrive`和`asc_sync_inter_wait`这对接口,支持的函数执行空间限定符为`__mix__(0, 1)`、`__mix__(1, 0)`、`__mix__(1, 1)`、`__mix__(1, 2)`。68+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_inter_arrive`和`asc_sync_inter_wait`这对接口,支持的函数执行空间限定符为`__mix__(0, 1)`、`__mix__(1, 0)`、`__mix__(1, 1)`、`__mix__(1, 2)`。
69- 针对`asc_sync_inter_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_inter_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:69- 针对`asc_sync_inter_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_inter_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:
70 <!-- npu="950" id9 -->70 <!-- npu="950" id9 -->
71 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_inter_wait`会阻塞**指定流水**的后续指令。AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe_3510)所示。71 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_inter_wait`会阻塞**指定流水**的后续指令。AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe_3510)所示。
@@ -77,7 +77,7 @@ PIPE_S
77 77 
78## 约束说明78## 约束说明
79 79 
80-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_intra_arrive`和`asc_sync_intra_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 2)`。80+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_intra_arrive`和`asc_sync_intra_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 2)`。
81- 针对`asc_sync_intra_arrive`接口,传入的`pipe`参数**生效**,AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe)所示。<a id="supported_pipe_combinations"></a>81- 针对`asc_sync_intra_arrive`接口,传入的`pipe`参数**生效**,AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe)所示。<a id="supported_pipe_combinations"></a>
82 82 
83 **表2** AIC和AIV支持的`pipe`取值<a id="aic_aiv_supported_pipe"></a>83 **表2** AIC和AIV支持的`pipe`取值<a id="aic_aiv_supported_pipe"></a>
@@ -129,7 +129,7 @@ constexpr uint64_t SYNC_ID = 8;
129 129 
130/*130/*
131 * 本示例说明:131 * 本示例说明:
132- * - 采用__mix__(1, 2)标识核函数,核函数启动1个AI Core,共包含1个AIC和2个AIV。132+ * - 采用__mix__(1, 2)标识核函数(Kernel),核函数(Kernel)启动1个AI Core,共包含1个AIC和2个AIV。
133 * - AIV0将矩阵从GM搬入UB。133 * - AIV0将矩阵从GM搬入UB。
134 * - AIV0将矩阵从UB搬运至L1 Buffer(PIPE_MTE3)操作执行完后,才能执行asc_sync_intra_arrive向调度模块发送通知。134 * - AIV0将矩阵从UB搬运至L1 Buffer(PIPE_MTE3)操作执行完后,才能执行asc_sync_intra_arrive向调度模块发送通知。
135 * - AIC中从L1 Buffer搬运数据到L0A Buffer、L0B Buffer(PIPE_MTE1)的操作被asc_sync_intra_wait阻塞,直到AIV0执行了asc_sync_intra_arrive后才能执行。135 * - AIC中从L1 Buffer搬运数据到L0A Buffer、L0B Buffer(PIPE_MTE1)的操作被asc_sync_intra_wait阻塞,直到AIV0执行了asc_sync_intra_arrive后才能执行。
@@ -65,7 +65,7 @@ PIPE_S
65 65 
66## 约束说明66## 约束说明
67 67 
68-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_intra_arrive`和`asc_sync_intra_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 2)`。68+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_intra_arrive`和`asc_sync_intra_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 2)`。
69- 针对`asc_sync_intra_arrive`接口,传入的`pipe`参数**生效**,AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe)所示。<a id="supported_pipe_combinations"></a>69- 针对`asc_sync_intra_arrive`接口,传入的`pipe`参数**生效**,AIC和AIV支持的`pipe`取值如[表2](#aic_aiv_supported_pipe)所示。<a id="supported_pipe_combinations"></a>
70 70 
71 **表2** AIC和AIV支持的`pipe`取值<a id="aic_aiv_supported_pipe"></a>71 **表2** AIC和AIV支持的`pipe`取值<a id="aic_aiv_supported_pipe"></a>
@@ -63,7 +63,7 @@ PIPE_S
63 63 
64## 约束说明64## 约束说明
65 65 
66-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_subblock_arrive`和`asc_sync_subblock_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。66+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_subblock_arrive`和`asc_sync_subblock_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。
67- 针对`asc_sync_subblock_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_subblock_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_subblock_wait](asc_sync_subblock_wait.md#约束说明)的约束说明。67- 针对`asc_sync_subblock_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_subblock_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体请参考[asc_sync_subblock_wait](asc_sync_subblock_wait.md#约束说明)的约束说明。
68- 本接口仅支持AIV调用,AIV支持的`pipe`取值如下:`PIPE_MTE2``PIPE_MTE3``PIPE_V`68- 本接口仅支持AIV调用,AIV支持的`pipe`取值如下:`PIPE_MTE2``PIPE_MTE3``PIPE_V`
69- 用户需要确保配套使用(`flag_id`必须完全一致)`asc_sync_subblock_arrive``asc_sync_subblock_wait`,否则会出现未定义行为。69- 用户需要确保配套使用(`flag_id`必须完全一致)`asc_sync_subblock_arrive``asc_sync_subblock_wait`,否则会出现未定义行为。
@@ -103,7 +103,7 @@ constexpr int64_t FLAG_ID = 8;
103 103 
104/*104/*
105 * 本示例说明:105 * 本示例说明:
106- * - 采用__mix__(1, 2)标识核函数,同一AI Core内包含2个AIV。106+ * - 采用__mix__(1, 2)标识核函数(Kernel),同一AI Core内包含2个AIV。
107 * - 两个AIV分别将各自的数据从GM搬入UB。107 * - 两个AIV分别将各自的数据从GM搬入UB。
108 * - 两个AIV分别将一组数据从UB搬运至GM(PIPE_MTE3)操作执行完后,才能执行asc_sync_subblock_arrive向调度模块发送通知。108 * - 两个AIV分别将一组数据从UB搬运至GM(PIPE_MTE3)操作执行完后,才能执行asc_sync_subblock_arrive向调度模块发送通知。
109 * - 各AIV中从GM读取数据(PIPE_MTE2)的操作被asc_sync_subblock_wait阻塞,直到两个AIV均执行了asc_sync_subblock_arrive后才能执行。109 * - 各AIV中从GM读取数据(PIPE_MTE2)的操作被asc_sync_subblock_wait阻塞,直到两个AIV均执行了asc_sync_subblock_arrive后才能执行。
@@ -61,7 +61,7 @@ PIPE_S
61 61 
62## 约束说明62## 约束说明
63 63 
64-- 调用本接口的核函数不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_subblock_arrive`和`asc_sync_subblock_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。64+- 调用本接口的核函数(Kernel)不能使用`__cube__`或`__vector__`[函数执行空间限定符](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#函数执行空间限定符)。使用这两种函数执行空间限定符时,硬件不会开启调度模块,无法正常进行核间同步。对于`asc_sync_subblock_arrive`和`asc_sync_subblock_wait`这对接口,支持的函数执行空间限定符为`__mix__(1, 1)`、`__mix__(1, 2)`。
65- 针对`asc_sync_subblock_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_subblock_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:65- 针对`asc_sync_subblock_arrive`接口,传入的`pipe`参数在不同NPU架构中**均生效**;针对`asc_sync_subblock_wait`接口,传入的`pipe`参数**是否生效与NPU架构有关**,具体情况如下:
66 <!-- npu="950" id8 -->66 <!-- npu="950" id8 -->
67 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_subblock_wait`会阻塞**指定流水**的后续指令。67 - 针对[NPU架构版本3510](../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md),硬件支持配置核间同步模式和流水类型,输入参数`pipe`**生效**,此时`asc_sync_subblock_wait`会阻塞**指定流水**的后续指令。
@@ -16,7 +16,7 @@ AIC/AIV多核结构如下图2所示,AIC/AIV按group划分。一个group内包
16 16 
17**表1** group配置17**表1** group配置
18 18 
19-| 算子类型 | 函数执行空间限定符 | Kernel类型 | block/subblock | 1:N |19+| 算子类型 | 函数执行空间限定符 | 核函数(Kernel类型 | block/subblock | 1:N |
20| --- | --- | --- | --- | --- |20| --- | --- | --- | --- | --- |
21| Cube算子 | `__cube__` | `KERNEL_TYPE_AIC_ONLY` | AIC为block,无subblock | 不涉及 |21| Cube算子 | `__cube__` | `KERNEL_TYPE_AIC_ONLY` | AIC为block,无subblock | 不涉及 |
22| Vector算子 | `__vector__` | `KERNEL_TYPE_AIV_ONLY` | AIV为block,无subblock | 不涉及 |22| Vector算子 | `__vector__` | `KERNEL_TYPE_AIV_ONLY` | AIV为block,无subblock | 不涉及 |
@@ -15,7 +15,7 @@
15**图1** 同步控制模式示意图<a id="sync_control_mode_diagram"></a> 15**图1** 同步控制模式示意图<a id="sync_control_mode_diagram"></a>
16![](../../../figures/3510_sync_control_mode_diagram.png "同步控制模式示意图")16![](../../../figures/3510_sync_control_mode_diagram.png "同步控制模式示意图")
17 17 
18-下述同步特性均以如下场景配置为例:核函数使用`__mix__(1, 2)`修饰,即每个AI Core包含1个AIC和2个AIV,并设置逻辑核数`numBlocks=2`,即共启动2个AI Core,因此存在2个AIC和4个AIV。为便于描述,将2个AIC分别编号为AIC0、AIC1;AI Core0中的2个AIV分别编号为AIV0-0、AIV0-1,AI Core1中的2个AIV分别编号为AIV1-0、AIV1-1。**各核中与`flag_id`或`sync_id`对应的计数器初始值均为0。**18+下述同步特性均以如下场景配置为例:核函数(Kernel)使用`__mix__(1, 2)`修饰,即每个AI Core包含1个AIC和2个AIV,并设置逻辑核数`numBlocks=2`,即共启动2个AI Core,因此存在2个AIC和4个AIV。为便于描述,将2个AIC分别编号为AIC0、AIC1;AI Core0中的2个AIV分别编号为AIV0-0、AIV0-1,AI Core1中的2个AIV分别编号为AIV1-0、AIV1-1。**各核中与`flag_id`或`sync_id`对应的计数器初始值均为0。**
19 19 
20模式0、模式1和模式2在NPU架构版本2201和3510上均支持。以下各节的同步流程对两种架构均适用,架构差异仅体现在`wait`接口传入的`pipe`参数是否生效以及阻塞的流水范围上,具体以各节的说明为准。20模式0、模式1和模式2在NPU架构版本2201和3510上均支持。以下各节的同步流程对两种架构均适用,架构差异仅体现在`wait`接口传入的`pipe`参数是否生效以及阻塞的流水范围上,具体以各节的说明为准。
21 21 
@@ -43,7 +43,7 @@
43以图2为例,演示2个AI Core中的2个AIC(AIC0、AIC1)进行全核同步,代码片段如下:43以图2为例,演示2个AI Core中的2个AIC(AIC0、AIC1)进行全核同步,代码片段如下:
44 44 
45```cpp45```cpp
46-// 进行核间同步时,即使只有AIC参与同步也不能用__cube__修饰核函数,具体原因请参考asc_sync_inter_arrive的约束说明。46+// 进行核间同步时,即使只有AIC参与同步也不能用__cube__修饰核函数(Kernel),具体原因请参考asc_sync_inter_arrive的约束说明。
47if ASC_IS_AIC {47if ASC_IS_AIC {
48 // 每个核都应该有类似如下的成对调用asc_sync_inter_arrive和asc_sync_inter_wait。48 // 每个核都应该有类似如下的成对调用asc_sync_inter_arrive和asc_sync_inter_wait。
49 // 两个接口的flag_id必须一致;两个接口都必须显式传入pipe,asc_sync_inter_wait会阻塞pipe参数指定的流水。49 // 两个接口的flag_id必须一致;两个接口都必须显式传入pipe,asc_sync_inter_wait会阻塞pipe参数指定的流水。
@@ -77,7 +77,7 @@ AIC1的`asc_sync_inter_arrive`执行完后,此时调度模块感知到2个AIC
77以图3为例,演示第0个AI Core中的2个AIV(AIV0-0、AIV0-1)进行全核同步,代码片段如下:77以图3为例,演示第0个AI Core中的2个AIV(AIV0-0、AIV0-1)进行全核同步,代码片段如下:
78 78 
79```cpp79```cpp
80-// 进行核间同步时,即使只有AIV参与同步也不能用__vector__修饰核函数,具体原因请参考asc_sync_subblock_arrive的约束说明。80+// 进行核间同步时,即使只有AIV参与同步也不能用__vector__修饰核函数(Kernel),具体原因请参考asc_sync_subblock_arrive的约束说明。
81if ASC_IS_AIV {81if ASC_IS_AIV {
82 if (block_idx == 0) {82 if (block_idx == 0) {
83 // 参与同步的2个AIV属于第0个AI Core。83 // 参与同步的2个AIV属于第0个AI Core。
@@ -17,7 +17,7 @@ AI Core的同步,总共分成2类:[核内同步](intra_core_sync_overview.md
17| [asc_sync_mte3](asc_sync_mte3.md) | 核内同步易用性接口:针对`PIPE_MTE3`执行同步操作,保证`PIPE_MTE3`中前序指令全部完成后,其他流水的后续指令才能开始执行。只能在AIV中调用。 |17| [asc_sync_mte3](asc_sync_mte3.md) | 核内同步易用性接口:针对`PIPE_MTE3`执行同步操作,保证`PIPE_MTE3`中前序指令全部完成后,其他流水的后续指令才能开始执行。只能在AIV中调用。 |
18| [asc_sync](asc_sync.md) | 全部流水同步:同一核内所有流水之间的同步指令,功能与`asc_sync_pipe(PIPE_ALL)`等价。阻塞调用点后所有硬件流水的后序指令,直到调用点之前所有硬件流水的前序指令全部完成。 |18| [asc_sync](asc_sync.md) | 全部流水同步:同一核内所有流水之间的同步指令,功能与`asc_sync_pipe(PIPE_ALL)`等价。阻塞调用点后所有硬件流水的后序指令,直到调用点之前所有硬件流水的前序指令全部完成。 |
19 19 
20-图1展示了四种同步控制模式,各模式的功能描述如下。该图基于核函数使用`__mix__(1, 2)`修饰、逻辑核数`numBlocks=4`的场景配置。20+图1展示了四种同步控制模式,各模式的功能描述如下。该图基于核函数(Kernel)使用`__mix__(1, 2)`修饰、逻辑核数`numBlocks=4`的场景配置。
21 21 
22- 模式0:AI Core核间的同步控制。对于AIC全核场景,同步所有的AIC核,直到所有的AIC核都执行到`asc_sync_inter_arrive`时,`asc_sync_inter_wait`后续的指令才会执行;对于AIV全核场景,同步所有的AIV核,直到所有的AIV核都执行到`asc_sync_inter_arrive`时,`asc_sync_inter_wait`后续的指令才会执行。22- 模式0:AI Core核间的同步控制。对于AIC全核场景,同步所有的AIC核,直到所有的AIC核都执行到`asc_sync_inter_arrive`时,`asc_sync_inter_wait`后续的指令才会执行;对于AIV全核场景,同步所有的AIV核,直到所有的AIV核都执行到`asc_sync_inter_arrive`时,`asc_sync_inter_wait`后续的指令才会执行。
23- 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了`asc_sync_subblock_arrive``asc_sync_subblock_wait`后续的指令才会执行。23- 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了`asc_sync_subblock_arrive``asc_sync_subblock_wait`后续的指令才会执行。
@@ -69,7 +69,7 @@ PIPE_S
69 69 
70## 调用示例70## 调用示例
71 71 
72-本示例模拟算子部署诊断场景:Kernel读取架构版本并写入GM,Host侧检查返回值是否属于当前接口支持的架构。返回值可用于确认编译产物的目标架构。72+本示例模拟算子部署诊断场景:核函数(Kernel读取架构版本并写入GM,Host侧检查返回值是否属于当前接口支持的架构。返回值可用于确认编译产物的目标架构。
73 73 
74将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。74将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。
75 75 
@@ -95,7 +95,7 @@ constexpr uint32_t BYTES = ELEMENTS * sizeof(uint32_t);
95 95 
96/*96/*
97 * 本示例说明:97 * 本示例说明:
98- * - Kernel调用asc_get_arch_ver获取当前架构版本号。98+ * - 核函数(Kernel调用asc_get_arch_ver获取当前架构版本号。
99 * - 通过Scalar将版本号写入GM,并刷新对应的Cache Line。99 * - 通过Scalar将版本号写入GM,并刷新对应的Cache Line。
100 * - Host侧读取并检查版本号,辅助确认算子二进制的目标架构。100 * - Host侧读取并检查版本号,辅助确认算子二进制的目标架构。
101 */101 */
@@ -54,7 +54,7 @@ PIPE_S
54 54 
55## 调用示例55## 调用示例
56 56 
57-本示例模拟核间同步初始化检查场景:Host侧通过`aclrtGetHardwareSyncAddr`获取硬件同步地址,Kernel将该地址转换为`uint64_t`类型并调用`asc_set_ffts_base_addr`完成设置,再通过`asc_get_ffts_base_addr`回读。Host侧检查设置值与回读值是否一致。完成该配置后,才能使用[asc_sync_block_arrive](../../sync/asc_sync_block_arrive.md)和[asc_sync_block_wait](../../sync/asc_sync_block_wait.md)进行核间同步。57+本示例模拟核间同步初始化检查场景:Host侧通过`aclrtGetHardwareSyncAddr`获取硬件同步地址,核函数(Kernel将该地址转换为`uint64_t`类型并调用`asc_set_ffts_base_addr`完成设置,再通过`asc_get_ffts_base_addr`回读。Host侧检查设置值与回读值是否一致。完成该配置后,才能使用[asc_sync_block_arrive](../../sync/asc_sync_block_arrive.md)和[asc_sync_block_wait](../../sync/asc_sync_block_wait.md)进行核间同步。
58 58 
59将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。59将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。
60 60 
@@ -83,8 +83,8 @@ constexpr uint64_t UNSET_VALUE = ~0ULL;
83/*83/*
84 * 本示例说明:84 * 本示例说明:
85 * - ffts_addr由Host侧调用aclrtGetHardwareSyncAddr获得。85 * - ffts_addr由Host侧调用aclrtGetHardwareSyncAddr获得。
86- * - Kernel将ffts_addr转换为uint64_t类型并设置核间同步寄存器基地址。86+ * - 核函数(Kernel将ffts_addr转换为uint64_t类型并设置核间同步寄存器基地址。
87- * - Kernel回读基地址,Host侧检查设置值与回读值是否一致。87+ * - 核函数(Kernel回读基地址,Host侧检查设置值与回读值是否一致。
88 */88 */
89__global__ __vector__ void asc_get_ffts_base_addr_kernel(89__global__ __vector__ void asc_get_ffts_base_addr_kernel(
90 __gm__ uint64_t* output, __gm__ uint64_t* ffts_addr)90 __gm__ uint64_t* output, __gm__ uint64_t* ffts_addr)
@@ -58,7 +58,7 @@ PIPE_S
58 58 
59## 调用示例59## 调用示例
60 60 
61-本示例模拟Kernel手工规划Unified Buffer的场景:通过0字节、32字节和64字节三个偏移分别获取两个源操作数和一个目的操作数的物理地址,在Unified Buffer中完成加法后将结果写入GM。该方法适用于需要自行管理片上内存布局的底层实现;不能与[以数组方式申请内存的方法](../../general_description_and_constraints.md#以数组方式申请内存)混用。61+本示例模拟核函数(Kernel手工规划Unified Buffer(UB)的场景:通过0字节、32字节和64字节三个偏移分别获取两个源操作数和一个目的操作数的物理地址,在UB中完成加法后将结果写入GM。该方法适用于需要自行管理片上内存布局的底层实现;不能与[以数组方式申请内存的方法](../../general_description_and_constraints.md#以数组方式申请内存)混用。
62 62 
63将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。63将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。
64 64 
@@ -86,7 +86,7 @@ constexpr uint32_t BYTES = ELEMENTS * sizeof(uint32_t);
86 * 本示例说明:86 * 本示例说明:
87 * - 每段Unified Buffer空间按32字节对齐,避免不同操作数重叠。87 * - 每段Unified Buffer空间按32字节对齐,避免不同操作数重叠。
88 * - asc_get_phy_buf_addr根据偏移返回片上物理地址。88 * - asc_get_phy_buf_addr根据偏移返回片上物理地址。
89- * - Kernel在手工分配的Unified Buffer空间中完成10+32,并将结果写入GM。89+ * - 核函数(Kernel在手工分配的Unified Buffer空间中完成10+32,并将结果写入GM。
90 */90 */
91__global__ __vector__ void asc_get_phy_buf_addr_kernel(__gm__ uint32_t* output)91__global__ __vector__ void asc_get_phy_buf_addr_kernel(__gm__ uint32_t* output)
92{92{
@@ -65,7 +65,7 @@ PIPE_S
65 65 
66## 调用示例66## 调用示例
67 67 
68-本示例模拟运行环境兼容性诊断场景:Kernel读取SMMU标签版本并写入GM,Host侧按照返回值说明解析年、月、日和同日子版本字段。部分设备可能返回0,示例仅检查Kernel是否完成写回,不把非零值作为成功条件。68+本示例模拟运行环境兼容性诊断场景:核函数(Kernel读取SMMU标签版本并写入GM,Host侧按照返回值说明解析年、月、日和同日子版本字段。部分设备可能返回0,示例仅检查核函数(Kernel是否完成写回,不把非零值作为成功条件。
69 69 
70将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。70将代码保存为`example.asc`后,可通过`bisheng`命令编译运行,其中`--npu-arch`参数需根据实际产品型号指定对应的NPU架构,具体产品与NPU架构的映射关系请参考[\_\_NPU\_ARCH\_\_](../../../../../guide/programming_guide/language_extension/simd_builtin_keywords.md#npu-arch)。
71 71 
@@ -93,7 +93,7 @@ constexpr uint64_t UNSET_VALUE = ~0ULL;
93 93 
94/*94/*
95 * 本示例说明:95 * 本示例说明:
96- * - Kernel调用asc_get_smmu_tag_version读取SMMU标签版本。96+ * - 核函数(Kernel调用asc_get_smmu_tag_version读取SMMU标签版本。
97 * - 原始版本值写入GM并刷新对应的Cache Line。97 * - 原始版本值写入GM并刷新对应的Cache Line。
98 * - Host侧按照接口定义解析各版本字段,便于记录运行环境信息。98 * - Host侧按照接口定义解析各版本字段,便于记录运行环境信息。
99 */99 */
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/utils/sys_var.h"`29头文件路径为:`"c_api/utils/sys_var.h"`
30 30 
31-在[分离模式](../../../../../guide/programming_guide/advanced_programming/hardware_implementation/basic_architecture.md)下读取当前AI Core上Cube Core(AIC)或Vector Core(AIV)的数量。该值在kernel启动前配置,运行中不可修改。31+在[分离模式](../../../../../guide/programming_guide/advanced_programming/hardware_implementation/basic_architecture.md)下读取当前AI Core上Cube Core(AIC)或Vector Core(AIV)的数量。该值在核函数(Kernel)启动前配置,运行中不可修改。
32 32 
33## 函数原型33## 函数原型
34 34 
@@ -58,7 +58,7 @@ PIPE_S
58 58 
59## 约束说明59## 约束说明
60 60 
61-- 本接口读取的subblock维度保存在只读特殊寄存器中,由系统控制器(System Controller,SC)在kernel启动前配置,kernel运行期间不可修改,连续两次调用返回值相同。61+- 本接口读取的subblock维度保存在只读特殊寄存器中,由系统控制器(System Controller,SC)在核函数(Kernel)启动前配置,核函数(Kernel)运行期间不可修改,连续两次调用返回值相同。
62- 返回值反映当前AI Core的subblock数量,仅在[分离模式](../../../../../guide/programming_guide/advanced_programming/hardware_implementation/basic_architecture.md)下有意义。非分离模式下返回值的语义以SC配置为准。62- 返回值反映当前AI Core的subblock数量,仅在[分离模式](../../../../../guide/programming_guide/advanced_programming/hardware_implementation/basic_architecture.md)下有意义。非分离模式下返回值的语义以SC配置为准。
63 63 
64## 调用示例64## 调用示例
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/utils/sys_var.h"`29头文件路径为:`"c_api/utils/sys_var.h"`
30 30 
31-读取系统虚拟基地址特殊寄存器的值并按`int64_t`返回,该寄存器为只读特殊寄存器,存储当前核上下文的系统虚拟基地址,由系统在kernel启动前按核配置完成。系统虚拟基地址用于在kernel内将相对偏移量转换为系统虚拟地址,常用于地址推导、跨核地址对齐等需要系统虚拟基地址参与的场景。31+读取系统虚拟基地址特殊寄存器的值并按`int64_t`返回,该寄存器为只读特殊寄存器,存储当前核上下文的系统虚拟基地址,由系统在核函数(Kernel)启动前按核配置完成。系统虚拟基地址用于在核函数(Kernel)内将相对偏移量转换为系统虚拟地址,常用于地址推导、跨核地址对齐等需要系统虚拟基地址参与的场景。
32 32 
33## 函数原型33## 函数原型
34 34 
@@ -63,7 +63,7 @@ PIPE_S
63## 约束说明63## 约束说明
64 64 
65- 本接口为只读查询接口,读取的是系统时钟计数器并按芯片频率换算,不修改任何寄存器或存储状态,可在AIC与AIV上下文中调用。65- 本接口为只读查询接口,读取的是系统时钟计数器并按芯片频率换算,不修改任何寄存器或存储状态,可在AIC与AIV上下文中调用。
66-- 返回值随系统时钟持续递增,同一kernel内多次调用返回值单调不减。66+- 返回值随系统时钟持续递增,同一核函数(Kernel)内多次调用返回值单调不减。
67- 本接口与`asc_get_system_cycle`读取的是同一个底层计数器,区别仅在于本接口在内部完成了频率换算,返回值为微秒,而`asc_get_system_cycle`返回原始cycle值。67- 本接口与`asc_get_system_cycle`读取的是同一个底层计数器,区别仅在于本接口在内部完成了频率换算,返回值为微秒,而`asc_get_system_cycle`返回原始cycle值。
68 68 
69## 调用示例69## 调用示例
@@ -51,7 +51,7 @@ PIPE_S
51## 约束说明51## 约束说明
52 52 
53- 本接口不触发硬件指令,不依赖任何特殊寄存器或前置setter接口配置,可在AIC与AIV上下文中调用。53- 本接口不触发硬件指令,不依赖任何特殊寄存器或前置setter接口配置,可在AIC与AIV上下文中调用。
54-- 返回值反映当前芯片的矢量寄存器位宽,同一kernel内多次调用返回值相同。54+- 返回值反映当前芯片的矢量寄存器位宽,同一核函数(Kernel)内多次调用返回值相同。
55- 本接口不支持纯SIMT编译模式,在该模式下包含对应头文件会触发编译错误。55- 本接口不支持纯SIMT编译模式,在该模式下包含对应头文件会触发编译错误。
56 56 
57## 调用示例57## 调用示例
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`
30 30 
31-提供数据非对齐搬运的功能,将数据从Unified Buffer (UB)搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。31+提供数据非对齐搬运的功能,将数据从Unified BufferUB搬运到Global Memory (GM),并支持8位/16位/32位数据类型搬运。
32 32 
33本接口支持以下两种数据搬运方式,均不支持设置填充值:33本接口支持以下两种数据搬运方式,均不支持设置填充值:
34 34 
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`
30 30 
31-提供数据搬运功能,将数据从Unified Buffer (UB)搬运到L1 Buffer。31+提供数据搬运功能,将数据从Unified BufferUB搬运到L1 Buffer。
32 32 
33本接口支持以下两种数据搬运方式:33本接口支持以下两种数据搬运方式:
34 34 
@@ -28,7 +28,7 @@
28 28 
29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`29头文件路径为:`"c_api/vector_datamove/vector_datamove.h"`
30 30 
31-将数据从Unified Buffer(UB)搬运到Unified Buffer(UB31+将数据从Unified Buffer(UB)搬运到UB。
32 32 
33本接口支持连续数据搬运和高维切分数据搬运。连续数据搬运按`size`指定的字节数在UB内连续搬运,如图1所示;高维切分数据搬运按`n_burst`指定搬运的数据块个数,每个数据块按`len_burst`指定的DataBlock个数搬运,并通过`src_gap``dst_gap`指定源操作数和目的操作数相邻数据块之间的间隔,如图2所示。33本接口支持连续数据搬运和高维切分数据搬运。连续数据搬运按`size`指定的字节数在UB内连续搬运,如图1所示;高维切分数据搬运按`n_burst`指定搬运的数据块个数,每个数据块按`len_burst`指定的DataBlock个数搬运,并通过`src_gap``dst_gap`指定源操作数和目的操作数相邻数据块之间的间隔,如图2所示。
34 34 
@@ -15,7 +15,7 @@
15> - 基础API:不涉及15> - 基础API:不涉及
16> - 高阶API:因高阶 API 配套 Host Tiling 接口,需要链接 `libtiling_api.a`。16> - 高阶API:因高阶 API 配套 Host Tiling 接口,需要链接 `libtiling_api.a`。
17 17 
18-为方便开发者使用,Ascend C基础API和高阶API均支持通过包含kernel\_operator.h文件来调用相应接口。如无特殊说明,包含该头文件即可满足接口调用需求。若API文档中有特殊说明,则应遵循API的具体说明。18+为方便开发者使用,Ascend C基础API和高阶API均支持通过包含核函数(Kernel)\_operator.h文件来调用相应接口。如无特殊说明,包含该头文件即可满足接口调用需求。若API文档中有特殊说明,则应遵循API的具体说明。
19 19 
20```20```
21#include "kernel_operator.h"21#include "kernel_operator.h"
@@ -28,13 +28,13 @@
28 28 
29头文件路径为:`tensor_api/tensor.h`29头文件路径为:`tensor_api/tensor.h`
30 30 
31-本接口将源张量的数据从L1 Buffer搬运到Unified Buffer。接口根据源张量和目的张量的Layout选择对应搬运实现。31+本接口将源张量的数据从L1 Buffer搬运到Unified Buffer(UB)。接口根据源张量和目的张量的Layout选择对应搬运实现。
32 32 
33接口支持完整Tensor搬运,也支持通过`dst_coord``src_coord``copy_shape`指定目的Tensor中的起始坐标、源Tensor中的起始坐标和搬运区域的形状,执行区域搬运。33接口支持完整Tensor搬运,也支持通过`dst_coord``src_coord``copy_shape`指定目的Tensor中的起始坐标、源Tensor中的起始坐标和搬运区域的形状,执行区域搬运。
34 34 
35## 函数原型35## 函数原型
36 36 
37-- 执行L1 Buffer到Unified Buffer搬运。37+- 执行L1 Buffer到UB搬运。
38 38 
39 ```cpp39 ```cpp
40 template <typename Atom, typename DstTensor, typename SrcTensor>40 template <typename Atom, typename DstTensor, typename SrcTensor>
@@ -42,14 +42,14 @@
42 const DstTensor& dst, const SrcTensor& src)42 const DstTensor& dst, const SrcTensor& src)
43 ```43 ```
44 44 
45-- 根据源张量和目的张量的存储位置自动推导搬运通路,使用默认trait执行L1 Buffer到Unified Buffer搬运。45+- 根据源张量和目的张量的存储位置自动推导搬运通路,使用默认trait执行L1 Buffer到UB搬运。
46 46 
47 ```cpp47 ```cpp
48 template <typename DstTensor, typename SrcTensor>48 template <typename DstTensor, typename SrcTensor>
49 __aicore__ inline void copy(const DstTensor& dst, const SrcTensor& src)49 __aicore__ inline void copy(const DstTensor& dst, const SrcTensor& src)
50 ```50 ```
51 51 
52-- 按指定源坐标、目的坐标和搬运形状执行L1 Buffer到Unified Buffer搬运。52+- 按指定源坐标、目的坐标和搬运形状执行L1 Buffer到UB搬运。
53 53 
54 ```cpp54 ```cpp
55 template <typename Atom, typename DstTensor, typename SrcTensor, typename DstCoord,55 template <typename Atom, typename DstTensor, typename SrcTensor, typename DstCoord,
@@ -59,7 +59,7 @@
59 const CopyShape& copy_shape)59 const CopyShape& copy_shape)
60 ```60 ```
61 61 
62-- 根据源张量和目的张量的存储位置自动推导搬运通路,使用默认trait按指定源坐标、目的坐标和搬运形状执行L1 Buffer到Unified Buffer搬运。62+- 根据源张量和目的张量的存储位置自动推导搬运通路,使用默认trait按指定源坐标、目的坐标和搬运形状执行L1 Buffer到UB搬运。
63 63 
64 ```cpp64 ```cpp
65 template <typename DstTensor, typename SrcTensor, typename DstCoord,65 template <typename DstTensor, typename SrcTensor, typename DstCoord,
@@ -114,12 +114,12 @@
114 114 
115| 参数名 | 输入/输出 | 描述 |115| 参数名 | 输入/输出 | 描述 |
116| :--- | :---: | :--- |116| :--- | :---: | :--- |
117-| operation | 输入 | 搬运操作对象。L1 Buffer到Unified Buffer搬运取`copy_l1_to_ub{}`。 |117+| operation | 输入 | 搬运操作对象。L1 Buffer到UB搬运取`copy_l1_to_ub{}`。 |
118-| trait | 输入 | 搬运trait对象。L1 Buffer到Unified Buffer默认取`l1_to_ub_trait_default{}`。 |118+| trait | 输入 | 搬运trait对象。L1 Buffer到UB默认取`l1_to_ub_trait_default{}`。 |
119 119 
120### copy_l1_to_ub说明120### copy_l1_to_ub说明
121 121 
122-`copy_l1_to_ub`用于标识L1 Buffer到Unified Buffer数据搬运通路,仅列出其public内容:122+`copy_l1_to_ub`用于标识L1 Buffer到UB数据搬运通路,仅列出其public内容:
123 123 
124```cpp124```cpp
125struct copy_l1_to_ub {125struct copy_l1_to_ub {
@@ -128,7 +128,7 @@ struct copy_l1_to_ub {
128};128};
129```129```
130 130 
131-`copy`静态成员函数用于接收Trait和搬运参数,并分发L1 Buffer到Unified Buffer数据搬运。131+`copy`静态成员函数用于接收Trait和搬运参数,并分发L1 Buffer到UB数据搬运。
132 132 
133### l1_to_ub_trait说明133### l1_to_ub_trait说明
134 134 
@@ -154,6 +154,6 @@ struct l1_to_ub_trait_default {
154 154 
155## 约束说明155## 约束说明
156 156 
157-- `dst`必须位于Unified Buffer,`src`必须位于L1 Buffer。157+- `dst`必须位于UB,`src`必须位于L1 Buffer。
158- 源张量和目的张量的Layout组合需要属于该通路支持的数据排布。158- 源张量和目的张量的Layout组合需要属于该通路支持的数据排布。
159- 使用坐标搬运时,coord和copy_shape需要与对应张量的形状结构匹配,且搬运范围不能越界。159- 使用坐标搬运时,coord和copy_shape需要与对应张量的形状结构匹配,且搬运范围不能越界。
@@ -167,7 +167,7 @@ L0C Buffer到UB搬运支持不量化输出、`float`到`half`或`bfloat16_t`的
167 167 
168### copy_l0c_to_ub说明168### copy_l0c_to_ub说明
169 169 
170-`copy_l0c_to_ub`用于标识L0C Buffer到Unified Buffer数据搬运通路,仅列出其public内容:170+`copy_l0c_to_ub`用于标识L0C Buffer到UB数据搬运通路,仅列出其public内容:
171 171 
172```cpp172```cpp
173struct copy_l0c_to_ub {173struct copy_l0c_to_ub {
@@ -176,7 +176,7 @@ struct copy_l0c_to_ub {
176};176};
177```177```
178 178 
179-`copy`静态成员函数用于接收Trait和搬运参数,并分发L0C Buffer到Unified Buffer数据搬运。179+`copy`静态成员函数用于接收Trait和搬运参数,并分发L0C Buffer到UB数据搬运。
180 180 
181### l0c_to_ub_trait说明181### l0c_to_ub_trait说明
182 182 
@@ -63,7 +63,7 @@ __simd_callee__ inline reg_pair<bool> deinterleave(
63 63 
64- `src0``src1`可以是同一个`reg_tensor<bool>`对象。64- `src0``src1`可以是同一个`reg_tensor<bool>`对象。
65- 本接口应在Vector Function(`__simd_vf__`标记的函数)内调用。65- 本接口应在Vector Function(`__simd_vf__`标记的函数)内调用。
66-- Mask寄存器数量上限为8。超出限制上限的寄存器数据会写入预留的8K UB内存中,可能引起性能劣化。66+- Mask寄存器数量上限为8。超出限制上限的寄存器数据会写入预留的8K Unified Buffer(UB内存中,可能引起性能劣化。
67 67 
68## 调用示例68## 调用示例
69 69 
@@ -130,7 +130,7 @@ constexpr cast_options default_cast_ops = {
130- 位宽比为4时,可选择`zero``one``two``three`,对应每组中的第0至第3个位置。130- 位宽比为4时,可选择`zero``one``two``three`,对应每组中的第0至第3个位置。
131- 源、目的类型位宽相同时,使用`zero`131- 源、目的类型位宽相同时,使用`zero`
132 132 
133-`cast`只完成寄存器计算,不会隐式调整UB中的数据排布。连续处理Tensor数据时,应使`local_tensor::load`、`cast_options::layout`和`local_tensor::store`的排布保持一致。常见用法如下:133+`cast`只完成寄存器计算,不会隐式调整Unified Buffer(UB中的数据排布。连续处理Tensor数据时,应使`local_tensor::load`、`cast_options::layout`和`local_tensor::store`的排布保持一致。常见用法如下:
134 134 
135| 转换方向 | 搬入 | 搬出 |135| 转换方向 | 搬入 | 搬出 |
136| --- | --- | --- |136| --- | --- | --- |
@@ -97,7 +97,7 @@ __simd_callee__ inline reg_tensor<T> trunc(reg_tensor<T> src)
97 97 
98## 调用示例98## 调用示例
99 99 
100-以下示例对UB中的一段浮点数据执行向0取整。[update_mask](../mask_reg_compute/update_mask.md)`<T>(remain)`根据剩余待处理元素数生成当前循环的mask,并通过引用参数自动更新`remain`,因此完整寄存器块和尾块可以使用同一计算流程。100+以下示例对Unified Buffer(UB中的一段浮点数据执行向0取整。[update_mask](../mask_reg_compute/update_mask.md)`<T>(remain)`根据剩余待处理元素数生成当前循环的mask,并通过引用参数自动更新`remain`,因此完整寄存器块和尾块可以使用同一计算流程。
101 101 
102```cpp102```cpp
103template <typename SrcTensor, typename DstTensor>103template <typename SrcTensor, typename DstTensor>
@@ -72,7 +72,7 @@ make_mem_ptr提供三种调用形式:
72| location::l0scalea | L0 ScaleA Buffer | MX矩阵计算ScaleA缓存 |72| location::l0scalea | L0 ScaleA Buffer | MX矩阵计算ScaleA缓存 |
73| location::l0scaleb | L0 ScaleB Buffer | MX矩阵计算ScaleB缓存 |73| location::l0scaleb | L0 ScaleB Buffer | MX矩阵计算ScaleB缓存 |
74| location::l0c | L0C Buffer | 矩阵计算结果缓存 |74| location::l0c | L0C Buffer | 矩阵计算结果缓存 |
75-| location::ub | UB | 统一缓存,矢量计算的数据存储区 |75+| location::ub | Unified Buffer(UB | 统一缓存,矢量计算的数据存储区 |
76| location::bias | BiasTable Buffer | 偏置表缓存,带偏置矩阵计算的偏置存放区 |76| location::bias | BiasTable Buffer | 偏置表缓存,带偏置矩阵计算的偏置存放区 |
77| location::fixbuf | Fixpipe Buffer | Fixpipe输出缓存,L0C到GM/UB的中转区 |77| location::fixbuf | Fixpipe Buffer | Fixpipe输出缓存,L0C到GM/UB的中转区 |
78 78 
@@ -2,7 +2,7 @@
2 2 
3Tensor API是一套面向Ascend C算子开发的基础编程接口,使用Tensor和Layout统一描述数据的存储位置、数据类型、尺寸大小和排列规则,并基于这些信息完成数据搬运、矩阵计算和矢量计算,减少开发者手工组织硬件指令参数和数据排布的工作量。3Tensor API是一套面向Ascend C算子开发的基础编程接口,使用Tensor和Layout统一描述数据的存储位置、数据类型、尺寸大小和排列规则,并基于这些信息完成数据搬运、矩阵计算和矢量计算,减少开发者手工组织硬件指令参数和数据排布的工作量。
4 4 
5-Tensor API提供基于Tensor的数据搬运、矩阵计算和矢量计算能力。开发者可以在同一个核函数中组合使用Tensor API和C API,以实现完整的算子功能。5+Tensor API提供基于Tensor的数据搬运、矩阵计算和矢量计算能力。开发者可以在同一个核函数(Kernel)中组合使用Tensor API和C API,以实现完整的算子功能。
6 6 
7## 接口分层7## 接口分层
8 8 
@@ -26,7 +26,7 @@ Tensor API提供基于Tensor的数据搬运、矩阵计算和矢量计算能力
26- [Layout](layout/layout_structure.md):介绍Layout、Shape、Stride和Coord的构造、数据排布描述及相关属性查询能力。26- [Layout](layout/layout_structure.md):介绍Layout、Shape、Stride和Coord的构造、数据排布描述及相关属性查询能力。
27- [Tensor](tensor/tensor_structure.md):介绍Tensor和Pointer的创建、访问与切片能力。27- [Tensor](tensor/tensor_structure.md):介绍Tensor和Pointer的创建、访问与切片能力。
28- [Algorithm](algorithm.md):介绍数据搬运和矩阵计算中Operation、Trait与Atom的作用、组合关系及使用方式。28- [Algorithm](algorithm.md):介绍数据搬运和矩阵计算中Operation、Trait与Atom的作用、组合关系及使用方式。
29-- [数据搬运](data_move/data_move.md):介绍多种数据搬运通路,包括Global Memory与Unified Buffer之间的双向搬运,Global Memory到L1 Buffer的搬运等。29+- [数据搬运](data_move/data_move.md):介绍多种数据搬运通路,包括Global Memory与Unified Buffer(UB)之间的双向搬运,Global Memory到L1 Buffer的搬运等。
30- [矩阵计算](matrix_compute/matrix_compute.md):介绍矩阵数据搬入、矩阵乘加、矩阵结果搬出和相关关键特性。30- [矩阵计算](matrix_compute/matrix_compute.md):介绍矩阵数据搬入、矩阵乘加、矩阵结果搬出和相关关键特性。
31- [reg矢量计算](reg_vector_compute/reg_vector_compute.md):介绍矢量计算的搬入、矢量计算的搬出、寄存器数据搬入搬出、Mask寄存器计算和类型转换。31- [reg矢量计算](reg_vector_compute/reg_vector_compute.md):介绍矢量计算的搬入、矢量计算的搬出、寄存器数据搬入搬出、Mask寄存器计算和类型转换。
32- [工具接口](utils/tool_functions.md):介绍编译期整数、维度保留标记和Layout Pattern查询接口,以及Layout、Tensor、Coord、Shape和量化参数的类型判断等工具接口的使用方式。32- [工具接口](utils/tool_functions.md):介绍编译期整数、维度保留标记和Layout Pattern查询接口,以及Layout、Tensor、Coord、Shape和量化参数的类型判断等工具接口的使用方式。
@@ -34,7 +34,7 @@ Tensor API提供基于Tensor的数据搬运、矩阵计算和矢量计算能力
34 34 
35## 与C API配合使用35## 与C API配合使用
36 36 
37-Tensor API提供基于Tensor和Layout的数据组织、数据搬运、矩阵计算和矢量计算能力,适合构建算子的主要数据处理流程。缓存控制、同步控制、系统变量、原子操作和初始化等底层控制能力由C API提供。开发者可以在同一个核函数中组合使用Tensor API和C API,以实现完整的算子功能。37+Tensor API提供基于Tensor和Layout的数据组织、数据搬运、矩阵计算和矢量计算能力,适合构建算子的主要数据处理流程。缓存控制、同步控制、系统变量、原子操作和初始化等底层控制能力由C API提供。开发者可以在同一个核函数(Kernel)中组合使用Tensor API和C API,以实现完整的算子功能。
38 38 
39Tensor API和C API的接口支持范围及参数约束相互独立,混合使用时需要同时满足两类接口的要求。39Tensor API和C API的接口支持范围及参数约束相互独立,混合使用时需要同时满足两类接口的要求。
40 40 
@@ -54,11 +54,11 @@
54 54 
55| 数据通路或接口名 | 功能描述 |55| 数据通路或接口名 | 功能描述 |
56| --- | --- |56| --- | --- |
57-| [Global Memory到Unified Buffer](reg_vector_compute/vector_compute_load/copy_gm_to_ub.md) | 使用`copy`将Global Memory中的数据搬运到Unified Buffer,支持坐标区域搬运。 |57+| [Global Memory到Unified Buffer](reg_vector_compute/vector_compute_load/copy_gm_to_ub.md) | 使用`copy`将Global Memory中的数据搬运到Unified Buffer(UB),支持坐标区域搬运。 |
58-| [Unified Buffer到Global Memory](reg_vector_compute/vector_compute_store/copy_ub_to_gm.md) | 使用`copy`将Unified Buffer中的数据搬运到Global Memory,支持坐标区域搬运。 |58+| [Unified Buffer到Global Memory](reg_vector_compute/vector_compute_store/copy_ub_to_gm.md) | 使用`copy`将UB中的数据搬运到Global Memory,支持坐标区域搬运。 |
59| [Global Memory到L1 Buffer](matrix_compute/cube_compute_load/copy_gm_to_l1.md) | 使用`copy`将Global Memory中的数据搬运到L1 Buffer,并支持多种矩阵格式转换和Batch搬运。 |59| [Global Memory到L1 Buffer](matrix_compute/cube_compute_load/copy_gm_to_l1.md) | 使用`copy`将Global Memory中的数据搬运到L1 Buffer,并支持多种矩阵格式转换和Batch搬运。 |
60-| [Unified Buffer到L1 Buffer](reg_vector_compute/vector_compute_load/copy_ub_to_l1.md) | 使用`copy`将Unified Buffer中的数据搬运到L1 Buffer。 |60+| [Unified Buffer到L1 Buffer](reg_vector_compute/vector_compute_load/copy_ub_to_l1.md) | 使用`copy`将UB中的数据搬运到L1 Buffer。 |
61-| [L1 Buffer到Unified Buffer](matrix_compute/cube_compute_load/copy_l1_to_ub.md) | 使用`copy`将L1 Buffer中的数据搬运到Unified Buffer。 |61+| [L1 Buffer到Unified Buffer](matrix_compute/cube_compute_load/copy_l1_to_ub.md) | 使用`copy`将L1 Buffer中的数据搬运到UB。 |
62| [L1 Buffer到L0A Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0a.md) | 使用`copy`将L1 Buffer中的左矩阵数据搬运到L0A Buffer,支持矩阵格式转换和卷积特征图搬运。 |62| [L1 Buffer到L0A Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0a.md) | 使用`copy`将L1 Buffer中的左矩阵数据搬运到L0A Buffer,支持矩阵格式转换和卷积特征图搬运。 |
63| [L1 Buffer到L0B Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0b.md) | 使用`copy`将L1 Buffer中的右矩阵数据搬运到L0B Buffer,支持矩阵格式转换和Batch搬运。 |63| [L1 Buffer到L0B Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0b.md) | 使用`copy`将L1 Buffer中的右矩阵数据搬运到L0B Buffer,支持矩阵格式转换和Batch搬运。 |
64| [L1 Buffer到L0ScaleA Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0scalea.md) | 使用`copy`将L1 Buffer中的ScaleA数据搬运到L0ScaleA Buffer。 |64| [L1 Buffer到L0ScaleA Buffer](matrix_compute/cube_compute_load/copy_l1_to_l0scalea.md) | 使用`copy`将L1 Buffer中的ScaleA数据搬运到L0ScaleA Buffer。 |
@@ -66,9 +66,9 @@
66| [L1 Buffer到BiasTable Buffer](matrix_compute/cube_compute_load/copy_l1_to_biastable.md) | 使用`copy`将L1 Buffer中的Bias数据搬运到BiasTable Buffer。 |66| [L1 Buffer到BiasTable Buffer](matrix_compute/cube_compute_load/copy_l1_to_biastable.md) | 使用`copy`将L1 Buffer中的Bias数据搬运到BiasTable Buffer。 |
67| [L1 Buffer到Fixpipe Buffer](matrix_compute/cube_compute_load/copy_l1_to_fixbuf.md) | 使用`copy`将L1 Buffer中的量化参数搬运到Fixpipe Buffer。 |67| [L1 Buffer到Fixpipe Buffer](matrix_compute/cube_compute_load/copy_l1_to_fixbuf.md) | 使用`copy`将L1 Buffer中的量化参数搬运到Fixpipe Buffer。 |
68| [L0C Buffer到Global Memory](matrix_compute/cube_compute_store/copy_l0c_to_gm.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到Global Memory,支持格式转换和量化输出。 |68| [L0C Buffer到Global Memory](matrix_compute/cube_compute_store/copy_l0c_to_gm.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到Global Memory,支持格式转换和量化输出。 |
69-| [L0C Buffer到Unified Buffer](matrix_compute/cube_compute_store/copy_l0c_to_ub.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到Unified Buffer,支持格式转换和量化输出。 |69+| [L0C Buffer到Unified Buffer](matrix_compute/cube_compute_store/copy_l0c_to_ub.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到UB,支持格式转换和量化输出。 |
70| [L0C Buffer到L1 Buffer](matrix_compute/cube_compute_store/copy_l0c_to_l1.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到L1 Buffer。 |70| [L0C Buffer到L1 Buffer](matrix_compute/cube_compute_store/copy_l0c_to_l1.md) | 使用`copy`将L0C Buffer中的矩阵结果搬运到L1 Buffer。 |
71-| [Unified Buffer内部搬运](reg_vector_compute/vector_compute_load/copy_ub_to_ub.md) | 使用`copy`完成Unified Buffer内部Tensor之间的数据搬运。 |71+| [Unified Buffer内部搬运](reg_vector_compute/vector_compute_load/copy_ub_to_ub.md) | 使用`copy`完成UB内部Tensor之间的数据搬运。 |
72 72 
73## 矩阵计算73## 矩阵计算
74 74 
@@ -85,14 +85,14 @@
85| [unit_flag](matrix_compute/mmad_compute_key_features/unit_flag.md) | 介绍mmad与后续矩阵数据搬出之间的细粒度并行控制。 |85| [unit_flag](matrix_compute/mmad_compute_key_features/unit_flag.md) | 介绍mmad与后续矩阵数据搬出之间的细粒度并行控制。 |
86| [mmad计算辅助配置](matrix_compute/mmad_compute_aux_config.md) | 列出mmad计算所需的C API辅助配置接口。 |86| [mmad计算辅助配置](matrix_compute/mmad_compute_aux_config.md) | 列出mmad计算所需的C API辅助配置接口。 |
87| [矩阵计算搬入总体说明](matrix_compute/cube_compute_load/overall_description.md) | 说明矩阵数据从Global Memory或L1 Buffer搬入各级矩阵计算Buffer的通路。 |87| [矩阵计算搬入总体说明](matrix_compute/cube_compute_load/overall_description.md) | 说明矩阵数据从Global Memory或L1 Buffer搬入各级矩阵计算Buffer的通路。 |
88-| [矩阵计算搬出总体说明](matrix_compute/cube_compute_store/overall_description.md) | 说明矩阵结果从L0C Buffer搬出到Global Memory、Unified Buffer或L1 Buffer的通路。 |88+| [矩阵计算搬出总体说明](matrix_compute/cube_compute_store/overall_description.md) | 说明矩阵结果从L0C Buffer搬出到Global Memory、UB或L1 Buffer的通路。 |
89| [矩阵搬出关键特性](matrix_compute/cube_store_key_features/cube_store_key_features.md) | 介绍随路量化、随路ReLU、通道拆分、通道合并、Batch搬运和双目标模式。 |89| [矩阵搬出关键特性](matrix_compute/cube_store_key_features/cube_store_key_features.md) | 介绍随路量化、随路ReLU、通道拆分、通道合并、Batch搬运和双目标模式。 |
90| [随路量化](matrix_compute/cube_store_key_features/quant_pre.md) | 介绍矩阵结果搬出过程中的随路量化能力。 |90| [随路量化](matrix_compute/cube_store_key_features/quant_pre.md) | 介绍矩阵结果搬出过程中的随路量化能力。 |
91| [随路ReLU](matrix_compute/cube_store_key_features/relu_pre.md) | 介绍矩阵结果搬出过程中的随路ReLU能力。 |91| [随路ReLU](matrix_compute/cube_store_key_features/relu_pre.md) | 介绍矩阵结果搬出过程中的随路ReLU能力。 |
92| [F32 Channel Split](matrix_compute/cube_store_key_features/f32_channel_split.md) | 介绍F32结果搬出时的通道拆分能力。 |92| [F32 Channel Split](matrix_compute/cube_store_key_features/f32_channel_split.md) | 介绍F32结果搬出时的通道拆分能力。 |
93| [Int8 Channel Merge](matrix_compute/cube_store_key_features/int8_channel_merge.md) | 介绍Int8结果搬出时的通道合并能力。 |93| [Int8 Channel Merge](matrix_compute/cube_store_key_features/int8_channel_merge.md) | 介绍Int8结果搬出时的通道合并能力。 |
94| [Batch搬运](matrix_compute/cube_store_key_features/batch_copy.md) | 介绍矩阵结果的多Batch搬出能力。 |94| [Batch搬运](matrix_compute/cube_store_key_features/batch_copy.md) | 介绍矩阵结果的多Batch搬出能力。 |
95-| [L0C到Unified Buffer双目标模式](matrix_compute/cube_store_key_features/l0c_to_ub_dual_dst.md) | 介绍L0C到Unified Buffer的双目标搬出模式。 |95+| [L0C到Unified Buffer双目标模式](matrix_compute/cube_store_key_features/l0c_to_ub_dual_dst.md) | 介绍L0C到UB的双目标搬出模式。 |
96 96 
97## 矢量计算接口97## 矢量计算接口
98 98 
@@ -107,9 +107,9 @@
107| [none_mask](reg_vector_compute/mask_reg_compute/none_mask.md) | 创建与指定元素类型位宽匹配的全无效Mask寄存器。 |107| [none_mask](reg_vector_compute/mask_reg_compute/none_mask.md) | 创建与指定元素类型位宽匹配的全无效Mask寄存器。 |
108| [update_mask](reg_vector_compute/mask_reg_compute/update_mask.md) | 根据剩余待处理元素数生成有效位Mask,并更新剩余元素数量。 |108| [update_mask](reg_vector_compute/mask_reg_compute/update_mask.md) | 根据剩余待处理元素数生成有效位Mask,并更新剩余元素数量。 |
109| [deinterleave(掩码寄存器解交织)](reg_vector_compute/mask_reg_compute/deinterleave.md) | 将两个Mask寄存器按指定元素宽度解交织,返回偶数组和奇数组结果。 |109| [deinterleave(掩码寄存器解交织)](reg_vector_compute/mask_reg_compute/deinterleave.md) | 将两个Mask寄存器按指定元素宽度解交织,返回偶数组和奇数组结果。 |
110-| [load](reg_vector_compute/reg_data_load/load.md) | 将Unified Buffer中的数据搬入`reg_tensor`,支持多种数据排列方式。 |110+| [load](reg_vector_compute/reg_data_load/load.md) | 将UB中的数据搬入`reg_tensor`,支持多种数据排列方式。 |
111-| [load_broadcast](reg_vector_compute/reg_data_load/load_broadcast.md) | 从Unified Buffer搬入数据,并按指定模式广播到`reg_tensor`。 |111+| [load_broadcast](reg_vector_compute/reg_data_load/load_broadcast.md) | 从UB搬入数据,并按指定模式广播到`reg_tensor`。 |
112-| [store](reg_vector_compute/reg_data_store/store.md) | 将`reg_tensor`中的数据搬出到Unified Buffer,支持多种数据排列方式。 |112+| [store](reg_vector_compute/reg_data_store/store.md) | 将`reg_tensor`中的数据搬出到UB,支持多种数据排列方式。 |
113| [cast](reg_vector_compute/type_conversion/cast.md) | 转换寄存器数据类型,支持配置数据排布、舍入和饱和模式。 |113| [cast](reg_vector_compute/type_conversion/cast.md) | 转换寄存器数据类型,支持配置数据排布、舍入和饱和模式。 |
114| [trunc](reg_vector_compute/type_conversion/trunc.md) | 将Mask选中的浮点元素向零取整,并保留原数据类型。 |114| [trunc](reg_vector_compute/type_conversion/trunc.md) | 将Mask选中的浮点元素向零取整,并保留原数据类型。 |
115| [log](reg_vector_compute/basic_arithmetic/log.md) | 对源操作数中的有效元素逐元素计算自然对数。 |115| [log](reg_vector_compute/basic_arithmetic/log.md) | 对源操作数中的有效元素逐元素计算自然对数。 |
@@ -36,7 +36,7 @@ SIMT VF函数定义中的关键修饰符说明如下:
36| \_\_simt_vf\_\_ | 函数标识符,标识SIMT VF函数。 |36| \_\_simt_vf\_\_ | 函数标识符,标识SIMT VF函数。 |
37| inline | 建议内联,实际是否内联由编译器决定。 |37| inline | 建议内联,实际是否内联由编译器决定。 |
38| \_\_gm\_\_ | 内存空间修饰符,标识内存空间为GM。 |38| \_\_gm\_\_ | 内存空间修饰符,标识内存空间为GM。 |
39-| \_\_ubuf\_\_ | 内存空间修饰符,标识内存空间为UB。 |39+| \_\_ubuf\_\_ | 内存空间修饰符,标识内存空间为Unified Buffer(UB。 |
40 40 
41通过SIMT的[asc\_vf\_call](kernel_function_config.md#asc_vf_call调用)接口在核函数(Kernel)或`__aicore__`函数中调用,调用示例如下:41通过SIMT的[asc\_vf\_call](kernel_function_config.md#asc_vf_call调用)接口在核函数(Kernel)或`__aicore__`函数中调用,调用示例如下:
42 42 
@@ -46,7 +46,7 @@ asc_vf_call<function_name>(dim3(blockDim), arg1, arg2, ...);
46 46 
47SIMT VF函数有以下约束:47SIMT VF函数有以下约束:
48 48 
49-- 入参仅支持Ascend C的[内置数据类型](builtin_data_types.md)(int32\_t、uint32\_t、float、half等)及其组成的指针、数组、结构体类型,且指针类型必须指向GM或者Unified Buffer(UB内存。49+- 入参仅支持Ascend C的[内置数据类型](builtin_data_types.md)(int32\_t、uint32\_t、float、half等)及其组成的指针、数组、结构体类型,且指针类型必须指向GM或者UB内存。
50- 函数返回类型必须是void。50- 函数返回类型必须是void。
51- SIMT VF内只能调用\_\_simt\_callee\_\_函数或\_\_callee\_\_函数。51- SIMT VF内只能调用\_\_simt\_callee\_\_函数或\_\_callee\_\_函数。
52 52 
@@ -802,7 +802,7 @@
802| 接口名 | 功能描述 |802| 接口名 | 功能描述 |
803| --- | --- |803| --- | --- |
804| [__isGlobal](../address_space_predicate_functions/__isGlobal.md) | 判断输入的指针是否指向Global Memory内存空间的地址。 |804| [__isGlobal](../address_space_predicate_functions/__isGlobal.md) | 判断输入的指针是否指向Global Memory内存空间的地址。 |
805-| [__isUbuf](../address_space_predicate_functions/__isUbuf.md) | 判断输入的指针是否指向UB内存空间的地址。 |805+| [__isUbuf](../address_space_predicate_functions/__isUbuf.md) | 判断输入的指针是否指向Unified Buffer(UB内存空间的地址。 |
806| [__isLocal](../address_space_predicate_functions/__isLocal.md) | 判断输入的指针是否指向栈空间的地址。 |806| [__isLocal](../address_space_predicate_functions/__isLocal.md) | 判断输入的指针是否指向栈空间的地址。 |
807 807 
808## 地址空间转换函数808## 地址空间转换函数
@@ -115,7 +115,7 @@ UB或Global Memory上的初始数据。
115| 名称 | 说明 |115| 名称 | 说明 |
116| --- | --- |116| --- | --- |
117| `status` | 每个元素表示一条状态记录,0为正常,非0为异常。 |117| `status` | 每个元素表示一条状态记录,0为正常,非0为异常。 |
118-| `error_count` | Global Memory中的异常计数器,kernel启动前清零。 |118+| `error_count` | Global Memory中的异常计数器,核函数(Kernel)启动前清零。 |
119| `n` | 输入元素个数。 |119| `n` | 输入元素个数。 |
120 120 
121核心代码实现如下:121核心代码实现如下:
@@ -84,7 +84,7 @@ UB或Global Memory上的初始数据。
84| 名称 | 说明 |84| 名称 | 说明 |
85| --- | --- |85| --- | --- |
86| `flags` | Global Memory中的共享状态位。 |86| `flags` | Global Memory中的共享状态位。 |
87-| `clear_bits` | 每个元素表示需要清除的bit,kernel内部会转换为AND掩码。 |87+| `clear_bits` | 每个元素表示需要清除的bit,核函数(Kernel)内部会转换为AND掩码。 |
88| `n` | 掩码数量。 |88| `n` | 掩码数量。 |
89 89 
90核心代码实现如下:90核心代码实现如下:
@@ -75,7 +75,7 @@ UB或Global Memory上的初始数据。
75 75 
76| 名称 | 说明 |76| 名称 | 说明 |
77| --- | --- |77| --- | --- |
78-| `ticket` | Global Memory中的反向环形计数器,kernel启动前初始化。 |78+| `ticket` | Global Memory中的反向环形计数器,核函数(Kernel)启动前初始化。 |
79| `slots` | 保存每个线程获得的槽位编号。 |79| `slots` | 保存每个线程获得的槽位编号。 |
80| `capacity` | 环形队列容量。 |80| `capacity` | 环形队列容量。 |
81| `n` | 需要分配槽位的线程数。 |81| `n` | 需要分配槽位的线程数。 |
@@ -75,7 +75,7 @@ UB或Global Memory上的初始数据。
75 75 
76| 名称 | 说明 |76| 名称 | 说明 |
77| --- | --- |77| --- | --- |
78-| `ticket` | Global Memory中的环形计数器,kernel启动前初始化。 |78+| `ticket` | Global Memory中的环形计数器,核函数(Kernel)启动前初始化。 |
79| `slots` | 保存每个线程获得的槽位编号。 |79| `slots` | 保存每个线程获得的槽位编号。 |
80| `capacity` | 环形队列容量。 |80| `capacity` | 环形队列容量。 |
81| `n` | 需要分配槽位的线程数。 |81| `n` | 需要分配槽位的线程数。 |
@@ -113,7 +113,7 @@ UB或Global Memory上的初始数据。
113| 名称 | 说明 |113| 名称 | 说明 |
114| --- | --- |114| --- | --- |
115| `scores` | 每个元素表示一个候选分数。 |115| `scores` | 每个元素表示一个候选分数。 |
116-| `max_score` | Global Memory中的最大值结果,kernel启动前初始化为足够小的值。 |116+| `max_score` | Global Memory中的最大值结果,核函数(Kernel)启动前初始化为足够小的值。 |
117| `n` | 分数数量。 |117| `n` | 分数数量。 |
118 118 
119核心代码实现如下:119核心代码实现如下:
@@ -113,7 +113,7 @@ UB或Global Memory上的初始数据。
113| 名称 | 说明 |113| 名称 | 说明 |
114| --- | --- |114| --- | --- |
115| `latency` | 每个元素表示一次请求的延迟值。 |115| `latency` | 每个元素表示一次请求的延迟值。 |
116-| `min_latency` | Global Memory中的最小值结果,kernel启动前初始化为足够大的值。 |116+| `min_latency` | Global Memory中的最小值结果,核函数(Kernel)启动前初始化为足够大的值。 |
117| `n` | 延迟样本数量。 |117| `n` | 延迟样本数量。 |
118 118 
119核心代码实现如下:119核心代码实现如下:
@@ -84,7 +84,7 @@ UB或Global Memory上的初始数据。
84| 名称 | 说明 |84| 名称 | 说明 |
85| --- | --- |85| --- | --- |
86| `observed_flags` | 每个元素表示一个线程观察到的特征位。 |86| `observed_flags` | 每个元素表示一个线程观察到的特征位。 |
87-| `flags` | Global Memory中的汇总bitmask,kernel启动前清零。 |87+| `flags` | Global Memory中的汇总bitmask,核函数(Kernel)启动前清零。 |
88| `n` | 特征来源数量。 |88| `n` | 特征来源数量。 |
89 89 
90核心代码实现如下:90核心代码实现如下:
@@ -106,7 +106,7 @@ inline bfloat16x2_t asc_atomic_sub(bfloat16x2_t* address, bfloat16x2_t val)
106| 名称 | 说明 |106| 名称 | 说明 |
107| --- | --- |107| --- | --- |
108| `requests` | 每个元素表示一条资源申请需要扣减的配额。 |108| `requests` | 每个元素表示一条资源申请需要扣减的配额。 |
109-| `remaining` | Global Memory中的剩余配额,kernel启动前初始化。 |109+| `remaining` | Global Memory中的剩余配额,核函数(Kernel)启动前初始化。 |
110| `n` | 申请条数。 |110| `n` | 申请条数。 |
111 111 
112核心代码实现如下:112核心代码实现如下:
@@ -94,7 +94,7 @@ UB或Global Memory上的初始数据。
94| 名称 | 说明 |94| 名称 | 说明 |
95| --- | --- |95| --- | --- |
96| `hit` | 每个元素表示一个线程是否命中事件,1为命中,0为未命中。 |96| `hit` | 每个元素表示一个线程是否命中事件,1为命中,0为未命中。 |
97-| `parity` | Global Memory中的奇偶标志,kernel启动前清零。 |97+| `parity` | Global Memory中的奇偶标志,核函数(Kernel)启动前清零。 |
98| `n` | 输入元素个数。 |98| `n` | 输入元素个数。 |
99 99 
100核心代码实现如下:100核心代码实现如下:
@@ -73,7 +73,7 @@
73```cpp73```cpp
74#include "kernel_operator.h"74#include "kernel_operator.h"
75 75 
76-// 原普通kernel保留(用于非SuperKernel场景)76+// 原普通核函数(Kernel)保留(用于非SuperKernel场景)
77__global__ __vector__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, uint32_t totalLength) 77__global__ __vector__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, uint32_t totalLength)
78{ 78{
79 KernelAdd op; 79 KernelAdd op;
@@ -189,10 +189,10 @@ C_FORMAT_FRACTAL_NZ_C0_8</pre>
189</tr>189</tr>
190<tr id="row17351183522212"><td class="cellrowborder" valign="top" width="31.57315731573157%" headers="mcps1.2.4.1.1 "><p id="p18352143518225"><a name="p18352143518225"></a><a name="p18352143518225"></a>ASCENDC_TPL_KERNEL_TYPE_DECL(args0, ...)</p>190<tr id="row17351183522212"><td class="cellrowborder" valign="top" width="31.57315731573157%" headers="mcps1.2.4.1.1 "><p id="p18352143518225"><a name="p18352143518225"></a><a name="p18352143518225"></a>ASCENDC_TPL_KERNEL_TYPE_DECL(args0, ...)</p>
191</td>191</td>
192-<td class="cellrowborder" valign="top" width="20.59205920592059%" headers="mcps1.2.4.1.2 "><p id="p1435293519223"><a name="p1435293519223"></a><a name="p1435293519223"></a>定义算子模板参数的kernel类型</p>192+<td class="cellrowborder" valign="top" width="20.59205920592059%" headers="mcps1.2.4.1.2 "><p id="p1435293519223"><a name="p1435293519223"></a><a name="p1435293519223"></a>定义算子模板参数的核函数(Kernel)类型</p>
193</td>193</td>
194<td class="cellrowborder" valign="top" width="47.83478347834784%" headers="mcps1.2.4.1.3 "><p id="p4637141672417"><a name="p4637141672417"></a><a name="p4637141672417"></a>args0:参数名</p>194<td class="cellrowborder" valign="top" width="47.83478347834784%" headers="mcps1.2.4.1.3 "><p id="p4637141672417"><a name="p4637141672417"></a><a name="p4637141672417"></a>args0:参数名</p>
195-<p id="p06378169245"><a name="p06378169245"></a><a name="p06378169245"></a>args1-argsn:后续为若干kernel类型。</p>195+<p id="p06378169245"><a name="p06378169245"></a><a name="p06378169245"></a>args1-argsn:后续为若干核函数(Kernel)类型。</p>
196<p id="p195465652615"><a name="p195465652615"></a><a name="p195465652615"></a>当前支持的核函数(Kernel)类型如下:</p>196<p id="p195465652615"><a name="p195465652615"></a><a name="p195465652615"></a>当前支持的核函数(Kernel)类型如下:</p>
197<a name="ul2054135610267"></a><a name="ul2054135610267"></a><ul id="ul2054135610267"><li>ASCENDC_TPL_AIV_ONLY // 算子执行时仅启动AI Core上的Vector核</li><li>ASCENDC_TPL_AIC_ONLY // 算子执行时仅启动AI Core上的Cube核</li><li>ASCENDC_TPL_MIX_AIV_1_0 // AIC、AIV混合场景下,算子执行时仅会启动AI Core上的Vector核</li><li>ASCENDC_TPL_MIX_AIC_1_0 // AIC、AIV混合场景下,算子执行时仅会启动AI Core上的Cube核</li><li>ASCENDC_TPL_MIX_AIC_1_1 // AIC、AIV混合场景下,算子执行时会同时启动AI Core上的Cube核和Vector核,比例为1:1</li><li>ASCENDC_TPL_MIX_AIC_1_2 // AIC、AIV混合场景下,算子执行时会同时启动AI Core上的Cube核和Vector核,比例为1:2</li><li>ASCENDC_TPL_AICORE // 算子执行时仅会启动AI Core</li><li>ASCENDC_TPL_VECTORCORE // 该参数为预留参数,当前版本暂不支持</li><li>ASCENDC_TPL_MIX_AICORE // 该参数为预留参数,当前版本暂不支持</li><li>ASCENDC_TPL_MIX_VECTOR_CORE // 算子执行时会同时启动AI Core和Vector Core</li></ul>197<a name="ul2054135610267"></a><a name="ul2054135610267"></a><ul id="ul2054135610267"><li>ASCENDC_TPL_AIV_ONLY // 算子执行时仅启动AI Core上的Vector核</li><li>ASCENDC_TPL_AIC_ONLY // 算子执行时仅启动AI Core上的Cube核</li><li>ASCENDC_TPL_MIX_AIV_1_0 // AIC、AIV混合场景下,算子执行时仅会启动AI Core上的Vector核</li><li>ASCENDC_TPL_MIX_AIC_1_0 // AIC、AIV混合场景下,算子执行时仅会启动AI Core上的Cube核</li><li>ASCENDC_TPL_MIX_AIC_1_1 // AIC、AIV混合场景下,算子执行时会同时启动AI Core上的Cube核和Vector核,比例为1:1</li><li>ASCENDC_TPL_MIX_AIC_1_2 // AIC、AIV混合场景下,算子执行时会同时启动AI Core上的Cube核和Vector核,比例为1:2</li><li>ASCENDC_TPL_AICORE // 算子执行时仅会启动AI Core</li><li>ASCENDC_TPL_VECTORCORE // 该参数为预留参数,当前版本暂不支持</li><li>ASCENDC_TPL_MIX_AICORE // 该参数为预留参数,当前版本暂不支持</li><li>ASCENDC_TPL_MIX_VECTOR_CORE // 算子执行时会同时启动AI Core和Vector Core</li></ul>
198<p id="p176510543512"><a name="p176510543512"></a><a name="p176510543512"></a>本接口只允许与ASCENDC_TPL_SHARED_KERNEL_TYPE_SEL(args0, ...)配合使用。</p>198<p id="p176510543512"><a name="p176510543512"></a><a name="p176510543512"></a>本接口只允许与ASCENDC_TPL_SHARED_KERNEL_TYPE_SEL(args0, ...)配合使用。</p>
@@ -29,7 +29,7 @@ ge::graphStatus TilingXXX(gert::TilingContext* context)
29 29 
30### Kernel直调30### Kernel直调
31 31 
32-Kernel直调不通过`gert::TilingContext`获取平台信息,可通过[PlatformAscendCManager](../PlatformAscendCManager.md)直接获取`PlatformAscendC`指针后调用相同的平台信息接口。32+核函数(Kernel直调不通过`gert::TilingContext`获取平台信息,可通过[PlatformAscendCManager](../PlatformAscendCManager.md)直接获取`PlatformAscendC`指针后调用相同的平台信息接口。
33 33 
34```cpp34```cpp
35void GetInfoFun()35void GetInfoFun()
@@ -2,7 +2,7 @@
2 2 
3## 功能说明<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section36583473819"></a>3## 功能说明<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section36583473819"></a>
4 4 
5-配置自定义算子调用的kernel函数接口名称,functionName固定为“RunCpuKernel”。5+配置自定义算子调用的函数(Kernel)接口名称,functionName固定为“RunCpuKernel”。
6 6 
7## 函数原型<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section13230182415108"></a>7## 函数原型<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section13230182415108"></a>
8 8 
@@ -25,7 +25,7 @@ OpAICPUDef &FunctionName(const char *value)
25</td>25</td>
26<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a>输入</p>26<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a>输入</p>
27</td>27</td>
28-<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><span>算子调用的kernel函数接口名称,</span><span>functionName固定为“RunCpuKernel”。</span></p>28+<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><span>算子调用的函数(Kernel)接口名称,</span><span>functionName固定为“RunCpuKernel”。</span></p>
29</td>29</td>
30</tr>30</tr>
31</tbody>31</tbody>
@@ -4,7 +4,7 @@
4 4 
5注册算子属性参数。5注册算子属性参数。
6 6 
7-当需要设置的参数不参与kernel侧计算时,可以将该参数注册为算子属性参数。7+当需要设置的参数不参与核函数(Kernel)侧计算时,可以将该参数注册为算子属性参数。
8 8 
9## 函数原型<a name="zh-cn_topic_0000001705099477_zh-cn_topic_0000001576870901_zh-cn_topic_0000001575944081_section13230182415108"></a>9## 函数原型<a name="zh-cn_topic_0000001705099477_zh-cn_topic_0000001576870901_zh-cn_topic_0000001575944081_section13230182415108"></a>
10 10 
@@ -37,5 +37,5 @@ OpParamDef &Input(const char *name)
37 37 
38## 约束说明<a name="zh-cn_topic_0000001549188224_zh-cn_topic_0000001526111046_zh-cn_topic_0000001525424352_section19165124931511"></a>38## 约束说明<a name="zh-cn_topic_0000001549188224_zh-cn_topic_0000001526111046_zh-cn_topic_0000001525424352_section19165124931511"></a>
39 39 
40-参数注册的顺序需要和算子kernel入口函数一致。40+参数注册的顺序需要和算子核函数(Kernel)入口函数一致。
41 41 
@@ -37,5 +37,5 @@ OpParamDef &Output(const char *name)
37 37 
38## 约束说明<a name="zh-cn_topic_0000001549347676_zh-cn_topic_0000001576870901_zh-cn_topic_0000001575944081_section19165124931511"></a>38## 约束说明<a name="zh-cn_topic_0000001549347676_zh-cn_topic_0000001576870901_zh-cn_topic_0000001575944081_section19165124931511"></a>
39 39 
40-参数注册的顺序需要和算子kernel入口函数一致。40+参数注册的顺序需要和算子核函数(Kernel)入口函数一致。
41 41 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section36583473819"></a>3## 功能说明<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section36583473819"></a>
4 4 
5-配置自定义算子调用的kernel函数接口名称,functionName固定为“RunCpuKernel”。5+配置自定义算子调用的函数(Kernel)接口名称,functionName固定为“RunCpuKernel”。
6 6 
7## 函数原型<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section13230182415108"></a>7## 函数原型<a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001525424352_section13230182415108"></a>
8 8 
@@ -25,7 +25,7 @@ OpHostCPUDef &FunctionName(const char *value)
25</td>25</td>
26<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a>输入</p>26<td class="cellrowborder" valign="top" width="15.340000000000002%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_zh-cn_topic_0000001575944081_p320343694214"></a>输入</p>
27</td>27</td>
28-<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><span>算子调用的kernel函数接口名称,</span><span>functionName固定为“RunCpuKernel”。</span></p>28+<td class="cellrowborder" valign="top" width="67.44%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><a name="zh-cn_topic_0000001575610072_zh-cn_topic_0000001526442954_p12935163055011"></a><span>算子调用的函数(Kernel)接口名称,</span><span>functionName固定为“RunCpuKernel”。</span></p>
29</td>29</td>
30</tr>30</tr>
31</tbody>31</tbody>
@@ -1,4 +1,4 @@
1# OpMC2Def简介<a name="ZH-CN_TOPIC_0000002078492740"></a>1# OpMC2Def简介<a name="ZH-CN_TOPIC_0000002078492740"></a>
2 2 
3-该类用于在host侧配置通算融合算子的通信域名称。配置后在kernel侧可以获取通信域对应的context(消息区)地址。3+该类用于在host侧配置通算融合算子的通信域名称。配置后在核函数(Kernel)侧可以获取通信域对应的context(消息区)地址。
4 4 
@@ -2,7 +2,7 @@
2 2 
3## 功能说明<a name="zh-cn_topic_0000002009944386_zh-cn_topic_0000001526594958_zh-cn_topic_0000001525424352_section36583473819"></a>3## 功能说明<a name="zh-cn_topic_0000002009944386_zh-cn_topic_0000001526594958_zh-cn_topic_0000001525424352_section36583473819"></a>
4 4 
5-标识算子输出的shape是否依赖于计算得到。某些算子,比如NonZero(统计tensor中非零值的个数),计算完成前无法得知算子输出的shape信息,算子计算完成后才能获取。该类算子在原型定义时,需要使用OutputShapeDependOnCompute接口进行标识,同时在算子核函数(Kernel)中将实际输出shape写入到出参中,便于框架侧基于该信息进行输出内存的管理。对应的kernel侧实现请参考[输出shape依赖计算的算子kernel实现](../../../../guide/programming_guide/advanced_programming/aclnn_operator_development/design_and_implementation/kernel_output_shape_computation.md)。5+标识算子输出的shape是否依赖于计算得到。某些算子,比如NonZero(统计tensor中非零值的个数),计算完成前无法得知算子输出的shape信息,算子计算完成后才能获取。该类算子在原型定义时,需要使用OutputShapeDependOnCompute接口进行标识,同时在算子核函数(Kernel)中将实际输出shape写入到出参中,便于框架侧基于该信息进行输出内存的管理。对应的核函数(Kernel)侧实现请参考[输出shape依赖计算的算子kernel实现](../../../../guide/programming_guide/advanced_programming/aclnn_operator_development/design_and_implementation/kernel_output_shape_computation.md)。
6 6 
7## 函数原型<a name="zh-cn_topic_0000002009944386_zh-cn_topic_0000001526594958_zh-cn_topic_0000001525424352_section13230182415108"></a>7## 函数原型<a name="zh-cn_topic_0000002009944386_zh-cn_topic_0000001526594958_zh-cn_topic_0000001525424352_section13230182415108"></a>
8 8 
@@ -25,7 +25,7 @@
25 25 
26## 功能说明26## 功能说明
27 27 
28-SIMD场景下,用于设置性能数据采集信号启动,和asc\_prof\_stop配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用asc\_prof\_start和asc\_prof\_stop来指定需要调优的代码段范围。28+SIMD场景下,用于设置性能数据采集信号启动,和asc\_prof\_stop配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用asc\_prof\_start和asc\_prof\_stop来指定需要调优的代码段范围。
29 29 
30## 函数原型30## 函数原型
31 31 
@@ -25,7 +25,7 @@
25 25 
26## 功能说明26## 功能说明
27 27 
28-SIMD场景下,设置性能数据采集信号停止,和asc\_prof\_start配合使用。使用msOpProf工具进行算子上板调优时,可在kernel侧代码段前后分别调用asc\_prof\_start和asc\_prof\_stop来指定需要调优的代码段范围。28+SIMD场景下,设置性能数据采集信号停止,和asc\_prof\_start配合使用。使用msOpProf工具进行算子上板调优时,可在核函数(Kernel)侧代码段前后分别调用asc\_prof\_start和asc\_prof\_stop来指定需要调优的代码段范围。
29 29 
30## 函数原型30## 函数原型
31 31 
@@ -111,7 +111,7 @@ ascendc_assert(expr, fmt, args...)
111 111 
112| 参数名 | 输入/输出 | 描述 |112| 参数名 | 输入/输出 | 描述 |
113| --- | --- | --- |113| --- | --- | --- |
114-| expr | 输入 | 断言条件。为`true`时,Kernel继续运行;为`false`时,接口打印断言失败信息并触发异常。 |114+| expr | 输入 | 断言条件。为`true`时,核函数(Kernel继续运行;为`false`时,接口打印断言失败信息并触发异常。 |
115| fmt | 输入 | 可选。自定义错误信息的格式控制字符串,包含普通字符和转换说明。普通字符原样输出;转换说明以百分号(%)开始,用于控制`args`中对应参数的转换和输出。支持的转换类型和数据类型参见[printf](printf.md)的参数说明。 |115| fmt | 输入 | 可选。自定义错误信息的格式控制字符串,包含普通字符和转换说明。普通字符原样输出;转换说明以百分号(%)开始,用于控制`args`中对应参数的转换和输出。支持的转换类型和数据类型参见[printf](printf.md)的参数说明。 |
116| args | 输入 | 可选。与`fmt`中的转换说明对应的附加参数。每个参数替换`fmt`中对应的转换说明,参数数量和类型应与转换说明匹配。 |116| args | 输入 | 可选。与`fmt`中的转换说明对应的附加参数。每个参数替换`fmt`中对应的转换说明,参数数量和类型应与转换说明匹配。 |
117 117 
@@ -139,7 +139,7 @@ ascendc_assert(expr, fmt, args...)
139### SIMD VF编程场景139### SIMD VF编程场景
140 140 
141- CPU域调试时,多参数调用仅检查断言条件,不打印`fmt``args`指定的自定义错误信息,行为与单参数调用相同。141- CPU域调试时,多参数调用仅检查断言条件,不打印`fmt``args`指定的自定义错误信息,行为与单参数调用相同。
142-- `fmt`可以直接使用字符串字面量。使用字符串指针时,该指针必须指向UB中的字符串,示例如下:142+- `fmt`可以直接使用字符串字面量。使用字符串指针时,该指针必须指向Unified Buffer(UB中的字符串,示例如下:
143 143 
144 ```cpp144 ```cpp
145 __ubuf__ const char* fmt = "value is %d.\n";145 __ubuf__ const char* fmt = "value is %d.\n";
@@ -106,7 +106,7 @@ static __attribute__((noinline)) void printf(const char* fmt, Args&&... args);
106 ```106 ```
107 107 
108<!-- npu="950" id15 -->108<!-- npu="950" id15 -->
109-- SIMD VF场景下,每个AIV核在单次`asc_vf_call`执行期间使用2KB预留UB空间临时保存调测数据。同一次`asc_vf_call`中的`assert`、`ascendc_assert`、`printf`和`asc_dump`共享该空间。该空间中的数据传输完成后会被复用,因此上述接口产生的累计调测数据可以超过2KB。单条调测数据必须能完整保存在该空间中,否则该条数据不会打印。109+- SIMD VF场景下,每个AIV核在单次`asc_vf_call`执行期间使用2KB预留Unified Buffer(UB空间临时保存调测数据。同一次`asc_vf_call`中的`assert`、`ascendc_assert`、`printf`和`asc_dump`共享该空间。该空间中的数据传输完成后会被复用,因此上述接口产生的累计调测数据可以超过2KB。单条调测数据必须能完整保存在该空间中,否则该条数据不会打印。
110- 每次调用`simd_vf``printf`时,除格式字符串和参数外,还会固定占用32字节;整条打印数据需要按8字节对齐。110- 每次调用`simd_vf``printf`时,除格式字符串和参数外,还会固定占用32字节;整条打印数据需要按8字节对齐。
111- SIMD VF场景下,"simd\_printf\_fifo\_size\_per\_core"建议配置为3KB以上。配置过小且打印数据量较大时,部分调测数据不会被打印。111- SIMD VF场景下,"simd\_printf\_fifo\_size\_per\_core"建议配置为3KB以上。配置过小且打印数据量较大时,部分调测数据不会被打印。
112<!-- end id15 -->112<!-- end id15 -->
@@ -70,7 +70,7 @@ $$
70 | srcShape | 输入 | 输入的shape信息。 |70 | srcShape | 输入 | 输入的shape信息。 |
71 | typeSize | 输入 | 算子输入的数据类型大小,单位为字节。比如算子输入的数据类型为half,此处应该传入2。 |71 | typeSize | 输入 | 算子输入的数据类型大小,单位为字节。比如算子输入的数据类型为half,此处应该传入2。 |
72 | isReuseSource | 输入 | 预留参数。 |72 | isReuseSource | 输入 | 预留参数。 |
73- | maxValue | 输出 | Axpy接口能完成计算所需的最大临时空间大小,超出该值的空间不会被接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,kernel侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请,最大空间大小为0表示计算不需要临时空间。 |73+ | maxValue | 输出 | Axpy接口能完成计算所需的最大临时空间大小,超出该值的空间不会被接口使用。在最小临时空间-最大临时空间范围内,随着临时空间增大,核函数(Kernel)侧接口计算性能会有一定程度的优化提升。为了达到更好的性能,开发者可以根据实际的内存使用情况进行空间申请,最大空间大小为0表示计算不需要临时空间。 |
74 | minValue | 输出 | Axpy接口能完成计算所需的最小临时空间大小。为保证功能正确,接口计算时申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 | 74 | minValue | 输出 | Axpy接口能完成计算所需的最小临时空间大小。为保证功能正确,接口计算时申请的临时空间不能小于该数值。最小空间大小为0表示计算不需要临时空间。 |
75 75 
76### 开发API76### 开发API
@@ -148,12 +148,12 @@ Ascend C资料体系由**五份**核心文档组成,通过交叉链接形成
148 148 
149**关联层**149**关联层**
150 150 
151-如下算子实践参考文档内容中提及核函数,但未进行解释核函数的规则或添加链接:151+如下算子实践参考文档内容中提及核函数(Kernel),但未进行解释核函数(Kernel)的规则或添加链接:
152 152 
153``` text153``` text
154# 核函数定义154# 核函数定义
155 155 
156-根据核函数中介绍的规则进行核函数的定义。核函数名为matmul_custom,有3个参数a,b,c,其中a,b都为输入内存,c为输出内存。使用函数类型限定符__global__来标识它是一个核函数,可以被<<<>>>调用;使用函数类型限定符__cube__来标识该核函数在设备端aicore上的Cube核执行。156+根据核函数(Kernel)中介绍的规则进行核函数(Kernel)的定义。核函数(Kernel)名为matmul_custom,有3个参数a,b,c,其中a,b都为输入内存,c为输出内存。使用函数类型限定符__global__来标识它是一个核函数(Kernel),可以被<<<>>>调用;使用函数类型限定符__cube__来标识该核函数(Kernel)在设备端aicore上的Cube核执行。
157```157```
158 158 
159### DOC-DISC-01 五文档链接联动159### DOC-DISC-01 五文档链接联动
@@ -185,7 +185,7 @@ Ascend C资料体系由**五份**核心文档组成,通过交叉链接形成
185 185 
186【正例】186【正例】
187 187 
188-**L0**:在如下入门教程中提到了核函数这一概念,概念详细内容链接到编程指南中。188+**L0**:在如下入门教程中提到了核函数(Kernel)这一概念,概念详细内容链接到编程指南中。
189 189 
190```text190```text
1913. **启动NPU计算任务**:调用Device侧预先编写的[核函数](../../programming_guide/programming_model/ai_core_simd_programming/kernel_function.md),NPU开始并行计算。1913. **启动NPU计算任务**:调用Device侧预先编写的[核函数](../../programming_guide/programming_model/ai_core_simd_programming/kernel_function.md),NPU开始并行计算。
@@ -228,10 +228,10 @@ Ascend C资料体系由**五份**核心文档组成,通过交叉链接形成
228**L5**:在如下算子实践参考文档中首次提及矢量编程范式这一编程概念,链接到该概念的权威解释。228**L5**:在如下算子实践参考文档中首次提及矢量编程范式这一编程概念,链接到该概念的权威解释。
229 229 
230```text230```text
231-基于Ascend C方式实现基础矢量算子核函数的流程如下所示。231+基于Ascend C方式实现基础矢量算子核函数(Kernel)的流程如下所示。
232- 算子分析:分析算子的数学表达式、输入、输出以及计算逻辑的实现,明确需要调用的Ascend C接口。232- 算子分析:分析算子的数学表达式、输入、输出以及计算逻辑的实现,明确需要调用的Ascend C接口。
233-- 核函数定义:定义Ascend C算子入口函数。233+- 核函数(Kernel)定义:定义Ascend C算子入口函数。
234-- 根据[矢量编程范式](../../../programming_guide/programming_model/ai_core_simd_programming/tpipe_tque_programming/tpipe_tque_paradigm.md#section116515238815)实现算子类:完成核函数的内部实现,包括3个基本任务:CopyIn,Compute,CopyOut。234+- 根据[矢量编程范式](../../../programming_guide/programming_model/ai_core_simd_programming/tpipe_tque_programming/tpipe_tque_paradigm.md#section116515238815)实现算子类:完成核函数(Kernel)的内部实现,包括3个基本任务:CopyIn,Compute,CopyOut。
235```235```
236 236 
237**L6**:在如下算子实践参考文档中,性能优化方案因架构版本不同而存在差异,需要链接到跨代迁移指南呈现架构差异。237**L6**:在如下算子实践参考文档中,性能优化方案因架构版本不同而存在差异,需要链接到跨代迁移指南呈现架构差异。
@@ -437,7 +437,7 @@ inQueueY.FreeTensor(yLocal);
437| SPMD vs SIMD vs SIMT | SPMD=编程模型、SIMD=指令执行模式、SIMT=线程执行模式 | 层级关系图 |437| SPMD vs SIMD vs SIMT | SPMD=编程模型、SIMD=指令执行模式、SIMT=线程执行模式 | 层级关系图 |
438| 四步法(Tiling→搬→算→搬) vs TPipe四步(Alloc→EnQue→...) | 编程流程vs流水管理范式 | 对比表 |438| 四步法(Tiling→搬→算→搬) vs TPipe四步(Alloc→EnQue→...) | 编程流程vs流水管理范式 | 对比表 |
439| DMA vs MTE vs DataCopy | 三层名同一件事 | 术语映射表 |439| DMA vs MTE vs DataCopy | 三层名同一件事 | 术语映射表 |
440-| MemBase(基础API) vs RegBase(VF融合API) | 计算位置不同(UB vs寄存器)、Load/Store次数不同 | 对比表+场景推荐 |440+| MemBase(基础API) vs RegBase(VF融合API) | 计算位置不同(Unified Buffer(UB vs寄存器)、Load/Store次数不同 | 对比表+场景推荐 |
441| Block vs CTA | Ascend C编程单元vs CUDA等价概念 | 竞品映射表 |441| Block vs CTA | Ascend C编程单元vs CUDA等价概念 | 竞品映射表 |
442| `LocalTensor` vs `GlobalTensor` vs `TBuf` | 计算用/外部用/临时用缓冲区 | 对照表+场景推荐 |442| `LocalTensor` vs `GlobalTensor` vs `TBuf` | 计算用/外部用/临时用缓冲区 | 对照表+场景推荐 |
443| `__ubuf__` vs `__cbuf__` vs `__gm__` | UB空间/L1空间/GM空间地址限定符 | 对照表 |443| `__ubuf__` vs `__cbuf__` vs `__gm__` | UB空间/L1空间/GM空间地址限定符 | 对照表 |
@@ -453,7 +453,7 @@ inQueueY.FreeTensor(yLocal);
453| 地址空间限定符 | AI Core物理存储空间 |453| 地址空间限定符 | AI Core物理存储空间 |
454|----------------|---------------------|454|----------------|---------------------|
455| \_\_gm\_\_ | 设备侧内存GM |455| \_\_gm\_\_ | 设备侧内存GM |
456-| \_\_ubuf\_\_ | Vector Unified Buffer |456+| \_\_ubuf\_\_ | UB |
457| \_\_ca\_\_ | Cube L0A Buffer |457| \_\_ca\_\_ | Cube L0A Buffer |
458| \_\_cb\_\_ | Cube L0B Buffer |458| \_\_cb\_\_ | Cube L0B Buffer |
459| \_\_cc\_\_ | Cube L0C Buffer |459| \_\_cc\_\_ | Cube L0C Buffer |
@@ -635,9 +635,9 @@ AscendC::Mutex::Unlock<PIPE_MTE2>(mutex_id);
635 635 
636第一类代码:**算子原型定义**,声明算子的接口信息,包括输入、输出和属性,以及支持的dtype、format。636第一类代码:**算子原型定义**,声明算子的接口信息,包括输入、输出和属性,以及支持的dtype、format。
637 637 
638-第二类代码:**Host侧Tiling实现**,在Kernel执行前准备运行参数。Kernel在AI Core上运行前,需要知道本次输入一共有多少数据、如何切核并启动多少个Block、每个Block内部如何继续切分、是否需要额外workspace,以及是否需要设置调度模式等launch配置。638+第二类代码:**Host侧Tiling实现**,在核函数(Kernel执行前准备运行参数。核函数(Kernel在AI Core上运行前,需要知道本次输入一共有多少数据、如何切核并启动多少个Block、每个Block内部如何继续切分、是否需要额外workspace,以及是否需要设置调度模式等launch配置。
639 639 
640-第三类代码:**Kernel侧算子实现**,在AI Core上执行的实际计算。Kernel侧根据Tiling传入的参数,从GM搬运数据到UB,在UB上完成计算,再把结果写回GM。640+第三类代码:**核函数(Kernel侧算子实现**,在AI Core上执行的实际计算。核函数(Kernel侧根据Tiling传入的参数,从GM搬运数据到UB,在UB上完成计算,再把结果写回GM。
641 641 
642本文的功能设计,就是在写这三类代码前,先确定每一类代码需要表达什么。642本文的功能设计,就是在写这三类代码前,先确定每一类代码需要表达什么。
643```643```
@@ -673,7 +673,7 @@ AscendC::Mutex::Unlock<PIPE_MTE2>(mutex_id);
673| 元素数量范围 | 明确最小值、最大值、对齐粒度 | "8元素"约束未文档化 |673| 元素数量范围 | 明确最小值、最大值、对齐粒度 | "8元素"约束未文档化 |
674| 格式限制 | ND/NZ/FRACTAL等格式支持情况 | 格式切换的偏移计算差异 |674| 格式限制 | ND/NZ/FRACTAL等格式支持情况 | 格式切换的偏移计算差异 |
675| 使用模式限制 | 直调/工程模式/调试模式的差异 | PipeBarrier仅特定模式可用 |675| 使用模式限制 | 直调/工程模式/调试模式的差异 | PipeBarrier仅特定模式可用 |
676-| 多核/多实例限制 | kernel内只读、核间同步要求 | 配置参数只读语义未说明 |676+| 多核/多实例限制 | 核函数(Kernel)内只读、核间同步要求 | 配置参数只读语义未说明 |
677| API组合限制 | 互斥API/必需搭配API | 文档推荐的组合实际不支持 |677| API组合限制 | 互斥API/必需搭配API | 文档推荐的组合实际不支持 |
678 678 
679**操作要求**:约束信息从规格说明书和assert代码中提取,集中展示在首次定义处。679**操作要求**:约束信息从规格说明书和assert代码中提取,集中展示在首次定义处。
@@ -765,8 +765,8 @@ AscendC::Mutex::Unlock<PIPE_MTE2>(mutex_id);
765 765 
766| 层级 | 定位 | 篇幅 | 要求 |766| 层级 | 定位 | 篇幅 | 要求 |
767|------|------|------|------|767|------|------|------|------|
768-| **Minimal** | 最小可运行示例 | <30行核心代码 | 核函数的代码片段和完整样例链接 |768+| **Minimal** | 最小可运行示例 | <30行核心代码 | 核函数(Kernel)的代码片段和完整样例链接 |
769-| **Standard** | 典型用法示例 | 50-150行 | 包含核函数定义和调用的代码片段 |769+| **Standard** | 典型用法示例 | 50-150行 | 包含核函数(Kernel)定义和调用的代码片段 |
770 770 
771**各文档的具体要求**771**各文档的具体要求**
772 772