cann/asc-devkit Compare函数文档
# Compare【免费下载链接】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/reg_compute/kernel_reg_compute_vec_cmpsel_intf.h。逐元素比较两个RegTensor大小根据模板参数指定的比较模式将比较结果写入目的操作数MaskReg中对应比特位如果比较后的结果为真则输出结果的对应比特位为1否则为0。其中cmp由模板参数mode指定比较模式取值为EQ/GT/LT/GE/NE/LE。函数原型template typename T DefaultType, CMPMODE mode CMPMODE::EQ, typename U __simd_callee__ inline void Compare(MaskReg dst, U srcReg0, U srcReg1, MaskReg mask)参数说明表1模板参数说明参数名描述T操作数数据类型。mode比较模式。支持如下取值• LT小于• GT大于• GE大于或等于• EQ等于• NE不等于• LE小于或等于U源操作数的RegTensor类型例如RegTensorhalf由编译器自动推导用户不需要填写。表2参数说明参数名输入/输出描述dst输出MaskReg类型目的操作数。srcReg0、srcReg1输入源操作数。类型为RegTensor。两个源操作数的数据类型需要与目的操作数保持一致。mask输入源操作数元素操作的有效指示详细说明请参考MaskReg。返回值说明无数据类型表3数据类型组合srcReg0和srcReg1数据类型dst数据类型int8_tMaskReguint8_tMaskRegint16_tMaskReguint16_tMaskReghalfMaskRegbfloat16_tMaskRegint32_tMaskReguint32_tMaskRegfloatMaskRegint64_tMaskReguint64_tMaskReg约束说明通过mask参数控制的未选中元素在目的操作数中被置零。操作数重叠约束srcReg0和srcReg1可以是同一个RegTensor。调用示例// 示例逐元素比较src0Addr和src1Addr的数据EQ模式再按比较结果掩码选取元素写入dstAddr // 输入src0Addr指向源操作数0如half类型[1.0, 4.0, 3.0, 2.0, 5.0, 6.0, 7.0, 8.0, 1.0, 2.0, 9.0, 3.0, 4.0, 6.0, 5.0, 7.0, ...] // src1Addr指向源操作数1如half类型[1.0, 3.0, 3.0, 5.0, 2.0, 6.0, 9.0, 4.0, 2.0, 5.0, 9.0, 1.0, 8.0, 3.0, 5.0, 6.0, ...] // 对应位置关系pos0等于(1.01.0)、pos1大于(4.03.0)、pos2等于(3.03.0)、pos3小于(2.05.0)... // 输出dstMask为比较结果掩码EQ模式下[1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, ...]等于位置为1其余为0 // dstAddr存储按掩码Select选取的结果 templatetypename T __simd_vf__ inline void CompareVF(__ubuf__ T* dstAddr, __ubuf__ T* src0Addr, __ubuf__ T* src1Addr, uint32_t count, uint32_t oneRepeatSize, uint16_t repeatTimes) { AscendC::Reg::RegTensorT srcReg0; // 源操作数0 AscendC::Reg::RegTensorT srcReg1; // 源操作数1 AscendC::Reg::RegTensorT dstReg; // 目的操作数存储Select选取的结果 AscendC::Reg::MaskReg mask; AscendC::Reg::MaskReg dstMask; // 比较结果掩码相等位置为1 for (uint16_t i 0; i repeatTimes; i) { mask AscendC::Reg::UpdateMaskT(count); // 根据实际元素个数更新mask AscendC::Reg::LoadAlign(srcReg0, src0Addr i * oneRepeatSize); // 加载源操作数0 AscendC::Reg::LoadAlign(srcReg1, src1Addr i * oneRepeatSize); // 加载源操作数1 AscendC::Reg::CompareT, AscendC::CMPMODE::EQ(dstMask, srcReg0, srcReg1, mask); // 逐元素比较是否相等结果写入dstMask AscendC::Reg::Select(dstReg, srcReg0, srcReg1, dstMask); // 按比较结果掩码选取元素 AscendC::Reg::StoreAlign(dstAddr i * oneRepeatSize, dstReg, mask); // 将选取结果存回dstAddr } }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考