Skip to content

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的单位受操作数数据类型、reduceTypeorder参数的影响,参考表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时,该参数不生效。

注:以上高维切分相关参数maskrepeatTimedstRepStridesrcBlkStridesrcRepStride请参考高维切分中的介绍。

数据类型

支持的数据类型如下:

  • 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:

  • reduceTypeMAXMIN时目的操作数与源操作数的数据类型需要保持一致。

  • reduceTypeSUM时,支持如下数据类型组合:

    目的操作数数据类型T源操作数数据类型U
    int32_tint16_tint32_t
    uint32_tuint16_tuint32_t
    halfhalf
    floatfloat

针对如下型号,目的操作数与源操作数的数据类型需要保持一致。

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品
  • Atlas 200I/500 A2 推理产品
  • Atlas 推理系列产品AI Core
  • Atlas 训练系列产品
  • Kirin X90
  • Kirin 9030

返回值说明

约束说明

  • 操作数地址重叠约束请参考通用地址重叠约束

  • 源操作数的地址对齐约束请参考通用地址对齐约束,起始地址需要32字节对齐;目的操作数的起始地址对齐约束受操作数数据类型、reduceTypeorder参数的影响,请参考表3

    表3 目的操作数地址对齐约束及dstRepStride单位

    归约操作类型数据类型目的操作数地址对齐约束dstRepStride单位
    SUMhalf2字节对齐2字节
    SUMfloat4字节对齐4字节
    归约操作类型数据类型order目的操作数地址对齐约束dstRepStride单位
    MAX/MINhalfORDER_VALUE_INDEX4字节对齐4字节
    MAX/MINhalfORDER_INDEX_VALUE4字节对齐4字节
    MAX/MINhalfORDER_ONLY_VALUE2字节对齐2字节
    MAX/MINhalfORDER_ONLY_INDEX4字节对齐4字节
    MAX/MINfloatORDER_VALUE_INDEX8字节对齐8字节
    MAX/MINfloatORDER_INDEX_VALUE8字节对齐8字节
    MAX/MINfloatORDER_ONLY_VALUE4字节对齐4字节
    MAX/MINfloatORDER_ONLY_INDEX4字节对齐4字节
  • dstRepStridesrcBlkStridesrcRepStride取值范围为[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(空操作)。
  • 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
    • tensor高维切分计算占用8KB Unified Buffer。
    • tensor前n个数据连续计算不涉及8KB Unified Buffer的占用。
  • 归约操作类型取MAX或MIN时的约束:
    • 如果存在多个最值,该指令会将最小索引写入目的操作数。
    • 索引按操作数的数据类型存储,读取索引需要将类型转换到整型,请参考关键特性说明
    • 不同芯片支持的ReduceOrder如下:
      • Ascend 950PR/Ascend 950DT,支持ORDER_VALUE_INDEXORDER_INDEX_VALUEORDER_ONLY_VALUEORDER_ONLY_INDEX
      • Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持ORDER_VALUE_INDEXORDER_INDEX_VALUEORDER_ONLY_VALUEORDER_ONLY_INDEX
      • Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持ORDER_VALUE_INDEXORDER_INDEX_VALUEORDER_ONLY_VALUEORDER_ONLY_INDEX
      • Atlas 200I/500 A2 推理产品,支持ORDER_VALUE_INDEXORDER_ONLY_VALUE
      • Atlas 推理系列产品AI Core,支持ORDER_VALUE_INDEXORDER_INDEX_VALUE
      • Atlas 训练系列产品,支持ORDER_VALUE_INDEX
      • Kirin X90,支持ORDER_VALUE_INDEXORDER_INDEX_VALUE
      • Kirin 9030,支持ORDER_VALUE_INDEXORDER_INDEX_VALUE

关键特性说明

  • 索引值需要强制类型转换

    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_tuint16_thalf时,读取index都需要使用reinterpret_cast<uint32_t*>
    • 针对如下型号,ORDER_ONLY_INDEX(仅返回最值索引)情况下,读取索引值index时都需要使用reinterpret_cast<uint32_t*>
      • Atlas A3 训练系列产品/Atlas A3 推理系列产品
      • Atlas A2 训练系列产品/Atlas A2 推理系列产品
  • 归约操作类型取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);
    

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区