CANN/asc-devkit Reg矢量计算API概述 📅 2026/7/15 15:39:27 概述Reg矢量计算API是面向Reg矢量计算架构开发的API用户可以通过该API直接对芯片中涉及Vector计算的寄存器进行操作实现更大的灵活性和更好的性能。Reg矢量计算API与Memory矢量计算API功能相似但与Memory矢量计算API输入和输出数据必须为LocalTensor不同Reg矢量计算API的输入或输出数据均为Reg矢量计算寄存器。对于计算类API其功能是从给定的寄存器获取数据进行计算并将结果保存在给定的寄存器。对于搬运类API其功能是实现UB和寄存器的数据搬运。由此可见Reg矢量计算API相较于Memory矢量计算API将数据搬运和Reg计算过程交给用户自主控制从而实现更大的开发自由度。如何使用Reg矢量计算API基于寄存器的编程模型是指将数据从LocalTensor通过Reg搬运指令Reg数据搬入加载到寄存器中进行复杂的数学计算Compute后通过Reg搬运指令Reg数据搬出搬出到LocalTensor中所有的计算逻辑均在寄存器中完成从而减少LocalTensor间的数据搬运大大提升了整体性能具体流程如下所示图1Reg矢量计算以Reg矢量计算编程示例为例完整的VectorFunction计算过程由以下几部分组成编写和调用VectorFuntion向量函数。这些函数使用__simd_vf__标记通过asc_vf_call被调用定义矢量数据寄存器RegTensor、掩码寄存器MaskReg编写for循环映射到硬件循环HardwareLoopUpdateMask函数用于更新参与计算的mask每次循环都会消耗一个VL长度的元素。循环内调用Reg数据搬入接口连续对齐搬入LoadAlign从UB中搬入单个VL长度数据循环内调用Reg计算接口Add完成单次Repeat计算循环内调用Reg数据搬出接口连续对齐搬出StoreAlign往UB中搬出计算后的数据Reg矢量计算编程示例template typename T __simd_vf__ inline void AddVF(__ubuf__ T* dstAddr, __ubuf__ T* src0Addr, __ubuf__ T* src1Addr, uint32_t count, uint16_t oneRepeatSize, uint16_t repeatTimes) { AscendC::Reg::RegTensorT srcReg0; AscendC::Reg::RegTensorT srcReg1; AscendC::Reg::RegTensorT dstReg; AscendC::Reg::MaskReg mask; for (uint16_t i 0; i repeatTimes; i) { mask AscendC::Reg::UpdateMaskT(count); AscendC::Reg::LoadAlign(srcReg0, src0Addr i * oneRepeatSize); AscendC::Reg::LoadAlign(srcReg1, src1Addr i * oneRepeatSize); AscendC::Reg::Add(dstReg, srcReg0, srcReg1, mask); AscendC::Reg::StoreAlign(dstAddr i * oneRepeatSize, dstReg, mask); } } template typename T __aicore__ inline void Compute() { // GM数据搬运至UB地址src0Addr及src1Addr ... // 调用vf函数 asc_vf_callAddVFT(dstAddr, src0Addr, src1Addr, count, oneRepeatSize, repeatTimes); // UB地址dstAddr数据搬运至GM ... }[!NOTE]说明GM与UB间的数据搬运需通过GM与UB数据搬运完成Vector Function的流水类型为PIPE_VVector Function内部的同步依赖通过LocalMemBar接口插入。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考