Add(支持进位)
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
产品支持情况
功能说明
根据mask对输入数据src0、src1进行按元素相加操作,将结果写入dst。如果src0, src1输入转换为uint32类型相加时超出uint32_t最大值,在carry(存放进位的MaskReg寄存器)中对应位置每4bit大小写1,否则写0。
计算公式如下:
操作carry的示例如下:
int32_t类型,a_i, b_i ∈[-2147483648, 2147483647]
假设a_i = -2147483648, b_i = -2
(uint32_t)a_i + (uint32_t)b_i = (uint64_t)uint_dst_i
因为uint_dst_i >> 32 大于0,所以carry[(i%64):4*(i%64)] = 1
假设a_i = -4, b_i = -2
(uint32_t)a_i + (uint32_t)b_i = (uint64_t)uint_dst_i
因为uint_dst_i >> 32 等于0,所以carry[(i%64):4*(i%64)] = 0
uint32_t类型,a_i, b_i ∈[0, 4294967295]
假设a_i = 4294967295, b_i = 2
(uint32_t)a_i + (uint32_t)b_i = (uint64_t)uint_dst_i
因为uint_dst_i >> 32 大于0,所以carry[(i%64):4*(i%64)] = 1
假设a_i = 4, b_i = 2
(uint32_t)a_i + (uint32_t)b_i = (uint64_t)uint_dst_i
因为uint_dst_i >> 32 等于0,所以carry[(i%64):4*(i%64)] = 0
函数原型
template <typename T = DefaultType, typename U> __simd_callee__ inline void Add(MaskReg& carry, U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask)参数说明
表 1模板参数说明
srcReg0/srcReg1/dstReg RegTensor类型, 例如RegTensor<uint32_t>,由编译器自动推导,用户不需要填写。 |
表 2参数说明
返回值说明
无
约束说明
无
调用示例
template <typename T> static __simd_vf__ inline void AddVF(__ubuf__ T* dst0Addr, __ubuf__ T* dst1Addr, __ubuf__ T* src0Addr, __ubuf__ T* src1Addr, uint32_t count, uint16_t repeatTimes, uint32_t oneRepeatSize){ AscendC::Reg::RegTensor<T> srcReg0; AscendC::Reg::RegTensor<T> srcReg1; AscendC::Reg::RegTensor<T> dstReg0; AscendC::Reg::RegTensor<T> dstReg1; AscendC::Reg::MaskReg mask; AscendC::Reg::MaskReg carry = AscendC::Reg::CreateMask<uint8_t>(); for (uint16_t i = 0; i < repeatTimes; i++) { mask = AscendC::Reg::UpdateMask<T>(count); AscendC::Reg::LoadAlign(srcReg0, src0Addr + i * oneRepeatSize); AscendC::Reg::LoadAlign(srcReg1, src1Addr + i * oneRepeatSize); AscendC::Reg::Add(carry, dstReg0, srcReg0, srcReg1, mask); // 8*4B=32B align AscendC::Reg::StoreAlign<uint32_t, AscendC::Reg::MaskDist::DIST_NORM>(dst1Addr + i * 8, carry); AscendC::Reg::StoreAlign(dst0Addr + i * oneRepeatSize, dstReg0, mask); } }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考