CANN/asc-devkit:ReducePairElem归约计算API ReducePairElem【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品支持功能说明头文件路径为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/8b3a8bad8ad133904fcd749f036a531477beb543/docs/zh/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表示在接口内部设置mask。• false表示在接口外部设置mask开发者需要使用SetVectorMask接口设置mask值。这种模式下接口入参中的mask值设置为占位符MASK_PLACEHOLDER用于占位无实际含义。表2参数说明参数名称输入/输出含义dst输出目的操作数。类型为LocalTensor存储位置为UBTPosition为VECIN、VECCALC、VECOUT。src输入源操作数。类型为LocalTensor存储位置为UBTPosition为VECIN、VECCALC、VECOUT。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的实际大小避免出现越界。当参数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 950DTtensor高维切分计算占用8KB Unified Buffer。tensor前n个数据连续计算不涉及8KB Unified Buffer的占用。当一对相邻元素的掩码均为0时该接口的行为如下针对如下型号对应的目的元素将跳过写入保持不变。Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 推理系列产品AI Core针对如下型号对应的目的操作数中的值会置为0。Ascend 950PR/Ascend 950DTAtlas 200I/500 A2 推理产品调用示例本样例中只展示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, .... ]【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考