ReduceRepeat
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 200I/500 A2 推理产品:支持
- Atlas 推理系列产品AI Core:支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:支持
- Kirin X90:支持
- Kirin 9030:支持
功能说明
头文件路径为:"basic_api/kernel_operator_vec_reduce_intf.h"。
ReduceRepeat接口用于对每个repeat内所有数据进行归约操作,根据模板参数reduceType进行求和/求最大值/求最小值操作,结果按顺序写入目标地址。
在求最大值或最小值时可以返回对应的索引,返回的索引值为每个repeat内部索引。支持高维切分计算。
图1 ReduceRepeat计算示意图

函数原型
mask逐bit模式:C++template <ReduceType reduceType, typename T, typename U, bool isSetMask = true> __aicore__ inline void ReduceRepeat(const LocalTensor<T>& dst, const LocalTensor<U>& src, const uint64_t mask[], const int32_t repeatTime, const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride, ReduceOrder order = ReduceOrder::ORDER_VALUE_INDEX)mask连续模式:C++template <ReduceType reduceType, typename T, typename U, bool isSetMask = true> __aicore__ inline void ReduceRepeat(const LocalTensor<T>& dst, const LocalTensor<U>& src, const int32_t mask, const int32_t repeatTime, const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride, ReduceOrder order = ReduceOrder::ORDER_VALUE_INDEX)
参数说明
表1 模板参数说明
| 参数名 | 描述 |
|---|---|
| reduceType | 归约操作类型。 类型为 ReduceType枚举类型,支持:• ReduceType::SUM:求和;• ReduceType::MAX:求最大值;• ReduceType::MIN:求最小值。 |
| T | 目的操作数数据类型。 |
| U | 源操作数数据类型。 |
| isSetMask | 是否在接口内部设置mask。 • true,表示在接口内部设置mask。 • false,表示在接口外部设置mask,开发者需要使用SetVectorMask接口设置mask值。这种模式下,接口入参中的mask值设置为占位符 MASK_PLACEHOLDER,用于占位,无实际含义。 |
表2 参数说明
| 参数名称 | 输入/输出 | 含义 |
|---|---|---|
| dst | 输出 | 目的操作数。 类型为LocalTensor,支持的TPosition为VECIN、VECCALC、VECOUT。 |
| src | 输入 | 源操作数。 类型为LocalTensor,支持的TPosition为VECIN、VECCALC、VECOUT。 |
| mask[]/mask | 输入 | mask用于控制每次迭代内参与计算的源操作数。详细设置参考掩码概述。 |
| repeatTime | 输入 | 迭代次数。取值范围为[0, 255]。 |
| dstRepStride | 输入 | 目的操作数相邻迭代间的地址步长,以一个repeatTime归约后的长度为单位。取值范围为[0, 注意:dstRepStride的单位受操作数数据类型、 reduceType和order参数的影响,参考表3:•返回索引和最值时,单位为dst数据类型所占字节长度的两倍; •仅返回最值时,单位为dst数据类型所占字节长度; •仅返回索引时,单位为uint32_t类型所占字节长度。 注意:Atlas 训练系列产品不支持配置0。 |
| srcBlkStride | 输入 | 单次迭代内DataBlock的地址步长,单位为32字节。取值范围为[0, |
| srcRepStride | 输入 | 源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, |
| order | 输入 | 在归约操作类型为MAX或MIN时,指定dst中最大值value和索引值index的相对位置以及返回结果行为,参数类型为ReduceOrder枚举类型,默认值为ORDER_VALUE_INDEX。ReduceOrder取值如下:• ORDER_VALUE_INDEX:表示value位于低半部,返回结果存储顺序为[value, index]。• ORDER_INDEX_VALUE:表示index位于低半部,返回结果存储顺序为[index, value]。• ORDER_ONLY_VALUE:表示只返回最值,返回结果存储顺序为[value]。• ORDER_ONLY_INDEX:表示只返回最值索引,返回结果存储顺序为[index]。注:归约操作类型为SUM时,该参数不生效。 |
注:以上高维切分相关参数mask,repeatTime,dstRepStride,srcBlkStride,srcRepStride请参考高维切分中的介绍。
数据类型
支持的数据类型如下:
- Ascend 950PR/Ascend 950DT,支持int16_t、uint16_t、half、int32_t、uint32_t、float。
- Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持half、float。
- Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持half、float。
- Atlas 200I/500 A2 推理产品,支持half、float。
- Atlas 推理系列产品AI Core,支持half、float。
- Atlas 训练系列产品,支持half。
- Kirin X90,支持half、float。
- Kirin 9030,支持half、float。
针对Ascend 950PR/Ascend 950DT:
在
reduceType取MAX或MIN时目的操作数与源操作数的数据类型需要保持一致。在
reduceType取SUM时,支持如下数据类型组合:目的操作数数据类型T 源操作数数据类型U int32_tint16_t,int32_tuint32_tuint16_t,uint32_thalfhalffloatfloat
针对如下型号,目的操作数与源操作数的数据类型需要保持一致。
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- Atlas 200I/500 A2 推理产品
- Atlas 推理系列产品AI Core
- Atlas 训练系列产品
- Kirin X90
- Kirin 9030
返回值说明
无
约束说明
操作数地址重叠约束请参考通用地址重叠约束。
源操作数的地址对齐约束请参考通用地址对齐约束,起始地址需要32字节对齐;目的操作数的起始地址对齐约束受操作数数据类型、
reduceType和order参数的影响,请参考表3。表3 目的操作数地址对齐约束及dstRepStride单位
归约操作类型 数据类型 目的操作数地址对齐约束 dstRepStride单位 SUMhalf2字节对齐 2字节 SUMfloat4字节对齐 4字节 归约操作类型 数据类型 order目的操作数地址对齐约束 dstRepStride单位 MAX/MIN halfORDER_VALUE_INDEX4字节对齐 4字节 MAX/MIN halfORDER_INDEX_VALUE4字节对齐 4字节 MAX/MIN halfORDER_ONLY_VALUE2字节对齐 2字节 MAX/MIN halfORDER_ONLY_INDEX4字节对齐 4字节 MAX/MIN floatORDER_VALUE_INDEX8字节对齐 8字节 MAX/MIN floatORDER_INDEX_VALUE8字节对齐 8字节 MAX/MIN floatORDER_ONLY_VALUE4字节对齐 4字节 MAX/MIN floatORDER_ONLY_INDEX4字节对齐 4字节 dstRepStride、srcBlkStride、srcRepStride取值范围为[0,],需要结合UB的实际大小避免出现越界。
当参数mask或repeatTime取值为0时,该接口的行为如下:
- 针对如下型号,当参数mask或repeatTime取值为0时,不会执行计算操作,不会对目的操作数进行写入,该接口将被视为NOP(空操作)。
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- 针对Ascend 950PR/Ascend 950DT,该接口通过VF调用Reg矢量计算API实现兼容,当参数mask或repeatTime取值为0时,不保证该接口被视为NOP(空操作)。
- 针对如下型号,当参数mask或repeatTime取值为0时,不会执行计算操作,不会对目的操作数进行写入,该接口将被视为NOP(空操作)。
- 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
- tensor高维切分计算占用8KB Unified Buffer。
- tensor前n个数据连续计算不涉及8KB Unified Buffer的占用。
- 归约操作类型取MAX或MIN时的约束:
- 如果存在多个最值,该指令会将最小索引写入目的操作数。
- 索引按操作数的数据类型存储,读取索引需要将类型转换到整型,请参考关键特性说明。
- 不同芯片支持的
ReduceOrder如下:- Ascend 950PR/Ascend 950DT,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE、ORDER_ONLY_VALUE、ORDER_ONLY_INDEX。
- Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE、ORDER_ONLY_VALUE、ORDER_ONLY_INDEX。
- Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE、ORDER_ONLY_VALUE、ORDER_ONLY_INDEX。
- Atlas 200I/500 A2 推理产品,支持
ORDER_VALUE_INDEX、ORDER_ONLY_VALUE。
- Atlas 推理系列产品AI Core,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE。
- Atlas 训练系列产品,支持
ORDER_VALUE_INDEX。
- Kirin X90,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE。
- Kirin 9030,支持
ORDER_VALUE_INDEX、ORDER_INDEX_VALUE。
- Ascend 950PR/Ascend 950DT,支持
关键特性说明
索引值需要强制类型转换:
dst的最值索引按照最值的数据类型存储,比如dst为half类型时,索引按照half类型存储,因此读取索引需要使用
reinterpret_cast方法转换到整数类型。若最值数据类型是half,需要使用reinterpret_cast<uint16_t*>;若最值数据类型是float,需要使用reinterpret_cast<uint32_t*>。例如,输入数据是half类型,计算结果为[0.9985, 6.8e-06],6.8e-06需要使用
reinterpret_cast<uint16_t*>方法转换得到索引值114。转换示例如下:C++half maxIndex = dst.GetValue(1); uint16_t realIndex = *reinterpret_cast<uint16_t*>(&maxIndex);特别地
- 针对Ascend 950PR/Ascend 950DT,
ORDER_ONLY_INDEX(仅返回最值索引)情况下,当操作数数据类型为int16_t,uint16_t,half时,读取index都需要使用reinterpret_cast<uint32_t*>。
- 针对如下型号,
ORDER_ONLY_INDEX(仅返回最值索引)情况下,读取索引值index时都需要使用reinterpret_cast<uint32_t*>。- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
- 针对Ascend 950PR/Ascend 950DT,
归约操作类型取
SUM时接口以二叉树累加的方式完成每个repeat内的求和,详情请参考ReduceDataBlock关键特性说明。
调用示例
更多样例可参考ReduceRepeat样例。
ReduceRepeat<ReduceType::MAX>tensor高维切分计算样例-mask连续模式:C++// dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 // 若求最大值及索引,并且需要存储顺序为[value, index]的结果,可以使用默认order,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, 128, 4, 1, 1, 8); // 若求最大值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最大值,并且需要存储[value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_INDEX);ReduceRepeat<AscendC::ReduceType::MAX>tensor高维切分计算样例-mask逐bit模式:C++// dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 // 若求最大值及索引,并且需要存储顺序为[value, index]的结果,使用默认order,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8); // 若求最大值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最大值,并且需要存储[value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MAX, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_INDEX);示例结果如下:
输入数据src_gm:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 ... 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 12 2 2 2 2 2 2 2 2 2 2 2 ... 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 13 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]输出数据dst_gm:
- 若
ReduceOrder类型为ORDER_VALUE_INDEX或默认:[11 3.09944e-06 12 5.96046e-06 ... 13 1.13249e-06] - 若
ReduceOrder类型为ORDER_INDEX_VALUE:[3.09944e-06 11 5.96046e-06 12 ... 1.13249e-06 13] - 若
ReduceOrder类型为ORDER_ONLY_VALUE:[11 12 ... 13 0 0 0 ...] - 若
ReduceOrder类型为ORDER_ONLY_INDEX:[3.09944e-06 0 5.96046e-06 0 ... 1.13249e-06 0]
其中,index的值为int数值的二进制在half中的表达,以上述结果为例:
- 前128个数中,11的位置在对应的repeat中为52,十六进制为0x0034,对应half值为3.09944e-06。
- 第二个128个数中,12的位置在对应的repeat中为100,十六进制为0x0064,对应half值为5.96046e-06。
- 最后128个数中,13的位置在对应的repeat中为19,十六进制为0x0013,对应half值为1.13249e-06。
- 若
ReduceRepeat<AscendC::ReduceType::MIN>tensor高维切分计算样例-mask逐bit模式:C++// dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 // 若求最小值及索引,并且需要存储顺序为[value, index]的结果,使用默认order,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MIN, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8); // 若求最小值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MIN, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最小值,并且需要存储[value]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MIN, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::ReduceRepeat<AscendC::ReduceType::MIN, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_INDEX);示例结果如下:
输入数据src_gm:
[10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 10 10 10 10 10 10 10 10 10 10 10 ... 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2 20 20 20 20 20 20 20 20 20 20 20 ... 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30]输出数据dst_gm:
- 若
ReduceOrder类型为ORDER_VALUE_INDEX或默认:[1 3.09944e-06 2 5.96046e-06 ... 3 1.13249e-06] - 若
ReduceOrder类型为ORDER_INDEX_VALUE:[3.09944e-06 1 5.96046e-06 2 ... 1.13249e-06 3] - 若
ReduceOrder类型为ORDER_ONLY_VALUE:[1 2 ... 3 0 0 0 ...] - 若
ReduceOrder类型为ORDER_ONLY_INDEX:[3.09944e-06 0 5.96046e-06 0 ... 1.13249e-06 0]
其中,index的值为int数值的二进制在half中的表达,以上述结果为例:
- 前128个数中,1的位置在对应的repeat中为52,十六进制为0x0034,对应half值为3.09944e-06。
- 第二个128个数中,2的位置在对应的repeat中为100,十六进制为0x0064,对应half值为5.96046e-06。
- 最后128个数中,3的位置在对应的repeat中为19,十六进制为0x0013,对应half值为1.13249e-06。
- 若
ReduceRepeat<ReduceType::SUM>tensor高维切分计算样例-mask逐bit模式:C++// dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 AscendC::ReduceRepeat<AscendC::ReduceType::SUM, half>(dstLocal, srcLocal, mask, 4, 1, 1, 8);