cann/asc-devkit 元素对归约

📅 2026/7/15 15:04:48
cann/asc-devkit 元素对归约
ReducePairElem产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品√Atlas 推理系列产品 AI Core√Atlas 推理系列产品 Vector CorexAtlas 训练系列产品√功能说明头文件路径为basic_api/kernel_operator_vec_reduce_intf.h。ReducePairElem接口根据模板参数reduceType对相邻两个奇偶元素进行归约操作结果按顺序写入目标地址。当前仅支持求和操作。例如[a1, a2, a3, a4, a5, a6, ...]的求和结果为[a1a2, a3a4, a5a6, ...]。计算过程如下图所示灰色部分代表无效元素。图 1ReducePairElemReduceType::SUM示意图![ReducePairElemReduceType::SUM示意图](https://raw.gitcode.com/cann/asc-devkit/raw/1ea24e5536a6095446f2c42868e8b9f2d6dafdcc/docs/api/figures/ReducePairElem.png ReducePairElemReduceType::SUM示意图?utm_sourcegitcode_repo_files)函数原型mask逐bit模式template ReduceType reduceType, typename T, typename U, bool isSetMask true __aicore__ inline void ReducePairElem(const LocalTensorT dst, const LocalTensorU src, const uint64_t mask[],const int32_t repeatTime, const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride)mask连续模式template ReduceType reduceType, typename T, typename U, bool isSetMask true __aicore__ inline void ReducePairElem(const LocalTensorT dst, const LocalTensorU src, const int32_t mask, const int32_t repeatTime, const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride)参数说明表 1模板参数说明参数名描述reduceType归约操作类型。类型为ReduceType枚举类型支持•ReduceType::SUM求和。T目的操作数数据类型。U源操作数数据类型。isSetMask是否在接口内部设置mask默认为true。•true表示在接口内部设置mask。•false表示在接口外部设置mask开发者需要使用SetVectorMask接口设置mask值。这种模式下本接口入参中的mask值必须设置为占位符MASK_PLACEHOLDER。表 2参数说明参数名称输入/输出含义dst输出目的操作数。类型为LocalTensor支持的TPosition为VECIN、VECCALC、VECOUT存储位置为Unified Buffer。src输入源操作数。类型为LocalTensor支持的TPosition为VECIN、VECCALC、VECOUT存储位置为Unified Buffer。mask[]/mask输入mask用于控制每次迭代内参与计算的源操作数。详细设置参考掩码概述。repeatTime输入迭代次数。取值范围为[0, 255]。dstRepStride输入目的操作数相邻迭代间的地址步长以一个repeatTime归约后的长度为单位即128字节。取值范围为[0, $2^{16}-1$]。注意此参数值Atlas 训练系列产品不支持配置0。srcBlkStride输入单次迭代内DataBlock的地址步长单位为32字节。取值范围为[0, $2^{16}-1$]。srcRepStride输入源操作数相邻迭代间的地址步长即源操作数每次迭代跳过的DataBlock数目。取值范围为[0, $2^{16}-1$]。注以上高维切分相关参数maskrepeatTimedstRepStridesrcBlkStridesrcRepStride请参考高维切分中的介绍。数据类型支持的数据类型如下Ascend 950PR/Ascend 950DT支持half、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。目的操作数与源操作数的数据类型需要保持一致。返回值说明无约束说明操作数的起始地址对齐约束请参考通用地址对齐约束需要32字节对齐。操作数地址重叠约束请参考通用地址重叠约束。dstRepStride、srcBlkStride、srcRepStride取值范围为[0, $2^{16}-1$]需要结合UB的实际大小避免出现越界。针对如下型号当mask0或repeatTime0时不会执行归约操作不会对目的操作数进行写入该接口将被视为NOP空操作。Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品针对如下型号当一对相邻元素的掩码均为0对应的目的元素将跳过写入保持不变。Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品Atlas 推理系列产品 AI CoreAtlas 训练系列产品对于Atlas 200I/500 A2 推理产品当一对相邻元素的掩码均为0对应的目的操作数中的值会置为0。调用示例本样例中只展示Compute流程中的部分代码。更多样例可参考ReducePairElem样例。ReducePairElemtensor高维切分计算样例-mask连续模式// 设定mask为最多的128个全部元素参与计算 int32_t mask 256/sizeof(half); // 每个repeat128个元素一共128个元素。 int repeat 1; // dstLocal: 目的操作数tensor // srcLocal: 源操作数tensor // srcBlkStride 1在一个repeat中block间没有空隙。 // dstRepStride 1srcRepStride 8repeat间没有空隙。 AscendC::ReducePairElemAscendC::ReduceType::SUM, half(dstLocal, srcLocal, mask, repeat, 1, 1, 8);ReducePairElemtensor高维切分计算样例-mask逐bit模式// 设定mask为最多的128个全部元素参与计算 uint64_t mask[2] { UINT64_MAX, UINT64_MAX }; // 每个repeat128个元素一共128个元素。 int repeat 1; // dstLocal: 目的操作数tensor // srcLocal: 源操作数tensor // srcBlkStride 1在一个repeat中block间没有空隙。 // dstRepStride 1srcRepStride 8repeat间没有空隙。 AscendC::ReducePairElemAscendC::ReduceType::SUM, half(dstLocal, srcLocal, mask, repeat, 1, 1, 8);示例结果输入数据src_gm[1, 1, 1, -1, 2, 2, -1, 2, 3, 3, 3, -1, 4, 4, -2, 4, .... ]输出数据dst_gm[2, 0, 4, 1, 6, 2, 8, 2, .... ]创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考