CANN/asc-devkit SPM缓冲区写入API
WriteSpmBuffer【免费下载链接】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 推理系列产品√Kirin X90√Kirin 9030√功能说明将需要溢出暂存的数据拷贝到SPM Buffer中。函数原型适用于连续和不连续的数据暂存template typename T __aicore__ inline void WriteSpmBuffer(const LocalTensorT writeBuffer, const DataCopyParams copyParams, int32_t writeOffset 0)适用于连续的数据暂存template typename T __aicore__ inline void WriteSpmBuffer(const LocalTensorT writeBuffer, const int32_t writeSize, int32_t writeOffset 0)参数说明表 1接口参数说明参数名称输入/输出含义writeBuffer输入需要溢出暂存的Local内存。copyParams输入搬运参数DataCopyParams类型DataCopyParams结构定义请参考表2。writeSize输入拷贝的元素个数。writeOffset输入拷贝到SPM Buffer的偏移单位为字节。表 2DataCopyParams结构体参数定义参数名称含义blockCount待搬运的连续传输数据块个数。uint16_t类型取值范围blockCount∈[1, 4095]。blockLen待搬运的每个连续传输数据块长度单位为DataBlock32字节。uint16_t类型取值范围blockLen∈[1, 65535]。特别地当dst位于C2PIPE2GM时单位为128B当dst位于C2时表示源操作数的连续传输数据块长度单位为64B。针对Kirin 9030当dst位于C2时表示源操作数的连续传输数据长度单位为32B。srcGap源操作数相邻连续数据块的间隔前面一个数据块的尾与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型srcGap不要超出该数据类型的取值范围。在L1 Buffer - Fixpipe Buffer场景中srcGap特指源操作数相邻连续数据块的间隔前面一个数据块的头与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型srcGap不要超出该数据类型的取值范围。dstGap目的操作数相邻连续数据块间的间隔前面一个数据块的尾与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型dstGap不要超出该数据类型的取值范围。特别地当dstLocal位于C2PIPE2GM时单位为128B当dstLocal位于C2时单位为64B。针对Kirin 9030当dstLocal位于C2时单位为32B。在L1 Buffer - Fixpipe Buffer场景中dstGap特指源操作数相邻连续数据块的间隔前面一个数据块的头与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型dstGap不要超出该数据类型的取值范围。约束说明暂存拷贝到L1时注意writeSize和writeOffset保证32字节对齐拷贝的内存不要超出初始化的SPM Buffer大小否则会存在溢出踩踏等问题。返回值说明无调用示例AscendC::TPipe pipe; AscendC::TQueAscendC::TPosition::VECIN, 1 inQueueSrcVecIn; int dataSize 32; // 假设T为half类型从ub上申请一块内存32 * sizeof(half)字节 int offset 32; // 拷贝到spmBuffer时偏移32字节 pipe.InitBuffer(inQueueSrcVecIn, 1, dataSize * sizeof(half)); AscendC::LocalTensorhalf writeLocal inQueueSrcVecIn.AllocTensorhalf(); AscendC::DataCopyParams copyParams{1, 2, 0, 0}; // 从ub上搬运一个连续传输数据块一个数据块的长度为2个datablock一个datablock为32bytes pipe.WriteSpmBuffer(writeLocal, copyParams, offset);AscendC::TPipe pipe; AscendC::TQueAscendC::TPosition::VECIN, 1 inQueueSrcVecIn; int dataSize 32; // 假设T为half类型从ub上申请一块内存32 * sizeof(half)字节 int offset 32; // 拷贝到spmBuffer时偏移32字节 pipe.InitBuffer(inQueueSrcVecIn, 1, dataSize * sizeof(half)); AscendC::LocalTensorhalf writeLocal inQueueSrcVecIn.AllocTensorhalf(); pipe.WriteSpmBuffer(writeLocal, dataSize, offset);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2604176.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!