归约计算概述
表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内的最值及其索引,或获取调用ReduceMax、ReduceMin得到的最值。 | 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时:ReduceDataBlock与ReduceRepeat具有相同的理论并行度,但ReduceDataBlock支持只对一个DataBlock进行归约,而ReduceRepeat需要对八个DataBlock(一个repeat)进行归约,因此ReduceDataBlock效率更高。- 示例:当数据长度为2K时,可以先进行一次
ReduceRepeat归约得到长度为16(32字节),再进行一次ReduceDataBlock即可。此时一次ReduceRepeat+一次ReduceDataBlock耗时比两次ReduceRepeat短。
- 示例:当数据长度为2K时,可以先进行一次
- 数据类型为
- 支持的数据类型:
half、float
- 推荐使用场景:
ReduceRepeat- 推荐使用场景:
- 需要获取最值的索引且对性能敏感的场景。
- 数据类型为
half、数据量大于一个DataBlock时:ReduceRepeat与ReduceDataBlock具有相同的理论并行度,但ReduceRepeat能一次调用对八个DataBlock(一个repeat)进行归约,而使用ReduceDataBlock至少需要调用两次,因此ReduceRepeat耗时更短。
- 支持的数据类型:
half、float
- 推荐使用场景:
ReducePairElem- 推荐使用场景:
- 适合在需要对相邻两个元素进行求和操作时使用。
- 数据类型为
half时,ReducePairElem的理论并行度是归约指令中最高的,因此在数据量较大、需要多次调用ReduceDataBlock及ReduceRepeat时,适合用于对数据进行初步归约。
- 支持的数据类型:
half、float
- 推荐使用场景:
ReduceSum- 推荐使用场景:
- 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的
ReduceDataBlock和ReduceRepeat接口,不推荐对性能敏感的场景使用。 - 该接口能通过一次调用得到归约结果,且支持更长的输入数据,适合用于需要快速验证实现的场景。
- 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的
- 支持的数据类型:
half、float
- 推荐使用场景:
ReduceMax/ReduceMin- 推荐使用场景:
- 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的
ReduceDataBlock和ReduceRepeat接口,不推荐对性能敏感的场景使用。 - 该接口能通过一次调用得到归约结果,且支持更长的输入数据,适合用于需要快速验证实现的场景。
- 该接口内部通过软件仿真实现,性能可能不及硬件指令实现的
- 支持的数据类型:
half、float
- 推荐使用场景:
GetReduceRepeatSumSpr- 推荐使用场景:获取tensor前n个数据计算场景的
ReduceSum结果。 - 支持的数据类型:
half、float
- 推荐使用场景:获取tensor前n个数据计算场景的
GetReduceRepeatMaxMinSpr- 推荐使用场景:获取连续计算场景的
ReduceRepeat<MAX/MIN>所有repeat内的最值及其索引,或获取连续计算场景的ReduceMax/ReduceMin得到的最值。 - 支持的数据类型:
half、float
- 推荐使用场景:获取连续计算场景的
归约接口的选择可以参考如下决策树:
图1 归约接口选择决策树

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