产品 |
是否支持 |
|---|---|
Ascend 950PR/Ascend 950DT |
√ |
√ |
|
√ |
|
√ |
|
√ |
|
x |
|
√ |
每个repeat内所有数据求最小值以及其索引index,返回的索引值为每个repeat内部索引。归约指令的总体介绍请参考如何使用归约计算API。
1 2 | template <typename T, bool isSetMask = true> __aicore__ inline void WholeReduceMin(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) |
1 2 | template <typename T, bool isSetMask = true> __aicore__ inline void WholeReduceMin(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 |
操作数数据类型。 Ascend 950PR/Ascend 950DT,支持的数据类型为: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[] |
输入 |
mask用于控制每次迭代内参与计算的元素。
|
repeatTime |
输入 |
迭代次数。取值范围为[0, 255]。 关于该参数的具体描述请参考高维切分API。 |
dstRepStride |
输入 |
目的操作数相邻迭代间的地址步长。以一个repeat归约后的长度为单位。 返回索引和最值时,单位为dst数据类型所占字节长度的两倍。比如当dst为half时,单位为4Bytes; 仅返回最值时,单位为dst数据类型所占字节长度; 仅返回索引时,单位为uint32_t类型所占字节长度。 注意,此参数值 |
srcBlkStride |
输入 |
单次迭代内datablock的地址步长。详细说明请参考dataBlockStride。 |
srcRepStride |
输入 |
源操作数相邻迭代间的地址步长,即源操作数每次迭代跳过的datablock数目。详细说明请参考repeatStride。 |
order |
输入 |
使用order参数指定dst中index与value的相对位置以及返回结果行为,ReduceOrder类型,默认值为ORDER_VALUE_INDEX。取值范围如下:
Ascend 950PR/Ascend 950DT,支持ORDER_VALUE_INDEX、ORDER_INDEX_VALUE、ORDER_ONLY_VALUE、ORDER_ONLY_INDEX。 |
无
1 2 3 4 5 6 7 8 9 10 11 12 | // dstLocal,srcLocal均为half类型,srcLocal的计算数据量为512,连续排布,计算结果也需要连续排布,使用tensor高维切分计算接口,设定mask为最多的128个全部元素参与计算 // 根据以上信息,推断出repeatTime为4,dstRepStride为1,srcBlkStride为1,srcRepStride为8 // 若求最小值及索引,并且需要存储顺序为[value, index]的结果,可以使用默认order,接口示例为:AscendC::WholeReduceMin<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8); // 若求最小值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::WholeReduceMin<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最小值,并且需要存储[value]的结果,接口示例为: AscendC::WholeReduceMin<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::WholeReduceMin<half>(dstLocal, srcLocal, 128, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_INDEX); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 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::WholeReduceMin<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8); // 若求最小值及索引,并且需要存储顺序为[index, value]的结果,接口示例为: AscendC::WholeReduceMin<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_INDEX_VALUE); // 若只求最小值,并且需要存储[value]的结果,接口示例为: AscendC::WholeReduceMin<half>(dstLocal, srcLocal, mask, 4, 1, 1, 8, AscendC::ReduceOrder::ORDER_ONLY_VALUE); // 若只求索引,并且需要存储[index]的结果,接口示例为: AscendC::WholeReduceMin<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 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 10 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 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 20 20 20 20 20 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 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 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30] 若ReduceOrder类型为ORDER_VALUE_INDEX或默认,则输出数据dst_gm: [1 3.09944e-06 2 5.96046e-06 ... 3 1.13249e-06] 若ReduceOrder类型为ORDER_INDEX_VALUE,则输出数据dst_gm: [3.09944e-06 1 5.96046e-06 2 ... 1.13249e-06 3] 若ReduceOrder类型为ORDER_ONLY_VALUE,则输出数据dst_gm: [1 2 ... 3 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。