WholeReduceMax
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
Atlas 350 加速卡 |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
x |
|
|
√ |
功能说明
每个repeat内所有数据求最大值以及其索引index,返回的索引值为每个repeat内部索引。
函数原型
- mask逐bit模式
1 2
template <typename T, bool isSetMask = true> __aicore__ inline void WholeReduceMax(const LocalTensor<T>& dst, const LocalTensor<T>& 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连续模式
1 2
template <typename T, bool isSetMask = true> __aicore__ inline void WholeReduceMax(const LocalTensor<T>& dst, const LocalTensor<T>& 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)
参数说明
|
参数名 |
描述 |
|---|---|
|
T |
操作数数据类型。 Atlas 350 加速卡,支持的数据类型为:uint16_t/int16_t/uint32_t/int32_t/half/float |
|
isSetMask |
是否在接口内部设置mask。
|
|
参数名称 |
输入/输出 |
含义 |
|---|---|---|
|
dst |
输出 |
目的操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要保证4字节对齐(针对half数据类型),8字节对齐(针对float数据类型)。 |
|
src |
输入 |
源操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 源操作数的数据类型需要与目的操作数保持一致。 |
|
mask/mask[] |
输入 |
|
|
repeatTime |
输入 |
迭代次数。取值范围为[0, 255]。 |
|
dstRepStride |
输入 |
目的操作数相邻迭代间的地址步长。以一个repeat归约后的长度为单位。 返回索引和最值时,单位为dst数据类型所占字节长度的两倍。比如当dst为half时,单位为4Bytes; 仅返回最值时,单位为dst数据类型所占字节长度; 仅返回索引时,单位为uint32_t类型所占字节长度。 注意,此参数值 |
|
srcBlkStride |
输入 |
|
|
srcRepStride |
输入 |
源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的datablock数目。 |
|
order |
输入 |
使用order参数指定dst中index与value的相对位置以及返回结果行为,ReduceOrder类型,默认值为ORDER_VALUE_INDEX。取值范围如下:
Atlas 350 加速卡,支持ORDER_VALUE_INDEX、ORDER_INDEX_VALUE、ORDER_ONLY_VALUE、ORDER_ONLY_INDEX。 |
返回值说明
无
约束说明
- dst结果存储顺序由order决定,默认为最值、最值索引。返回结果中索引index数据按照dst的数据类型进行存储,比如dst使用half类型时,index按照half类型进行存储,读取时需要使用reinterpret_cast方法转换到整数类型。若输入数据类型是half,需要使用reinterpret_cast<uint16_t*>,若输入是float,需要使用reinterpret_cast<uint32_t*>。特别地,针对
Atlas A2 训练系列产品 /Atlas A2 推理系列产品 、Atlas A3 训练系列产品 /Atlas A3 推理系列产品 ,ORDER_ONLY_INDEX(仅返回最值索引)情况下,读取index时都需要使用reinterpret_cast<uint32_t*>。针对Atlas 350 加速卡,ORDER_ONLY_INDEX(仅返回最值索引)情况下,当操作数数据类型为uint16_t/int16_t/half时,读取index都需要使用reinterpret_cast<uint32_t*>。 - 针对不同场景合理使用归约指令可以带来性能提升,相关介绍请参考选择低延迟指令,优化归约操作性能,具体样例请参考ReduceCustom。
调用示例
- tensor高维切分计算样例-mask连续模式
1 2 3 4 5 6 7 8 9 10 11 12 13
// dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 // 若求最大值及索引,并且需要存储顺序为[value, index]的结果,可以使用默认order,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8); // 若求最大值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最大值,并且需要存储[value]的结果,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_INDEX);
- tensor高维切分计算样例-mask逐bit模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 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::WholeReduceMax<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8); // 若求最大值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最大值,并且需要存储[value]的结果,接口示例为: AscendC::WholeReduceMax<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::WholeReduceMax<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 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 1 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 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 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 2 2 2 2 2 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 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 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] 若ReduceOrder类型为ORDER_VALUE_INDEX或默认,则输出数据dst_gm: [11 3.09944e-06 12 5.96046e-06 ... 13 1.13249e-06] 若ReduceOrder类型为ORDER_INDEX_VALUE,则输出数据dst_gm: [3.09944e-06 11 5.96046e-06 12 ... 1.13249e-06 13] 若ReduceOrder类型为ORDER_ONLY_VALUE,则输出数据dst_gm: [11 12 ... 13 0 0 0 ...] 若ReduceOrder类型为ORDER_ONLY_VALUE,则输出数据dst_gm: [3.09944e-06 0 5.96046e-06 0 ... 1.13249e-06 0] 其中,index的值为int数值的二进制,在half中的表达,以上述结果为例: 前128个数中,11的位置在对应的repeat中为52,十六进制为0x3400,对应half值为3.09944e-06。 第二个128个数中,12的位置在对应的repeat中为100,十六进制为0x6400,对应half值为5.96046e-06。 最后128个数中,13的位置在对应的repeat中为19,十六进制为0x1300,对应half值为1.13249e-06。