Skip to content

归约计算概述

表1 归约计算接口与主要功能

接口主要功能输出长度
ReduceDataBlock对每个DataBlock内的数据求和/求最大值/求最小值。1 element / DataBlock
ReduceRepeat对每个repeat内的数据求和/求最大值/求最小值。
其中求最大值或最小值时可选择输出对应的索引。
求和:1 element / repeat;
求最大值/最小值:1 element (1 index) / repeat。
ReducePairElem对相邻两个元素进行求和。1 element / pair
ReduceSum对所有输入数据求和。1 element
ReduceMax/ReduceMin对所有输入数据求最大值/最小值。
可选择输出对应的索引。
1 element (1 index)
GetReduceRepeatSumSpr(ISASI)获取ReduceSum接口的计算结果。1 element
GetReduceRepeatMaxMinSpr(ISASI)获取调用ReduceRepeat<MAX/MIN>时所有repeat内的最值及其索引,或获取调用ReduceMaxReduceMin得到的最值。1 element (1 index)

针对Ascend 950PR/Ascend 950DT,Memory矢量计算的归约计算接口底层均通过VF调用转换为Reg矢量计算指令执行,接口内部存在额外的VF调用开销和UB中转(如sharedTmpBuffer)。因此Memory API不保证极致性能,对性能敏感的场景建议直接使用Reg矢量计算中的归约计算(Reg::Reduce、Reg::PairReduceElem、Reg::ReduceDataBlock)。

针对Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品,在使用归约计算接口时,有如下使用建议。

  • ReduceDataBlock

    • 推荐使用场景
      • 数据类型为float时:相比ReduceRepeat有更高的理论并行度;与ReducePairElem拥有相同的理论并行度,但可以归约更多数据。
      • 数据类型为half、数据量小于等于一个DataBlock时:ReduceDataBlockReduceRepeat具有相同的理论并行度,但ReduceDataBlock支持只对一个DataBlock进行归约,而ReduceRepeat需要对八个DataBlock(一个repeat)进行归约,因此ReduceDataBlock效率更高。
        • 示例:当数据长度为2K时,可以先进行一次ReduceRepeat归约得到长度为16(32字节),再进行一次ReduceDataBlock即可。此时一次ReduceRepeat+一次ReduceDataBlock耗时比两次ReduceRepeat短。
    • 支持的数据类型:halffloat
  • ReduceRepeat

    • 推荐使用场景
      • 需要获取最值的索引且对性能敏感的场景。
      • 数据类型为half、数据量大于一个DataBlock时:ReduceRepeatReduceDataBlock具有相同的理论并行度,但ReduceRepeat能一次调用对八个DataBlock(一个repeat)进行归约,而使用ReduceDataBlock至少需要调用两次,因此ReduceRepeat耗时更短。
    • 支持的数据类型:halffloat
  • ReducePairElem

    • 推荐使用场景
      • 适合在需要对相邻两个元素进行求和操作时使用。
      • 数据类型为half时,ReducePairElem的理论并行度是归约指令中最高的,因此在数据量较大、需要多次调用ReduceDataBlockReduceRepeat时,适合用于对数据进行初步归约。
    • 支持的数据类型:halffloat
  • ReduceSum

    • 推荐使用场景
      • 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的ReduceDataBlockReduceRepeat接口,不推荐对性能敏感的场景使用。
      • 该接口能通过一次调用得到归约结果,且支持更长的输入数据,适合用于需要快速验证实现的场景。
    • 支持的数据类型:halffloat
  • ReduceMax/ReduceMin

    • 推荐使用场景
      • 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的ReduceDataBlockReduceRepeat接口,不推荐对性能敏感的场景使用。
      • 该接口能通过一次调用得到归约结果,且支持更长的输入数据,适合用于需要快速验证实现的场景。
    • 支持的数据类型:halffloat
  • GetReduceRepeatSumSpr

    • 推荐使用场景:获取tensor前n个数据计算场景的ReduceSum结果。
    • 支持的数据类型:halffloat
  • GetReduceRepeatMaxMinSpr

    • 推荐使用场景:获取连续计算场景的ReduceRepeat<MAX/MIN>所有repeat内的最值及其索引,或获取连续计算场景的ReduceMax/ReduceMin得到的最值。
    • 支持的数据类型:halffloat

归约接口的选择可以参考如下决策树

图1 归约接口选择决策树

归约接口选择决策树

注:在数据类型为half时,ReduceDataBlockReduceRepeat接口并行度不如ReducePairElem及基础算术接口AddMaxMin。在数据量较大,需要多次调用ReduceDataBlockReduceRepeat时,可以考虑使用ReducePairElem或基础算术接口对数据进行初步归约后再调用归约计算接口。

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