已合并
【9.1.0】【docs】【example】rename legacy api in docs #4049
Chen Ning创建于 7月6日
【9.1.0】【docs】【example】rename legacy api in docs #4049
已合并
共 23 个文件变更+85-90
| @@ -141,7 +141,7 @@ template <typename T> struct is_tensorTrait | |||
| 141 | </tr> | 141 | </tr> |
| 142 | <tr id="row2480185119548"><td class="cellrowborder" valign="top" width="36.69%" headers="mcps1.2.3.1.1 "><p id="p1748015518541"><a name="p1748015518541"></a><a name="p1748015518541"></a>基础API>矢量计算>归约计算</p> | 142 | <tr id="row2480185119548"><td class="cellrowborder" valign="top" width="36.69%" headers="mcps1.2.3.1.1 "><p id="p1748015518541"><a name="p1748015518541"></a><a name="p1748015518541"></a>基础API>矢量计算>归约计算</p> |
| 143 | </td> | 143 | </td> |
| 144 | - <td class="cellrowborder" valign="top" width="63.31%" headers="mcps1.2.3.1.2 "><p id="p948010513543"><a name="p948010513543"></a><a name="p948010513543"></a>ReduceMax、BlockReduceMax、WholeReduceMax、ReduceMin、BlockReduceMin、WholeReduceMin、ReduceSum、BlockReduceSum、WholeReduceSum、RepeatReduceSum、PairReduceSum</p> | 144 | + <td class="cellrowborder" valign="top" width="63.31%" headers="mcps1.2.3.1.2 "><p id="p948010513543"><a name="p948010513543"></a><a name="p948010513543"></a>ReduceMax、ReduceMin、ReduceSum、ReduceDataBlock、ReduceRepeat、ReducePairElem</p> |
| 145 | </td> | 145 | </td> |
| 146 | </tr> | 146 | </tr> |
| 147 | <tr id="row19583512577"><td class="cellrowborder" valign="top" width="36.69%" headers="mcps1.2.3.1.1 "><p id="p45841411577"><a name="p45841411577"></a><a name="p45841411577"></a>基础API>矢量计算>数据转换</p> | 147 | <tr id="row19583512577"><td class="cellrowborder" valign="top" width="36.69%" headers="mcps1.2.3.1.1 "><p id="p45841411577"><a name="p45841411577"></a><a name="p45841411577"></a>基础API>矢量计算>数据转换</p> |
| @@ -39,4 +39,4 @@ struct UnaryRepeatParams { | |||
| 39 | }; | 39 | }; |
| 40 | ``` | 40 | ``` |
| 41 | 41 | ||
| 42 | -其中,blockNumber,repeatStrideMode,strideSizeMode为保留参数,用户无需关心,使用默认值即可。halfBlock表示CastDeq指令的结果写入对应UB的上半(halfBlock = true)还是下半(halfBlock = false)部分。用户需要自行定义DataBlock Stride参数,包含dstBlkStride,srcBlkStride,以及Repeat Stride参数,包含dstRepStride,srcRepStride。 | 42 | +其中,blockNumber,repeatStrideMode,strideSizeMode为保留参数,用户无需关心,使用默认值即可。halfBlock表示CastDequant指令的结果写入对应UB的上半(halfBlock = true)还是下半(halfBlock = false)部分。用户需要自行定义DataBlock Stride参数,包含dstBlkStride,srcBlkStride,以及Repeat Stride参数,包含dstRepStride,srcRepStride。 |
| @@ -1,3 +1,3 @@ | |||
| 1 | version https://git-lfs.github.com/spec/v1 | 1 | version https://git-lfs.github.com/spec/v1 |
| 2 | -oid sha256:ed494cb0d590c37837817d926d1ef8d989ec69ea7d00c5c03f3dcc865b60b2a8 | 2 | +oid sha256:c750930a6259937d0eacf71528965d0390c10793b64a56b241136c7b9adb7fe5 |
| 3 | -size 11155 | 3 | +size 10774 |
| @@ -9,7 +9,7 @@ | |||
| 9 | | ScalarGetSFFValue | [GetSFFValue](../SIMD-API/基础API/标量计算/GetSFFValue.md) | 无 | | 9 | | ScalarGetSFFValue | [GetSFFValue](../SIMD-API/基础API/标量计算/GetSFFValue.md) | 无 | |
| 10 | | ScalarCast | [Cast(float转half、int32_t)](../SIMD-API/基础API/标量计算/Cast(float转half-int32_t).md) | 无 | | 10 | | ScalarCast | [Cast(float转half、int32_t)](../SIMD-API/基础API/标量计算/Cast(float转half-int32_t).md) | 无 | |
| 11 | | ToBfloat16 | [Cast(float转bfloat16_t)](../SIMD-API/基础API/标量计算/Cast(float转bfloat16_t).md) | 无 | | 11 | | ToBfloat16 | [Cast(float转bfloat16_t)](../SIMD-API/基础API/标量计算/Cast(float转bfloat16_t).md) | 无 | |
| 12 | -| ToFloat | [Cast(多类型转float)](../SIMD-API/基础API/标量计算/Cast(多类型转float).md) | 其中一个重载版本的返回值类型由float改为模板U, U = float | | 12 | +| ToFloat | [Cast(多类型转float)](../SIMD-API/基础API/标量计算/Cast(多类型转float).md) | 其中一个重载版本的返回值类型由float改为模板U, `U = float`。 | |
| 13 | | FusedMulAddRelu | [MulAddRelu](../SIMD-API/基础API/Memory矢量计算/复合计算/MulAddRelu.md) | 无 | | 13 | | FusedMulAddRelu | [MulAddRelu](../SIMD-API/基础API/Memory矢量计算/复合计算/MulAddRelu.md) | 无 | |
| 14 | | CastDeq | [CastDequant](../SIMD-API/基础API/Memory矢量计算/复合计算/CastDequant.md) | 无 | | 14 | | CastDeq | [CastDequant](../SIMD-API/基础API/Memory矢量计算/复合计算/CastDequant.md) | 无 | |
| 15 | | CompareScalar | [Compares](../SIMD-API/基础API/Memory矢量计算/比较与选择/Compares.md) | 无 | | 15 | | CompareScalar | [Compares](../SIMD-API/基础API/Memory矢量计算/比较与选择/Compares.md) | 无 | |
| @@ -17,16 +17,16 @@ | |||
| 17 | | GetReduceMaxMinCount | [GetReduceRepeatMaxMinSpr](../SIMD-API/基础API/Memory矢量计算/归约计算/寄存器辅助接口/GetReduceRepeatMaxMinSpr(ISASI).md) | 无 | | 17 | | GetReduceMaxMinCount | [GetReduceRepeatMaxMinSpr](../SIMD-API/基础API/Memory矢量计算/归约计算/寄存器辅助接口/GetReduceRepeatMaxMinSpr(ISASI).md) | 无 | |
| 18 | | SetAtomicNone | [DisableDmaAtomic](../SIMD-API/基础API/原子操作/DisableDmaAtomic.md) | 无 | | 18 | | SetAtomicNone | [DisableDmaAtomic](../SIMD-API/基础API/原子操作/DisableDmaAtomic.md) | 无 | |
| 19 | | InitConstValue | [Fill](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算的搬入/辅助配置接口/Fill.md) | 无 | | 19 | | InitConstValue | [Fill](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算的搬入/辅助配置接口/Fill.md) | 无 | |
| 20 | -| SetMMLayoutTransform | [SetMMRowMajor](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算/SetMMRowMajor.md)/[SetMMColumnMajor](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算/SetMMRowMajor.md) | SetMMLayoutTransform(true)对应SetMMRowMajor()。SetMMLayoutTransform(false)对应SetMMColumnMajor()。 | | 20 | +| SetMMLayoutTransform | [SetMMRowMajor](../SIMD-API/基础API/矩阵计算(ISASI)/Mmad计算/寄存器配置说明/SetMMColumnMajor-SetMMRowMajor.md)/[SetMMColumnMajor](../SIMD-API/基础API/矩阵计算(ISASI)/Mmad计算/寄存器配置说明/SetMMColumnMajor-SetMMRowMajor.md) | SetMMLayoutTransform(true)对应SetMMRowMajor()。<br>SetMMLayoutTransform(false)对应SetMMColumnMajor()。 | |
| 21 | -| SetHF32Mode | [SetHF32Mode](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算/SetHF32Mode.md) | 接口名不变,参数类型由bool修改为枚举HF32Mode。 | | 21 | +| SetHF32Mode | [SetHF32Mode](../SIMD-API/基础API/矩阵计算(ISASI)/Mmad计算/寄存器配置说明/SetHF32Mode.md) | 接口名不变,参数类型由bool修改为枚举HF32Mode。 | |
| 22 | -| SetHF32TransMode | [SetHF32TransMode](../SIMD-API/基础API/矩阵计算(ISASI)/矩阵计算/SetHF32TransMode.md) | 接口名不变,参数类型由bool修改为枚举HF32TransMode。 | | 22 | +| SetHF32TransMode | [SetHF32TransMode](../SIMD-API/基础API/矩阵计算(ISASI)/Mmad计算/寄存器配置说明/SetHF32TransMode.md) | 接口名不变,参数类型由bool修改为枚举HF32TransMode。 | |
| 23 | | CalcTschBlockDim | [CalcTschNumBlocks](../Utils-API/平台信息获取/PlatformAscendC/CalcTschNumBlocks.md) | 无 | | 23 | | CalcTschBlockDim | [CalcTschNumBlocks](../Utils-API/平台信息获取/PlatformAscendC/CalcTschNumBlocks.md) | 无 | |
| 24 | 24 | ||
| 25 | 以下表格的接口于9.1.0修改,相比于CANN9.0.0及前序版本,部分API命名有变更,具体变更情况请参考以下表格: | 25 | 以下表格的接口于9.1.0修改,相比于CANN9.0.0及前序版本,部分API命名有变更,具体变更情况请参考以下表格: |
| 26 | 26 | ||
| 27 | | 原接口名 | 新接口名 | 备注 | | 27 | | 原接口名 | 新接口名 | 备注 | |
| 28 | |---|---|---| | 28 | |---|---|---| |
| 29 | -| BlockReduceSum / BlockReduceMax / BlockReduceMin | [ReduceDataBlock](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceDataBlock.md) | • 提供统一的DataBlock归约操作接口,通过模板参数区分不同归约操作 <br>• 调整mask与repeatTime的参数顺序 | | 29 | +| BlockReduceSum / BlockReduceMax / BlockReduceMin | [ReduceDataBlock](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceDataBlock.md) | •提供统一的DataBlock归约操作接口,通过模板参数区分不同归约操作。 <br>•调整mask与repeatTime的参数顺序。 | |
| 30 | -| WholeReduceSum / WholeReduceMax / WholeReduceMin | [ReduceRepeat](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceRepeat.md) | 提供统一的Repeat归约操作接口,通过模板参数区分不同归约操作 | | 30 | +| WholeReduceSum / WholeReduceMax / WholeReduceMin | [ReduceRepeat](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceRepeat.md) | 提供统一的Repeat归约操作接口,通过模板参数区分不同归约操作。 | |
| 31 | -| RepeatReduceSum | [ReduceRepeat](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceRepeat.md) | • 提供统一的Repeat归约操作接口,通过模板参数区分不同归约操作 <br>• 调整mask与repeatTime的参数顺序 <br>• 删除无效参数dstBlkStride | | 31 | +| RepeatReduceSum | [ReduceRepeat](../SIMD-API/基础API/Memory矢量计算/归约计算/ReduceRepeat.md) | •提供统一的Repeat归约操作接口,通过模板参数区分不同归约操作。 <br>•调整mask与repeatTime的参数顺序。 <br>•删除无效参数dstBlkStride。 | |
| 32 | -| PairReduceSum | [ReducePairElem](../SIMD-API/基础API/Memory矢量计算/归约计算/ReducePairElem.md) | • 提供统一的Pair元素归约操作接口,通过模板参数区分不同归约操作 <br>• 调整mask与repeatTime的参数顺序 | | 32 | +| PairReduceSum | [ReducePairElem](../SIMD-API/基础API/Memory矢量计算/归约计算/ReducePairElem.md) | •提供统一的Pair元素归约操作接口,通过模板参数区分不同归约操作。 <br>•调整mask与repeatTime的参数顺序。 | |
| @@ -1,3 +1,3 @@ | |||
| 1 | version https://git-lfs.github.com/spec/v1 | 1 | version https://git-lfs.github.com/spec/v1 |
| 2 | -oid sha256:3233a89ac67277e3b9f3ff029aeaaa01b5a7d51b6fb8834ba83c9a7f9b502b3d | 2 | +oid sha256:3f27cadd382e2d3efd0ff53c18ffe4745bc564370ebab41a73b09ac4fc7a151d |
| 3 | -size 25388 | 3 | +size 63018 |
| @@ -1,3 +1,3 @@ | |||
| 1 | version https://git-lfs.github.com/spec/v1 | 1 | version https://git-lfs.github.com/spec/v1 |
| 2 | -oid sha256:7006cf6f5e985d307aa89c606efb4f8f795f03c4b96fbb66190d356dce5b242f | 2 | +oid sha256:fc8ad4d83f0c764c2b1e3289016a7e3bb5a7cb171dac9832bf38181c500ef187 |
| 3 | -size 32362 | 3 | +size 21097 |
| @@ -1,3 +0,0 @@ | |||
| 1 | -version https://git-lfs.github.com/spec/v1 | ||
| 2 | -oid sha256:1d1d939abc2c19a85a40c00eee8f0c4ebca3d130375ca147cffd5fac08114825 | ||
| 3 | -size 86184 | ||
| @@ -8,21 +8,21 @@ | |||
| 8 | 8 | ||
| 9 | ## 二分累加方案和归约类指令方案的对比<a name="section179410573522"></a> | 9 | ## 二分累加方案和归约类指令方案的对比<a name="section179410573522"></a> |
| 10 | 10 | ||
| 11 | -根据单指令性能测试数据(开发者可以自行测试)分析,WholeReduceSum等归约指令的延迟时间约为Add指令的2-5倍。因此,对于连续数据的归约操作,可以采用Add指令和WholeReduceSum指令的组合,以优化整体性能。该方案简称为**二分累加方案**,具体方案说明如下: | 11 | +根据单指令性能测试数据(开发者可以自行测试)分析,ReduceRepeat等归约指令的延迟时间约为Add指令的2-5倍。因此,对于连续数据的归约操作,可以采用Add指令和ReduceRepeat指令的组合,以优化整体性能。该方案简称为**二分累加方案**,具体方案说明如下: |
| 12 | 12 | ||
| 13 | - 二分累加:将数据一分为二,使用Add指令将两部分数据相加;将相加后的结果再次一分为二,继续使用Add指令进行累加,重复此过程。 | 13 | - 二分累加:将数据一分为二,使用Add指令将两部分数据相加;将相加后的结果再次一分为二,继续使用Add指令进行累加,重复此过程。 |
| 14 | -- 当二分累加后的数据量小于等于256Byte(一条指令一个Repeat的数据操作量),使用WholeReduceSum指令,一次执行得到归约结果。 | 14 | +- 当二分累加后的数据量小于等于256Byte(一条指令一个Repeat的数据操作量),使用ReduceRepeat指令,一次执行得到归约结果。 |
| 15 | 15 | ||
| 16 | 假设输入数据的数据类型为float,shape为\(5, 256\),下图展示了一行数据的执行过程: | 16 | 假设输入数据的数据类型为float,shape为\(5, 256\),下图展示了一行数据的执行过程: |
| 17 | 17 | ||
| 18 | **图1** 二分累加方案示意图<a name="fig181871717152010"></a> | 18 | **图1** 二分累加方案示意图<a name="fig181871717152010"></a> |
| 19 | - | 19 | + |
| 20 | 20 | ||
| 21 | 将以上过程,针对每一行,各自执行,得到最终归约结果,即shape为\(m, k\)的数据,归约完成后,shape为\(m, 1\)。 | 21 | 将以上过程,针对每一行,各自执行,得到最终归约结果,即shape为\(m, k\)的数据,归约完成后,shape为\(m, 1\)。 |
| 22 | 22 | ||
| 23 | -由于ReduceSum接口是由多种指令组合实现,通常来说,数据量较大,循环次数较多的场景,二分累加方案性能 \> WholeReduceSum单指令操作性能 \> ReduceSum接口性能。而小数据量或者特殊shape下的场景,需要拆分开来,依据指令执行时间和指令执行数目等条件,具体问题具体分析。 | 23 | +由于ReduceSum接口是由多种指令组合实现,通常来说,数据量较大,循环次数较多的场景,二分累加方案性能 \> ReduceRepeat单指令操作性能 \> ReduceSum接口性能。而小数据量或者特殊shape下的场景,需要拆分开来,依据指令执行时间和指令执行数目等条件,具体问题具体分析。 |
| 24 | 24 | ||
| 25 | -下文给出了二分累加方案和归约类指令方案的核心代码片段和性能数据对比。完整样例请参考[ReduceCustom](https://gitcode.com/cann/asc-devkit/blob/9.1.0/examples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce)。 | 25 | +下文给出了二分累加方案和归约类指令方案的核心代码片段和性能数据对比。完整样例请参考[ReduceCustom](https://gitcode.com/cann/asc-devkit/blob/9.1.0/examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce)。 |
| 26 | 26 | ||
| 27 | 【性能数据】 | 27 | 【性能数据】 |
| 28 | 28 | ||
| @@ -31,7 +31,7 @@ | |||
| 31 | <a name="table1240852315316"></a> | 31 | <a name="table1240852315316"></a> |
| 32 | <table><thead align="left"><tr id="row140811238537"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p12319202885319"><a name="p12319202885319"></a><a name="p12319202885319"></a>二分累加方案</p> | 32 | <table><thead align="left"><tr id="row140811238537"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p12319202885319"><a name="p12319202885319"></a><a name="p12319202885319"></a>二分累加方案</p> |
| 33 | </th> | 33 | </th> |
| 34 | -<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p1788511331538"><a name="p1788511331538"></a><a name="p1788511331538"></a>WholeReduceSum单指令操作</p> | 34 | +<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p1788511331538"><a name="p1788511331538"></a><a name="p1788511331538"></a>ReduceRepeat单指令操作</p> |
| 35 | </th> | 35 | </th> |
| 36 | </tr> | 36 | </tr> |
| 37 | </thead> | 37 | </thead> |
| @@ -70,7 +70,7 @@ __aicore__ inline void BinaryReduceSumImpl(const AscendC::LocalTensor<float>& ds | |||
| 70 | AscendC::Add<float, false>(dstTmp, dstTmp, remainingTensor, AscendC::MASK_PLACEHOLDER, 1, binaryParams); | 70 | AscendC::Add<float, false>(dstTmp, dstTmp, remainingTensor, AscendC::MASK_PLACEHOLDER, 1, binaryParams); |
| 71 | } | 71 | } |
| 72 | AscendC::SetVectorMask<uint8_t, AscendC::MaskMode::COUNTER>(0, totalNum); | 72 | AscendC::SetVectorMask<uint8_t, AscendC::MaskMode::COUNTER>(0, totalNum); |
| 73 | - AscendC::WholeReduceSum<float, false>(dstTmp, srcTmp, AscendC::MASK_PLACEHOLDER, 1, DEFAULT_BLK_STRIDE, | 73 | + AscendC::ReduceRepeat<AscendC::ReduceType::SUM, float, float, false>(dstTmp, srcTmp, AscendC::MASK_PLACEHOLDER, 1, DEFAULT_BLK_STRIDE, |
| 74 | DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 74 | DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 75 | } | 75 | } |
| 76 | AscendC::ResetMask(); | 76 | AscendC::ResetMask(); |
| @@ -78,10 +78,10 @@ __aicore__ inline void BinaryReduceSumImpl(const AscendC::LocalTensor<float>& ds | |||
| 78 | } | 78 | } |
| 79 | ``` | 79 | ``` |
| 80 | 80 | ||
| 81 | -【WholeReduceSum单指令操作】 | 81 | +【ReduceRepeat单指令操作】 |
| 82 | 82 | ||
| 83 | ``` | 83 | ``` |
| 84 | -__aicore__ inline void WholeReduceSumImpl(const AscendC::LocalTensor<float>& dst, const AscendC::LocalTensor<float>& src, const uint32_t bsLength, const uint32_t hLength) | 84 | +__aicore__ inline void ReduceRepeatSumImpl(const AscendC::LocalTensor<float>& dst, const AscendC::LocalTensor<float>& src, const uint32_t bsLength, const uint32_t hLength) |
| 85 | { | 85 | { |
| 86 | // src为二维数据,shape为(bsLength, hLength),dst的shape为(bsLength,1) | 86 | // src为二维数据,shape为(bsLength, hLength),dst的shape为(bsLength,1) |
| 87 | AscendC::SetMaskCount(); | 87 | AscendC::SetMaskCount(); |
| @@ -91,7 +91,7 @@ __aicore__ inline void WholeReduceSumImpl(const AscendC::LocalTensor<float>& dst | |||
| 91 | AscendC::LocalTensor<float> dstTmp = dst[i * hLength]; | 91 | AscendC::LocalTensor<float> dstTmp = dst[i * hLength]; |
| 92 | while (totalNum > 1) { | 92 | while (totalNum > 1) { |
| 93 | AscendC::SetVectorMask<uint8_t, AscendC::MaskMode::COUNTER>(0, totalNum); | 93 | AscendC::SetVectorMask<uint8_t, AscendC::MaskMode::COUNTER>(0, totalNum); |
| 94 | - AscendC::WholeReduceSum<float, false>(dstTmp, srcTmp, AscendC::MASK_PLACEHOLDER, 1, DEFAULT_BLK_STRIDE, | 94 | + AscendC::ReduceRepeat<AscendC::ReduceType::SUM, float, float, false>(dstTmp, srcTmp, AscendC::MASK_PLACEHOLDER, 1, DEFAULT_BLK_STRIDE, |
| 95 | DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 95 | DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 96 | totalNum = AscendC::DivCeil(totalNum, ONE_REPEAT_FLOAT_SIZE); | 96 | totalNum = AscendC::DivCeil(totalNum, ONE_REPEAT_FLOAT_SIZE); |
| 97 | srcTmp = dstTmp; | 97 | srcTmp = dstTmp; |
| @@ -102,32 +102,32 @@ __aicore__ inline void WholeReduceSumImpl(const AscendC::LocalTensor<float>& dst | |||
| 102 | } | 102 | } |
| 103 | ``` | 103 | ``` |
| 104 | 104 | ||
| 105 | -## BlockReduceSum和WholeReduceSum归约方案对比<a name="section18620646762"></a> | 105 | +## ReduceDataBlock和ReduceRepeat归约方案对比<a name="section18620646762"></a> |
| 106 | 106 | ||
| 107 | -进一步测试分析可知,单指令BlockReduceSum的执行效率优于WholeReduceSum,因此,根据不同的shape,通过不同的指令组合,可以达到更佳的执行性能。 | 107 | +进一步测试分析可知,单指令ReduceDataBlock的执行效率优于ReduceRepeat,因此,根据不同的shape,通过不同的指令组合,可以达到更佳的执行性能。 |
| 108 | 108 | ||
| 109 | 例如数据类型为float,shape大小为256的数据,可以通过如下三种方式得到归约结果: | 109 | 例如数据类型为float,shape大小为256的数据,可以通过如下三种方式得到归约结果: |
| 110 | 110 | ||
| 111 | -- 使用两次WholeReduceSum; | 111 | +- 使用两次ReduceRepeat; |
| 112 | -- 使用三次BlockReduceSum; | 112 | +- 使用三次ReduceDataBlock; |
| 113 | -- 一次BlockReduceSum操作加一次WholeReduceSum操作。 | 113 | +- 一次ReduceDataBlock操作加一次ReduceRepeat操作。 |
| 114 | 114 | ||
| 115 | -通过分析单指令性能数据(开发者可以自行测试)可知:一次BlockReduceSum操作加一次WholeReduceSum操作性能优于两次WholeReduceSum,同时也优于三次BlockReduceSum的方案。 | 115 | +通过分析单指令性能数据(开发者可以自行测试)可知:一次ReduceDataBlock操作加一次ReduceRepeat操作性能优于两次ReduceRepeat,同时也优于三次ReduceDataBlock的方案。 |
| 116 | 116 | ||
| 117 | -下文给出了上面三种方式的核心代码片段和性能数据对比。完整样例请参考[ReduceCustom](https://gitcode.com/cann/asc-devkit/blob/9.1.0/examples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce)。 | 117 | +下文给出了上面三种方式的核心代码片段和性能数据对比。完整样例请参考[ReduceCustom](https://gitcode.com/cann/asc-devkit/blob/9.1.0/examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce)。 |
| 118 | 118 | ||
| 119 | 【性能数据】 | 119 | 【性能数据】 |
| 120 | 120 | ||
| 121 | 输入shape为256,数据类型为float。如下示例的性能数据如下: | 121 | 输入shape为256,数据类型为float。如下示例的性能数据如下: |
| 122 | 122 | ||
| 123 | -**表1** 两次WholeReduceSum、三次BlockReduceSum、一次BlockReduceSum加一次WholeReduceSum,三种归约操作的性能数据(循环100次的时间总和) | 123 | +**表1** 两次ReduceRepeat、三次ReduceDataBlock、一次ReduceDataBlock加一次ReduceRepeat,三种归约操作的性能数据(循环100次的时间总和) |
| 124 | 124 | ||
| 125 | <a name="table174575114592"></a> | 125 | <a name="table174575114592"></a> |
| 126 | -<table><thead align="left"><tr id="row3758185125915"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.1"><p id="p57581151175915"><a name="p57581151175915"></a><a name="p57581151175915"></a>两次WholeReduceSum</p> | 126 | +<table><thead align="left"><tr id="row3758185125915"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.1"><p id="p57581151175915"><a name="p57581151175915"></a><a name="p57581151175915"></a>两次ReduceRepeat</p> |
| 127 | </th> | 127 | </th> |
| 128 | -<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.2"><p id="p1960391014012"><a name="p1960391014012"></a><a name="p1960391014012"></a>三次BlockReduceSum</p> | 128 | +<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.2"><p id="p1960391014012"><a name="p1960391014012"></a><a name="p1960391014012"></a>三次ReduceDataBlock</p> |
| 129 | </th> | 129 | </th> |
| 130 | -<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.3"><p id="p2758451105915"><a name="p2758451105915"></a><a name="p2758451105915"></a>一次BlockReduceSum加一次WholeReduceSum</p> | 130 | +<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.3"><p id="p2758451105915"><a name="p2758451105915"></a><a name="p2758451105915"></a>一次ReduceDataBlock加一次ReduceRepeat</p> |
| 131 | </th> | 131 | </th> |
| 132 | </tr> | 132 | </tr> |
| 133 | </thead> | 133 | </thead> |
| @@ -141,7 +141,7 @@ __aicore__ inline void WholeReduceSumImpl(const AscendC::LocalTensor<float>& dst | |||
| 141 | </tbody> | 141 | </tbody> |
| 142 | </table> | 142 | </table> |
| 143 | 143 | ||
| 144 | -【两次WholeReduceSum操作】 | 144 | +【两次ReduceRepeat操作】 |
| 145 | 145 | ||
| 146 | ``` | 146 | ``` |
| 147 | ... | 147 | ... |
| @@ -150,18 +150,18 @@ AscendC::LocalTensor<DTYPE> tempTensor1 = calcBuf.Get<DTYPE>(); | |||
| 150 | const uint32_t repeatNum = (totalLength * sizeof(DTYPE) + REP_LEN - 1) / REP_LEN; | 150 | const uint32_t repeatNum = (totalLength * sizeof(DTYPE) + REP_LEN - 1) / REP_LEN; |
| 151 | AscendC::SetMaskCount(); | 151 | AscendC::SetMaskCount(); |
| 152 | AscendC::SetVectorMask<DTYPE>(0, totalLength); | 152 | AscendC::SetVectorMask<DTYPE>(0, totalLength); |
| 153 | -AscendC::WholeReduceSum<DTYPE, false>(tempTensor1, xLocal, 1, AscendC::MASK_PLACEHOLDER, | 153 | +AscendC::ReduceRepeat<AscendC::ReduceType::SUM, DTYPE, DTYPE, false>(tempTensor1, xLocal, AscendC::MASK_PLACEHOLDER, 1, |
| 154 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 154 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 155 | AscendC::PipeBarrier<PIPE_V>(); | 155 | AscendC::PipeBarrier<PIPE_V>(); |
| 156 | AscendC::SetVectorMask<DTYPE>(0, repeatNum); | 156 | AscendC::SetVectorMask<DTYPE>(0, repeatNum); |
| 157 | -AscendC::WholeReduceSum<DTYPE, false>(zLocal, tempTensor1, 1, AscendC::MASK_PLACEHOLDER, | 157 | +AscendC::ReduceRepeat<AscendC::ReduceType::SUM, DTYPE, DTYPE, false>(zLocal, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, |
| 158 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 158 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 159 | AscendC::PipeBarrier<PIPE_V>(); | 159 | AscendC::PipeBarrier<PIPE_V>(); |
| 160 | AscendC::SetMaskNorm(); | 160 | AscendC::SetMaskNorm(); |
| 161 | ... | 161 | ... |
| 162 | ``` | 162 | ``` |
| 163 | 163 | ||
| 164 | -【三次BlockReduceSum操作】 | 164 | +【三次ReduceDataBlock操作】 |
| 165 | 165 | ||
| 166 | ``` | 166 | ``` |
| 167 | ... | 167 | ... |
| @@ -172,22 +172,22 @@ const uint32_t blockNum0 = (totalLength + c0Count - 1) / c0Count; | |||
| 172 | const uint32_t blockNum1 = (blockNum0 + c0Count - 1) / c0Count; | 172 | const uint32_t blockNum1 = (blockNum0 + c0Count - 1) / c0Count; |
| 173 | AscendC::SetMaskCount(); | 173 | AscendC::SetMaskCount(); |
| 174 | AscendC::SetVectorMask<DTYPE_X>(0, totalLength); | 174 | AscendC::SetVectorMask<DTYPE_X>(0, totalLength); |
| 175 | -AscendC::BlockReduceSum<DTYPE_X, false>(tempTensor1, xLocal, AscendC::MASK_PLACEHOLDER, 1, | 175 | +AscendC::ReduceDataBlock<AscendC::ReduceType::SUM, DTYPE_X, DTYPE_X, false>(tempTensor1, xLocal, AscendC::MASK_PLACEHOLDER, 1, |
| 176 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 176 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 177 | AscendC::PipeBarrier<PIPE_V>(); | 177 | AscendC::PipeBarrier<PIPE_V>(); |
| 178 | AscendC::SetVectorMask<DTYPE_X>(0, blockNum0); | 178 | AscendC::SetVectorMask<DTYPE_X>(0, blockNum0); |
| 179 | -AscendC::BlockReduceSum<DTYPE_X, false>(tempTensor1, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, | 179 | +AscendC::ReduceDataBlock<AscendC::ReduceType::SUM, DTYPE_X, DTYPE_X, false>(tempTensor1, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, |
| 180 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 180 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 181 | AscendC::PipeBarrier<PIPE_V>(); | 181 | AscendC::PipeBarrier<PIPE_V>(); |
| 182 | AscendC::SetVectorMask<DTYPE_X>(0, blockNum1); | 182 | AscendC::SetVectorMask<DTYPE_X>(0, blockNum1); |
| 183 | -AscendC::BlockReduceSum<DTYPE_X, false>(zLocal, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, | 183 | +AscendC::ReduceDataBlock<AscendC::ReduceType::SUM, DTYPE_X, DTYPE_X, false>(zLocal, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, |
| 184 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 184 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 185 | AscendC::PipeBarrier<PIPE_V>(); | 185 | AscendC::PipeBarrier<PIPE_V>(); |
| 186 | AscendC::SetMaskNorm(); | 186 | AscendC::SetMaskNorm(); |
| 187 | ... | 187 | ... |
| 188 | ``` | 188 | ``` |
| 189 | 189 | ||
| 190 | -【BlockReduceSum + WholeReduceSum操作】 | 190 | +【ReduceDataBlock + ReduceRepeat操作】 |
| 191 | 191 | ||
| 192 | ``` | 192 | ``` |
| 193 | ... | 193 | ... |
| @@ -197,11 +197,11 @@ constexpr uint32_t c0Count = BLK_LEN / sizeof(DTYPE); | |||
| 197 | const uint32_t blockNum0 = (totalLength + c0Count - 1) / c0Count; | 197 | const uint32_t blockNum0 = (totalLength + c0Count - 1) / c0Count; |
| 198 | AscendC::SetMaskCount(); | 198 | AscendC::SetMaskCount(); |
| 199 | AscendC::SetVectorMask<DTYPE>(0, totalLength); | 199 | AscendC::SetVectorMask<DTYPE>(0, totalLength); |
| 200 | -AscendC::BlockReduceSum<DTYPE, false>(tempTensor1, xLocal, 1, AscendC::MASK_PLACEHOLDER, | 200 | +AscendC::ReduceDataBlock<AscendC::ReduceType::SUM, DTYPE, DTYPE, false>(tempTensor1, xLocal, AscendC::MASK_PLACEHOLDER, 1, |
| 201 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 201 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 202 | AscendC::PipeBarrier<PIPE_V>(); | 202 | AscendC::PipeBarrier<PIPE_V>(); |
| 203 | AscendC::SetVectorMask<DTYPE>(0, blockNum0); | 203 | AscendC::SetVectorMask<DTYPE>(0, blockNum0); |
| 204 | -AscendC::WholeReduceSum<DTYPE, false>(zLocal, tempTensor1, 1, AscendC::MASK_PLACEHOLDER, | 204 | +AscendC::ReduceRepeat<AscendC::ReduceType::SUM, DTYPE, DTYPE, false>(zLocal, tempTensor1, AscendC::MASK_PLACEHOLDER, 1, |
| 205 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); | 205 | DEFAULT_BLK_STRIDE, DEFAULT_BLK_STRIDE, DEFAULT_REP_STRIDE); |
| 206 | AscendC::PipeBarrier<PIPE_V>(); | 206 | AscendC::PipeBarrier<PIPE_V>(); |
| 207 | AscendC::SetMaskNorm(); | 207 | AscendC::SetMaskNorm(); |
| @@ -3,25 +3,23 @@ | |||
| 3 | 归约指令将数据集合简化为单一值或者更小的集合。按照归约操作的数据范围的不同,归约指令分为以下几种,可参考[归约指令示意图](#zh-cn_topic_0000002267504648_fig16735034112710): | 3 | 归约指令将数据集合简化为单一值或者更小的集合。按照归约操作的数据范围的不同,归约指令分为以下几种,可参考[归约指令示意图](#zh-cn_topic_0000002267504648_fig16735034112710): |
Y | |||
| 4 | 4 | ||
| 5 | - ReduceMax/ReduceMin/ReduceSum:对所有的输入数据做归约操作,得到最大值和最大值索引/最小值和最小值索引/数据总和。 | 5 | - ReduceMax/ReduceMin/ReduceSum:对所有的输入数据做归约操作,得到最大值和最大值索引/最小值和最小值索引/数据总和。 |
| 6 | -- WholeReduceMax/WholeReduceMin/WholeReduceSum:对每个repeat内的输入数据做归约操作,得到每个repeat内的最大值和最大值索引/最小值和最小值索引/数据总和。返回索引时返回的是repeat内部索引。 | 6 | +- ReduceRepeat:对每个repeat内的输入数据做归约操作,根据模板参数`ReduceType`指定求最大值/最小值/求和,得到每个repeat内的最大值和最大值索引/最小值和最小值索引/数据总和。返回索引时返回的是repeat内部索引。 |
| 7 | -- BlockReduceMax/BlockReduceMin/BlockReduceSum:对每个datablock内的输入数据做归约操作,得到每个datablock内的最大值/最小值/数据总和。 | 7 | +- ReduceDataBlock:对每个DataBlock内的输入数据做归约操作,根据模板参数`ReduceType`指定求最大值/最小值/求和,得到每个DataBlock内的最大值/最小值/数据总和。 |
| 8 | -- PairReduce:相邻两个(奇偶)元素求和,例如(a1, a2, a3, a4, a5, a6...),归约后结果为(a1+a2, a3+a4, a5+a6, ......)。 | 8 | +- ReducePairElem:对相邻两个(奇偶)元素进行归约操作,当前仅支持根据模板参数`ReduceType::SUM`求和,例如(a1, a2, a3, a4, a5, a6...),归约后结果为(a1+a2, a3+a4, a5+a6, ......)。 |
| 9 | 9 | ||
| 10 | **图1** 归约指令示意图<a name="zh-cn_topic_0000002267504648_fig16735034112710"></a> | 10 | **图1** 归约指令示意图<a name="zh-cn_topic_0000002267504648_fig16735034112710"></a> |
| 11 | - | 11 | + |
| 12 | 12 | ||
| 13 | 针对归约指令,和其他的基础API一样也提供了**tensor高维切分计算**接口,可充分发挥硬件优势,支持开发者控制指令的**迭代执行**和操作数的**地址间隔**,功能更加灵活。但具体参数的单位和约束与[基础API](../接口分类说明/高维切分API.md)略有不同,下文将对这些差异点进行介绍。 | 13 | 针对归约指令,和其他的基础API一样也提供了**tensor高维切分计算**接口,可充分发挥硬件优势,支持开发者控制指令的**迭代执行**和操作数的**地址间隔**,功能更加灵活。但具体参数的单位和约束与[基础API](../接口分类说明/高维切分API.md)略有不同,下文将对这些差异点进行介绍。 |
| 14 | 14 | ||
| 15 | -- repeatTime:迭代次数,开发者通过repeatTime来配置迭代次数,从而控制指令的多次迭代执行。 | ||
| 16 | - - ReduceMax/ReduceMin/ReduceSum对于repeatTime超过255的情况,在API内部进行了处理,所以repeatTime支持更大的取值范围,保证不超过int32\_t最大值的范围即可。 | ||
| 17 | - - WholeReduceMax/WholeReduceMin/WholeReduceSum/BlockReduceMax/BlockReduceMin/BlockReduceSum/PairReduce和其他基础API一样,repeatTime要求不超过255。 | ||
| 18 | - | ||
| 19 | - **mask**:用于控制每次迭代内参与计算的元素,mask参数的使用方法和基础API通用的使用方法一致。 | 15 | - **mask**:用于控制每次迭代内参与计算的元素,mask参数的使用方法和基础API通用的使用方法一致。 |
| 16 | +- **repeatTime**:迭代次数,开发者通过repeatTime来配置迭代次数,从而控制指令的多次迭代执行。 | ||
| 17 | + - ReduceMax/ReduceMin/ReduceSum对于repeatTime超过255的情况,在API内部进行了处理,所以repeatTime支持更大的取值范围,保证不超过int32\_t最大值的范围即可。 | ||
| 18 | + - ReduceRepeat/ReduceDataBlock/ReducePairElem和其他基础API一样,repeatTime要求不超过255。 | ||
| 20 | - **repeatStride**:表示相邻迭代间的地址步长。 | 19 | - **repeatStride**:表示相邻迭代间的地址步长。 |
| 21 | - ReduceMax/ReduceMin/ReduceSum指令的目的操作数会归约成一个最大值/最小值/总和,所以其目的操作数不支持配置repeatStride。仅源操作数支持repeatStride,其含义、单位(datablock)和基础API通用说明一致。 | 20 | - ReduceMax/ReduceMin/ReduceSum指令的目的操作数会归约成一个最大值/最小值/总和,所以其目的操作数不支持配置repeatStride。仅源操作数支持repeatStride,其含义、单位(datablock)和基础API通用说明一致。 |
| 22 | - - WholeReduceMax/WholeReduceMin/WholeReduceSum/BlockReduceMax/BlockReduceMin/BlockReduceSum/PairReduce源操作数和目的操作数都支持配置repeatStride,源操作数repeatStride的含义、单位(datablock)和基础API通用说明一致。目的操作数repeatStride的含义、单位和基础API通用说明有差异,因为归约后,目的操作数的长度会变短,比如WholeReduceSum归约后每个repeat会合并为一个值,所以迭代之间的间隔不能再使用一个datablock为单位,而以一个repeat归约后的长度为单位。 | 21 | + - ReduceRepeat/ReduceDataBlock/ReducePairElem源操作数和目的操作数都支持配置repeatStride,源操作数repeatStride的含义、单位(DataBlock)和基础API通用说明一致。目的操作数repeatStride的含义、单位和基础API通用说明有差异,因为归约后,目的操作数的长度会变短,比如ReduceRepeat归约后每个repeat会合并为一个值,所以迭代之间的间隔不能再使用一个DataBlock为单位,而以一个repeat归约后的长度为单位。 |
| 23 | 22 | ||
| 24 | - **dataBlockStride**:表示单次迭代内datablock的地址步长。 | 23 | - **dataBlockStride**:表示单次迭代内datablock的地址步长。 |
| 25 | - ReduceMax/ReduceMin/ReduceSum指令的目的操作数会归约成一个最大值/最小值/总和,所以其目的操作数不支持配置dataBlockStride。源操作数也不支持dataBlockStride。 | 24 | - ReduceMax/ReduceMin/ReduceSum指令的目的操作数会归约成一个最大值/最小值/总和,所以其目的操作数不支持配置dataBlockStride。源操作数也不支持dataBlockStride。 |
| 26 | - - WholeReduceMax/WholeReduceMin/WholeReduceSum/BlockReduceMax/BlockReduceMin/BlockReduceSum/PairReduce源操作数支持配置dataBlockStride,源操作数dataBlockStride的含义、单位(datablock)和基础API通用说明一致。目的操作数不支持dataBlockStride,因为归约后,目的操作数的长度会变短,比如WholeReduceSum归约后每个repeat会合并为一个值,不再有迭代内datablock和地址间隔的概念。 | 25 | + - ReduceRepeat/ReduceDataBlock/ReducePairElem源操作数支持配置dataBlockStride,源操作数dataBlockStride的含义、单位(DataBlock)和基础API通用说明一致。目的操作数不支持dataBlockStride,因为归约后,目的操作数的长度会变短,比如ReduceRepeat归约后每个repeat会合并为一个值,不再有迭代内DataBlock和地址间隔的概念。 |
| 27 | - | ||
| @@ -194,7 +194,7 @@ | |||
| 194 | </thead> | 194 | </thead> |
| 195 | <tbody><tr id="row146691342124318"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p1669154234318"><a name="p1669154234318"></a><a name="p1669154234318"></a>基础API > 标量计算</p> | 195 | <tbody><tr id="row146691342124318"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p1669154234318"><a name="p1669154234318"></a><a name="p1669154234318"></a>基础API > 标量计算</p> |
| 196 | </td> | 196 | </td> |
| 197 | -<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p0669164213434"><a name="p0669164213434"></a><a name="p0669164213434"></a>ScalarGetCountOfValue、ScalarCountLeadingZero、ScalarCast、CountBitsCntSameAsSignBit、ScalarGetSFFValue</p> | 197 | +<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p0669164213434"><a name="p0669164213434"></a><a name="p0669164213434"></a>GetBitCount、CountLeadingZero、Cast、CountBitsCntSameAsSignBit、GetSFFValue</p> |
| 198 | </td> | 198 | </td> |
| 199 | </tr> | 199 | </tr> |
| 200 | <tr id="row1966914211437"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p7669174224314"><a name="p7669174224314"></a><a name="p7669174224314"></a>基础API > 矢量计算 > 基础算术</p> | 200 | <tr id="row1966914211437"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p7669174224314"><a name="p7669174224314"></a><a name="p7669174224314"></a>基础API > 矢量计算 > 基础算术</p> |
| @@ -209,12 +209,12 @@ | |||
| 209 | </tr> | 209 | </tr> |
| 210 | <tr id="row46691542124317"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p766994224314"><a name="p766994224314"></a><a name="p766994224314"></a>基础API > 矢量计算 > 复合计算</p> | 210 | <tr id="row46691542124317"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p766994224314"><a name="p766994224314"></a><a name="p766994224314"></a>基础API > 矢量计算 > 复合计算</p> |
| 211 | </td> | 211 | </td> |
| 212 | -<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p1559917570124"><a name="p1559917570124"></a><a name="p1559917570124"></a>Axpy、CastDequant、AddRelu、AddReluCast、AddDeqRelu、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、FusedMulAddRelu</p> | 212 | +<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p1559917570124"><a name="p1559917570124"></a><a name="p1559917570124"></a>Axpy、CastDequant、AddRelu、AddReluCast、AddDeqRelu、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、MulAddRelu</p> |
| 213 | </td> | 213 | </td> |
| 214 | </tr> | 214 | </tr> |
| 215 | <tr id="row176691942154313"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p126691442184311"><a name="p126691442184311"></a><a name="p126691442184311"></a>基础API > 矢量计算 > 比较与选择</p> | 215 | <tr id="row176691942154313"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p126691442184311"><a name="p126691442184311"></a><a name="p126691442184311"></a>基础API > 矢量计算 > 比较与选择</p> |
| 216 | </td> | 216 | </td> |
| 217 | -<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p1670442104314"><a name="p1670442104314"></a><a name="p1670442104314"></a>Compare、Compare(结果存入寄存器)、CompareScalar、GetCmpMask、SetCmpMask、</p> | 217 | +<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p1670442104314"><a name="p1670442104314"></a><a name="p1670442104314"></a>Compare、Compare(结果存入寄存器)、Compares、GetCmpMask、SetCmpMask、</p> |
| 218 | <p id="p367013429431"><a name="p367013429431"></a><a name="p367013429431"></a>Select、GatherMask</p> | 218 | <p id="p367013429431"><a name="p367013429431"></a><a name="p367013429431"></a>Select、GatherMask</p> |
| 219 | </td> | 219 | </td> |
| 220 | </tr> | 220 | </tr> |
| @@ -225,7 +225,7 @@ | |||
| 225 | </tr> | 225 | </tr> |
| 226 | <tr id="row267074213433"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p1167094274316"><a name="p1167094274316"></a><a name="p1167094274316"></a>基础API > 矢量计算 > 归约计算</p> | 226 | <tr id="row267074213433"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p1167094274316"><a name="p1167094274316"></a><a name="p1167094274316"></a>基础API > 矢量计算 > 归约计算</p> |
| 227 | </td> | 227 | </td> |
| 228 | -<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p156703427434"><a name="p156703427434"></a><a name="p156703427434"></a>WholeReduceMax、WholeReduceMin、WholeReduceSum、BlockReduceMax、BlockReduceMin、BlockReduceSum、PairReduceSum、RepeatReduceSum、GetReduceMaxMinCount</p> | 228 | +<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p156703427434"><a name="p156703427434"></a><a name="p156703427434"></a>ReduceRepeat、ReduceDataBlock、ReducePairElem、GetReduceRepeatMaxMinSpr</p> |
| 229 | </td> | 229 | </td> |
| 230 | </tr> | 230 | </tr> |
| 231 | <tr id="row067015420439"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p667094294319"><a name="p667094294319"></a><a name="p667094294319"></a>基础API > 矢量计算 > 数据转换</p> | 231 | <tr id="row067015420439"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p667094294319"><a name="p667094294319"></a><a name="p667094294319"></a>基础API > 矢量计算 > 数据转换</p> |
| @@ -285,7 +285,7 @@ | |||
| 285 | </tr> | 285 | </tr> |
| 286 | <tr id="row13671194254311"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p6671184224317"><a name="p6671184224317"></a><a name="p6671184224317"></a>基础API > 矩阵计算</p> | 286 | <tr id="row13671194254311"><td class="cellrowborder" valign="top" width="30.28%" headers="mcps1.2.3.1.1 "><p id="p6671184224317"><a name="p6671184224317"></a><a name="p6671184224317"></a>基础API > 矩阵计算</p> |
| 287 | </td> | 287 | </td> |
| 288 | -<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p147142311613"><a name="p147142311613"></a><a name="p147142311613"></a>InitConstValue、LoadData、SetAippFunctions、LoadImageToLocal、LoadUnzipIndex、LoadDataUnzip、SetLoadDataBoundary、SetLoadDataPaddingValue、Mmad</p> | 288 | +<td class="cellrowborder" valign="top" width="69.72%" headers="mcps1.2.3.1.2 "><p id="p147142311613"><a name="p147142311613"></a><a name="p147142311613"></a>Fill、LoadData、SetAippFunctions、LoadImageToLocal、LoadUnzipIndex、LoadDataUnzip、SetLoadDataBoundary、SetLoadDataPaddingValue、Mmad</p> |
| 289 | </td> | 289 | </td> |
| 290 | </tr> | 290 | </tr> |
| 291 | </tbody> | 291 | </tbody> |
| @@ -325,7 +325,7 @@ | |||
| 325 | </tr> | 325 | </tr> |
| 326 | <tr id="row1247575318435"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p164751053124316"><a name="p164751053124316"></a><a name="p164751053124316"></a>基础API > 矢量计算 > 复合计算</p> | 326 | <tr id="row1247575318435"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p164751053124316"><a name="p164751053124316"></a><a name="p164751053124316"></a>基础API > 矢量计算 > 复合计算</p> |
| 327 | </td> | 327 | </td> |
| 328 | -<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p1169817233416"><a name="p1169817233416"></a><a name="p1169817233416"></a>Axpy、CastDequant、AddRelu、AddReluCast、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、FusedMulAddRelu</p> | 328 | +<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p1169817233416"><a name="p1169817233416"></a><a name="p1169817233416"></a>Axpy、CastDequant、AddRelu、AddReluCast、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、MulAddRelu</p> |
| 329 | </td> | 329 | </td> |
| 330 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p5475153164312"><a name="p5475153164312"></a><a name="p5475153164312"></a>-</p> | 330 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p5475153164312"><a name="p5475153164312"></a><a name="p5475153164312"></a>-</p> |
| 331 | </td> | 331 | </td> |
| @@ -346,7 +346,7 @@ | |||
| 346 | </tr> | 346 | </tr> |
| 347 | <tr id="row1047545324316"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p14475165364311"><a name="p14475165364311"></a><a name="p14475165364311"></a>基础API > 矢量计算 > 归约计算</p> | 347 | <tr id="row1047545324316"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p14475165364311"><a name="p14475165364311"></a><a name="p14475165364311"></a>基础API > 矢量计算 > 归约计算</p> |
| 348 | </td> | 348 | </td> |
| 349 | -<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p847595312435"><a name="p847595312435"></a><a name="p847595312435"></a>WholeReduceMax、WholeReduceMin、WholeReduceSum、BlockReduceMax、BlockReduceMin、BlockReduceSum、PairReduceSum、RepeatReduceSum、GetReduceRepeatSumSpr、GetReduceRepeatMaxMinSpr</p> | 349 | +<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p847595312435"><a name="p847595312435"></a><a name="p847595312435"></a>ReduceRepeat、ReduceDataBlock、ReducePairElem、GetReduceRepeatSumSpr、GetReduceRepeatMaxMinSpr</p> |
| 350 | </td> | 350 | </td> |
| 351 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p18475115318430"><a name="p18475115318430"></a><a name="p18475115318430"></a>-</p> | 351 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p18475115318430"><a name="p18475115318430"></a><a name="p18475115318430"></a>-</p> |
| 352 | </td> | 352 | </td> |
| @@ -463,7 +463,7 @@ | |||
| 463 | </tr> | 463 | </tr> |
| 464 | <tr id="row7476053114311"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p747710531433"><a name="p747710531433"></a><a name="p747710531433"></a>基础API > 矩阵计算</p> | 464 | <tr id="row7476053114311"><td class="cellrowborder" valign="top" width="29.9%" headers="mcps1.2.4.1.1 "><p id="p747710531433"><a name="p747710531433"></a><a name="p747710531433"></a>基础API > 矩阵计算</p> |
| 465 | </td> | 465 | </td> |
| 466 | -<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p847713536432"><a name="p847713536432"></a><a name="p847713536432"></a>Mmad、MmadWithSparse、SetHF32Mode、SetHF32TransMode、SetMMLayoutTransform、SetFixPipeConfig、SetFixpipeNz2ndFlag、SetFixpipePreQuantFlag、InitConstValue、LoadData、LoadDataWithTranspose、SetAippFunctions、LoadImageToLocal、LoadDataWithSparse、SetFmatrix、SetLoadDataBoundary、SetLoadDataRepeat、SetLoadDataPaddingValue、Fixpipe</p> | 466 | +<td class="cellrowborder" valign="top" width="44.25%" headers="mcps1.2.4.1.2 "><p id="p847713536432"><a name="p847713536432"></a><a name="p847713536432"></a>Mmad、MmadWithSparse、SetHF32Mode、SetHF32TransMode、SetMMRowMajor、SetMMColumnMajor、SetFixPipeConfig、SetFixpipeNz2ndFlag、SetFixpipePreQuantFlag、Fill、LoadData、LoadDataWithTranspose、SetAippFunctions、LoadImageToLocal、LoadDataWithSparse、SetFmatrix、SetLoadDataBoundary、SetLoadDataRepeat、SetLoadDataPaddingValue、Fixpipe</p> |
| 467 | </td> | 467 | </td> |
| 468 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p154771853144319"><a name="p154771853144319"></a><a name="p154771853144319"></a>-</p> | 468 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p154771853144319"><a name="p154771853144319"></a><a name="p154771853144319"></a>-</p> |
| 469 | </td> | 469 | </td> |
| @@ -526,7 +526,7 @@ | |||
| 526 | </tr> | 526 | </tr> |
| 527 | <tr id="row137061481120"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p53695511016"><a name="p53695511016"></a><a name="p53695511016"></a>基础API > 矢量计算 > 复合计算</p> | 527 | <tr id="row137061481120"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p53695511016"><a name="p53695511016"></a><a name="p53695511016"></a>基础API > 矢量计算 > 复合计算</p> |
| 528 | </td> | 528 | </td> |
| 529 | -<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p6361255131014"><a name="p6361255131014"></a><a name="p6361255131014"></a>Axpy、CastDequant、AddRelu、AddReluCast、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、FusedMulAddRelu</p> | 529 | +<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p6361255131014"><a name="p6361255131014"></a><a name="p6361255131014"></a>Axpy、CastDequant、AddRelu、AddReluCast、SubRelu、SubReluCast、MulAddDst、MulCast、FusedMulAdd、MulAddRelu</p> |
| 530 | </td> | 530 | </td> |
| 531 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p153610555105"><a name="p153610555105"></a><a name="p153610555105"></a>-</p> | 531 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p153610555105"><a name="p153610555105"></a><a name="p153610555105"></a>-</p> |
| 532 | </td> | 532 | </td> |
| @@ -547,7 +547,7 @@ | |||
| 547 | </tr> | 547 | </tr> |
| 548 | <tr id="row1570618486213"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p33635571010"><a name="p33635571010"></a><a name="p33635571010"></a>基础API > 矢量计算 > 归约计算</p> | 548 | <tr id="row1570618486213"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p33635571010"><a name="p33635571010"></a><a name="p33635571010"></a>基础API > 矢量计算 > 归约计算</p> |
| 549 | </td> | 549 | </td> |
| 550 | -<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p103612558107"><a name="p103612558107"></a><a name="p103612558107"></a>WholeReduceMax、WholeReduceMin、WholeReduceSum、BlockReduceMax、BlockReduceMin、BlockReduceSum、PairReduceSum、RepeatReduceSum、GetReduceRepeatSumSpr、GetReduceRepeatMaxMinSpr</p> | 550 | +<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p103612558107"><a name="p103612558107"></a><a name="p103612558107"></a>ReduceRepeat、ReduceDataBlock、ReducePairElem、GetReduceRepeatSumSpr、GetReduceRepeatMaxMinSpr</p> |
| 551 | </td> | 551 | </td> |
| 552 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p1736195513103"><a name="p1736195513103"></a><a name="p1736195513103"></a>-</p> | 552 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p1736195513103"><a name="p1736195513103"></a><a name="p1736195513103"></a>-</p> |
| 553 | </td> | 553 | </td> |
| @@ -663,7 +663,7 @@ | |||
| 663 | </tr> | 663 | </tr> |
| 664 | <tr id="row67096482218"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p93875511014"><a name="p93875511014"></a><a name="p93875511014"></a>基础API > 矩阵计算</p> | 664 | <tr id="row67096482218"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p93875511014"><a name="p93875511014"></a><a name="p93875511014"></a>基础API > 矩阵计算</p> |
| 665 | </td> | 665 | </td> |
| 666 | -<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p53919552100"><a name="p53919552100"></a><a name="p53919552100"></a>Mmad、MmadWithSparse、SetHF32Mode、SetHF32TransMode、SetMMLayoutTransform、SetFixPipeConfig、SetFixpipeNz2ndFlag、SetFixpipePreQuantFlag、InitConstValue、LoadData、LoadDataWithTranspose、SetAippFunctions、LoadImageToLocal、LoadDataWithSparse、SetFmatrix、SetLoadDataBoundary、SetLoadDataRepeat、SetLoadDataPaddingValue、Fixpipe</p> | 666 | +<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p53919552100"><a name="p53919552100"></a><a name="p53919552100"></a>Mmad、MmadWithSparse、SetHF32Mode、SetHF32TransMode、SetMMRowMajor、SetMMColumnMajor、SetFixPipeConfig、SetFixpipeNz2ndFlag、SetFixpipePreQuantFlag、Fill、LoadData、LoadDataWithTranspose、SetAippFunctions、LoadImageToLocal、LoadDataWithSparse、SetFmatrix、SetLoadDataBoundary、SetLoadDataRepeat、SetLoadDataPaddingValue、Fixpipe</p> |
| 667 | </td> | 667 | </td> |
| 668 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p153985521019"><a name="p153985521019"></a><a name="p153985521019"></a>-</p> | 668 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p153985521019"><a name="p153985521019"></a><a name="p153985521019"></a>-</p> |
| 669 | </td> | 669 | </td> |
| @@ -761,7 +761,7 @@ | |||
| 761 | </tr> | 761 | </tr> |
| 762 | <tr id="row7987193534118"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p898712358414"><a name="p898712358414"></a><a name="p898712358414"></a>基础API > 矢量计算 > 归约计算</p> | 762 | <tr id="row7987193534118"><td class="cellrowborder" valign="top" width="29.630000000000003%" headers="mcps1.2.4.1.1 "><p id="p898712358414"><a name="p898712358414"></a><a name="p898712358414"></a>基础API > 矢量计算 > 归约计算</p> |
| 763 | </td> | 763 | </td> |
| 764 | -<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p675915224145"><a name="p675915224145"></a><a name="p675915224145"></a>ReduceMax、ReduceMin、WholeReduceSum、BlockReduceMax、BlockReduceMin、BlockReduceSum、PairReduceSum、RepeatReduceSum、</p> | 764 | +<td class="cellrowborder" valign="top" width="44.519999999999996%" headers="mcps1.2.4.1.2 "><p id="p675915224145"><a name="p675915224145"></a><a name="p675915224145"></a>ReduceMax、ReduceMin、ReduceRepeat、ReduceDataBlock、ReducePairElem</p> |
| 765 | </td> | 765 | </td> |
| 766 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p1398713564110"><a name="p1398713564110"></a><a name="p1398713564110"></a>-</p> | 766 | <td class="cellrowborder" valign="top" width="25.85%" headers="mcps1.2.4.1.3 "><p id="p1398713564110"><a name="p1398713564110"></a><a name="p1398713564110"></a>-</p> |
| 767 | </td> | 767 | </td> |
| @@ -19,6 +19,7 @@ | |||
| 19 | | [gather](./gather) | 本样例基于GatherMask、Gather、Gatherb等接口完成多种场景模式下的数据选择功能,实现从源操作数中选取元素写入目的操作数。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 19 | | [gather](./gather) | 本样例基于GatherMask、Gather、Gatherb等接口完成多种场景模式下的数据选择功能,实现从源操作数中选取元素写入目的操作数。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| 20 | | [interleave_pair](./interleave_pair) | 本样例基于Interleave和DeInterleave接口实现元素交织和解交织功能 | Ascend 950PR/Ascend 950DT | | 20 | | [interleave_pair](./interleave_pair) | 本样例基于Interleave和DeInterleave接口实现元素交织和解交织功能 | Ascend 950PR/Ascend 950DT | |
| 21 | | [mrg_sort](./mrg_sort) | 本样例基于Sort32和MrgSort基础API实现将已排好序的最多4条队列,合并成1条队列,结果按照score域由大到小排序 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 21 | | [mrg_sort](./mrg_sort) | 本样例基于Sort32和MrgSort基础API实现将已排好序的最多4条队列,合并成1条队列,结果按照score域由大到小排序 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| 22 | +| [reduce](./reduce) | 本样例介绍了调用`ReduceRepeat<SUM>`和`ReduceDataBlock<SUM>`基础API实现reduce算子,实现了连续内存上数据元素的累加,返回累加结果的功能 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | ||
| 22 | | [reduce_data_block](./reduce_data_block) | 本样例基于`ReduceDataBlock`实现归约计算 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 23 | | [reduce_data_block](./reduce_data_block) | 本样例基于`ReduceDataBlock`实现归约计算 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| 23 | | [reduce_repeat](./reduce_repeat) | 本样例介绍归约类接口`ReduceRepeat`在多种场景下的使用方法。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 24 | | [reduce_repeat](./reduce_repeat) | 本样例介绍归约类接口`ReduceRepeat`在多种场景下的使用方法。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| 24 | | [reduce_pair_elem](./reduce_pair_elem) | 本样例基于`ReducePairElem<SUM>`实现相邻奇偶元素对求和归约 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 25 | | [reduce_pair_elem](./reduce_pair_elem) | 本样例基于`ReducePairElem<SUM>`实现相邻奇偶元素对求和归约 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| @@ -19,6 +19,7 @@ This example set introduces typical usage of different features of Memory vector | |||
| 19 | | [gather](./gather) | This example implements data selection functionality in multiple scenarios using GatherMask, Gather, Gatherb and other interfaces, selecting elements from source operands and writing them to destination operands. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 19 | | [gather](./gather) | This example implements data selection functionality in multiple scenarios using GatherMask, Gather, Gatherb and other interfaces, selecting elements from source operands and writing them to destination operands. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
| 20 | | [interleave_pair](./interleave_pair) | This example implements element interleaving and de-interleaving functionality using Interleave and DeInterleave interfaces | Ascend 950PR/Ascend 950DT | | 20 | | [interleave_pair](./interleave_pair) | This example implements element interleaving and de-interleaving functionality using Interleave and DeInterleave interfaces | Ascend 950PR/Ascend 950DT | |
| 21 | | [mrg_sort](./mrg_sort) | This example implements merging up to 4 pre-sorted queues into 1 queue using Sort32 and MrgSort basic APIs, with results sorted by score field in descending order | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 21 | | [mrg_sort](./mrg_sort) | This example implements merging up to 4 pre-sorted queues into 1 queue using Sort32 and MrgSort basic APIs, with results sorted by score field in descending order | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
| 22 | +| [reduce](./reduce) | This example demonstrates how to call the `ReduceRepeat<SUM>` and `ReduceDataBlock<SUM>` basic APIs to implement the reduce operator, achieving cumulative sum of data elements on continuous memory and returning the cumulative result | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | ||
| 22 | | [reduce_data_block](./reduce_data_block) | This example implements reduction computation using `ReduceDataBlock` | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 23 | | [reduce_data_block](./reduce_data_block) | This example implements reduction computation using `ReduceDataBlock` | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
| 23 | | [reduce_repeat](./reduce_repeat) | This example introduces the usage of reduction interfaces `ReduceRepeat` in multiple scenarios. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 24 | | [reduce_repeat](./reduce_repeat) | This example introduces the usage of reduction interfaces `ReduceRepeat` in multiple scenarios. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
| 24 | | [reduce_pair_elem](./reduce_pair_elem) | This example implements sum reduction for adjacent odd-even element pairs using `ReducePairElem<SUM>` | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 25 | | [reduce_pair_elem](./reduce_pair_elem) | This example implements sum reduction for adjacent odd-even element pairs using `ReducePairElem<SUM>` | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
Rexamples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/CMakeLists.txt→examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/CMakeLists.txt+0-0
文件重命名但无更改。
Rexamples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/README.md→examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/README.md+3-3
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | ## 概述 | 3 | ## 概述 |
| 4 | 4 | ||
| 5 | -本样例介绍了调用`ReduceRepeat<SUM>`和`ReduceDataBlock<SUM>`高阶API实现reduce算子,实现了连续内存上数据元素的累加,返回累加结果的功能。 | 5 | +本样例介绍了调用`ReduceRepeat<SUM>`和`ReduceDataBlock<SUM>`基础API实现reduce算子,实现了连续内存上数据元素的累加,返回累加结果的功能。 |
| 6 | 6 | ||
| 7 | 注:`ReduceRepeat`和`ReduceDataBlock`为 CANN 9.1.0 重命名后的 API。CANN 9.0.0 及之前版本请使用`WholeReduceSum`,`BlockReduceSum`。 | 7 | 注:`ReduceRepeat`和`ReduceDataBlock`为 CANN 9.1.0 重命名后的 API。CANN 9.0.0 及之前版本请使用`WholeReduceSum`,`BlockReduceSum`。 |
| 8 | 8 | ||
| @@ -60,13 +60,13 @@ | |||
| 60 | 60 | ||
| 61 | - 3、长度在float输入(2KB,16KB],或者half输入(4KB,32KB]时,ComputeKey = 3。由于一条ReduceRepeat<SUM>的累加效率比使用两条ReduceDataBlock<SUM>的累加效率更高。所以采用两条ReduceRepeat<SUM>(而不是两条ReduceDataBlock<SUM>+一条ReduceRepeat<SUM>),得到这段buffer的累加和。 | 61 | - 3、长度在float输入(2KB,16KB],或者half输入(4KB,32KB]时,ComputeKey = 3。由于一条ReduceRepeat<SUM>的累加效率比使用两条ReduceDataBlock<SUM>的累加效率更高。所以采用两条ReduceRepeat<SUM>(而不是两条ReduceDataBlock<SUM>+一条ReduceRepeat<SUM>),得到这段buffer的累加和。 |
| 62 | 62 | ||
| 63 | - - 4、长度在float输入为10000时,ComputeKey = 4,对应WholeReduceSumImpl中的处理方法,在Counter模式下,采用ReduceRepeat<SUM>指令,循环处理二维数据中的每一行,得到每一行的归约运行结果。 | 63 | + - 4、长度在float输入为10000时,ComputeKey = 4,对应ReduceRepeatSumImpl中的处理方法,在Counter模式下,采用ReduceRepeat<SUM>指令,循环处理二维数据中的每一行,得到每一行的归约运行结果。 |
| 64 | 64 | ||
| 65 | - 5、长度在float输入为20000时,ComputeKey = 5,对应BinaryReduceSumImpl中的处理方法,在Counter模式下,先将运算数据一分为二,使用Add指令将两部分数据相加,循环往复,最后一条ReduceRepeat<SUM>指令得到归约的运行结果。此种操作方式,相比较ReduceRepeat<SUM>单指令操作的方式,在数据量较大,循环次数较多的场景下,性能更优。 | 65 | - 5、长度在float输入为20000时,ComputeKey = 5,对应BinaryReduceSumImpl中的处理方法,在Counter模式下,先将运算数据一分为二,使用Add指令将两部分数据相加,循环往复,最后一条ReduceRepeat<SUM>指令得到归约的运行结果。此种操作方式,相比较ReduceRepeat<SUM>单指令操作的方式,在数据量较大,循环次数较多的场景下,性能更优。 |
| 66 | 注意代码中使用了Counter模式。 | 66 | 注意代码中使用了Counter模式。 |
| 67 | 67 | ||
| 68 | - Kernel实现 | 68 | - Kernel实现 |
| 69 | - 计算逻辑是:Ascend C提供的矢量计算接口的操作元素都为LocalTensor,输入数据需要先搬运进片上存储,然后使用Reduce高阶API接口完成reduce计算,得到最终结果,再搬出到外部存储上。 | 69 | + 计算逻辑是:Ascend C提供的矢量计算接口的操作元素都为LocalTensor,输入数据需要先搬运进片上存储,然后使用Reduce基础API接口完成reduce计算,得到最终结果,再搬出到外部存储上。 |
| 70 | 70 | ||
| 71 | ReduceCustom算子的实现流程分为3个基本任务:CopyIn,Compute,CopyOut。CopyIn任务负责将Global Memory上的输入Tensor xGm存储在xLocal中,Compute任务对xLocal执行reduce计算,计算的方式通过ComputeKey参数决定,ComputeKey由输入的长度决定,计算结果存储在zLocal中,CopyOut任务负责将输出数据从zLocal搬运至Global Memory上的输出Tensor zGm。 | 71 | ReduceCustom算子的实现流程分为3个基本任务:CopyIn,Compute,CopyOut。CopyIn任务负责将Global Memory上的输入Tensor xGm存储在xLocal中,Compute任务对xLocal执行reduce计算,计算的方式通过ComputeKey参数决定,ComputeKey由输入的长度决定,计算结果存储在zLocal中,CopyOut任务负责将输出数据从zLocal搬运至Global Memory上的输出Tensor zGm。 |
| 72 | 72 | ||
Rexamples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/data_utils.h→examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/data_utils.h+0-0
文件重命名但无更改。
Rexamples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/reduce.asc→examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/reduce.asc+7-7
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | /* ! | 12 | /* ! |
| 13 | * \file reduce.asc | 13 | * \file reduce.asc |
| 14 | - * \brief 演示 Reduce 高阶 API 的多种 Tiling 场景 | 14 | + * \brief 演示 Reduce 基础 API 的多种 Tiling 场景 |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include "acl/acl.h" | 17 | #include "acl/acl.h" |
| @@ -163,7 +163,7 @@ private: | |||
| 163 | AscendC::LocalTensor<T> zLocal = outQueueZ.AllocTensor<T>(); | 163 | AscendC::LocalTensor<T> zLocal = outQueueZ.AllocTensor<T>(); |
| 164 | 164 | ||
| 165 | int64_t start = AscendC::GetSystemCycle(); | 165 | int64_t start = AscendC::GetSystemCycle(); |
| 166 | - WholeReduceSumImpl(zLocal, xLocal, 1, totalLength); | 166 | + ReduceRepeatSumImpl(zLocal, xLocal, 1, totalLength); |
| 167 | int64_t runCycle = AscendC::GetSystemCycle() - start; | 167 | int64_t runCycle = AscendC::GetSystemCycle() - start; |
| 168 | 168 | ||
| 169 | outQueueZ.EnQue<T>(zLocal); | 169 | outQueueZ.EnQue<T>(zLocal); |
| @@ -190,10 +190,10 @@ private: | |||
| 190 | outQueueZ.FreeTensor(zLocal); | 190 | outQueueZ.FreeTensor(zLocal); |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | - __aicore__ inline void WholeReduceSumImpl(const AscendC::LocalTensor<float>& dst, | 193 | + __aicore__ inline void ReduceRepeatSumImpl( |
| 194 | - const AscendC::LocalTensor<float>& src, const uint32_t bsLength, | 194 | + const AscendC::LocalTensor<float>& dst, const AscendC::LocalTensor<float>& src, const uint32_t bsLength, |
| 195 | - const uint32_t hLength) | 195 | + const uint32_t hLength) |
| 196 | - { | 196 | + { |
| 197 | AscendC::SetMaskCount(); | 197 | AscendC::SetMaskCount(); |
| 198 | for (uint32_t i = 0; i < bsLength; i++) { | 198 | for (uint32_t i = 0; i < bsLength; i++) { |
| 199 | uint32_t totalNum = hLength; | 199 | uint32_t totalNum = hLength; |
| @@ -357,4 +357,4 @@ int32_t main(int32_t argc, char* argv[]) | |||
| 357 | aclFinalize(); | 357 | aclFinalize(); |
| 358 | 358 | ||
| 359 | return 0; | 359 | return 0; |
| 360 | -} | 360 | +} |
Rexamples/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/scripts/gen_data.py→examples/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/scripts/gen_data.py+0-0
文件重命名但无更改。
| @@ -8,6 +8,5 @@ | |||
| 8 | 8 | ||
| 9 | | 目录名称 | 功能描述 | 支持的产品 | | 9 | | 目录名称 | 功能描述 | 支持的产品 | |
| 10 | |----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| --- | | 10 | |----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| --- | |
| 11 | -| [reduce](./reduce) | 本样例介绍了调用WholeReduceSum和BlockReduceSum高阶API实现reduce算子,实现了连续内存上数据元素的累加,返回累加结果的功能 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | ||
| 12 | | [reducemax](./reducemax) | 本样例演示了基于ReduceMax高阶API对一个多维向量按照指定的维度求最大值及最大值对应的索引值。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 11 | | [reducemax](./reducemax) | 本样例演示了基于ReduceMax高阶API对一个多维向量按照指定的维度求最大值及最大值对应的索引值。 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| 13 | | [sum](./sum) | 本样例介绍了调用Sum高阶API实现sum算子,获取输入数据最后一个维度的元素总和 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | 12 | | [sum](./sum) | 本样例介绍了调用Sum高阶API实现sum算子,获取输入数据最后一个维度的元素总和 | Ascend 950PR/Ascend 950DT<br>Atlas A3 训练系列产品/Atlas A3 推理系列产品<br>Atlas A2 训练系列产品/Atlas A2 推理系列产品 | |
| @@ -8,6 +8,5 @@ This example set introduces typical usage of different features of reduce operat | |||
| 8 | 8 | ||
| 9 | | Directory Name | Description | Supported Products | | 9 | | Directory Name | Description | Supported Products | |
| 10 | |----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| --- | | 10 | |----------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| --- | |
| 11 | -| [reduce](./reduce) | This example demonstrates how to call the WholeReduceSum and BlockReduceSum high-level APIs to implement the reduce operator, achieving cumulative sum of data elements on continuous memory and returning the cumulative result | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | ||
| 12 | | [reducemax](./reducemax) | This example demonstrates how to compute the maximum value and its corresponding index along a specified dimension for a multi-dimensional vector based on the ReduceMax high-level API. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 11 | | [reducemax](./reducemax) | This example demonstrates how to compute the maximum value and its corresponding index along a specified dimension for a multi-dimensional vector based on the ReduceMax high-level API. | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
| 13 | | [sum](./sum) | This example demonstrates how to call the Sum high-level API to implement the sum operator, obtaining the sum of elements in the last dimension of the input data | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | | 12 | | [sum](./sum) | This example demonstrates how to call the Sum high-level API to implement the sum operator, obtaining the sum of elements in the last dimension of the input data | Ascend 950PR/Ascend 950DT<br>Atlas A3 Training Series Products/Atlas A3 Inference Series Products<br>Atlas A2 Training Series Products/Atlas A2 Inference Series Products | |
Rscripts/presmoke/cases/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/run.sh→scripts/presmoke/cases/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/run.sh+1-1
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | set -euo pipefail | 12 | set -euo pipefail |
| 13 | 13 | ||
| 14 | -CASE_REL=01_simd_cpp_api/04_advanced_api/04_reduce/reduce | 14 | +CASE_REL=01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce |
| 15 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | 15 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 16 | source "$SCRIPT_DIR/../../../../_case_entry.sh" | 16 | source "$SCRIPT_DIR/../../../../_case_entry.sh" |
| 17 | presmoke_case_init "$CASE_REL" | 17 | presmoke_case_init "$CASE_REL" |
| @@ -4723,8 +4723,8 @@ | |||
| 4723 | ] | 4723 | ] |
| 4724 | }, | 4724 | }, |
| 4725 | { | 4725 | { |
| 4726 | - "case": "01_simd_cpp_api/04_advanced_api/04_reduce/reduce", | 4726 | + "case": "01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce", |
| 4727 | - "runner": "scripts/presmoke/cases/01_simd_cpp_api/04_advanced_api/04_reduce/reduce/run.sh", | 4727 | + "runner": "scripts/presmoke/cases/01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce/run.sh", |
| 4728 | "source": "readme", | 4728 | "source": "readme", |
| 4729 | "confidence": "high", | 4729 | "confidence": "high", |
| 4730 | "supported_archs": [ | 4730 | "supported_archs": [ |
| @@ -65,7 +65,7 @@ | |||
| 65 | 01_simd_cpp_api/04_advanced_api/10_math/erf | 65 | 01_simd_cpp_api/04_advanced_api/10_math/erf |
| 66 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/fixpipe_l0c2l1 | 66 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/fixpipe_l0c2l1 |
| 67 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_with_sparse | 67 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_with_sparse |
| 68 | -01_simd_cpp_api/04_advanced_api/04_reduce/reduce | 68 | +01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce |
| 69 | 01_simd_cpp_api/01_utilities/01_assert | 69 | 01_simd_cpp_api/01_utilities/01_assert |
| 70 | 01_simd_cpp_api/04_advanced_api/08_transpose/fill | 70 | 01_simd_cpp_api/04_advanced_api/08_transpose/fill |
| 71 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_repeat | 71 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_repeat |
| @@ -105,7 +105,7 @@ | |||
| 105 | 01_simd_cpp_api/04_advanced_api/08_transpose/fill | 105 | 01_simd_cpp_api/04_advanced_api/08_transpose/fill |
| 106 | 01_simd_cpp_api/03_basic_api/00_data_movement/reg_load_gather | 106 | 01_simd_cpp_api/03_basic_api/00_data_movement/reg_load_gather |
| 107 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_data_block | 107 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_data_block |
| 108 | -01_simd_cpp_api/04_advanced_api/04_reduce/reduce | 108 | +01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce |
| 109 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_computation | 109 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_computation |
| 110 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_repeat | 110 | 01_simd_cpp_api/03_basic_api/01_memory_vector_compute/reduce_repeat |
| 111 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_load3dv2 | 111 | 01_simd_cpp_api/03_basic_api/03_matrix_compute/mmad_load3dv2 |
删除了旧的
二分累加方案示意图.png图片引用,改为使用reduce_best_practice.png。确认新图片路径有效。但删除的归约指令示意图.png(LFS文件)仍然存在于docs/guide/figures/中(diff显示为删除),请确认是否有其他文档引用此图片,避免死链。此评论由AI生成,如有异议,请回复帮助我更快成长:)