CANN/asc-devkit TPipe写入SPM缓冲 📅 2026/7/15 14:58:50 WriteSpmBuffer产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品√Atlas A2 训练系列产品 / Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品xAtlas 推理系列产品 AI Core√Atlas 推理系列产品 Vector CorexAtlas 训练系列产品√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]。srcGap源操作数相邻连续数据块的间隔前面一个数据块的尾与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型srcGap不要超出该数据类型的取值范围。dstGap目的操作数相邻连续数据块间的间隔前面一个数据块的尾与后面数据块的头的间隔单位为DataBlock32字节。uint16_t类型dstGap不要超出该数据类型的取值范围。约束说明暂存拷贝到L1时注意writeSize和writeOffset保证32字节对齐。拷贝的内存不要超出初始化的SPM Buffer大小否则会存在溢出踩踏等问题。返回值说明无调用示例使用DataCopyParams搬运AscendC::TPipe pipe; int dataSize 32; // 假设T为half类型从ub上申请一块内存32 * sizeof(half)字节 int offset 32; // 拷贝到spmBuffer时偏移32字节 AscendC::DataCopyParams copyParams{1, 2, 0, 0}; // 从ub上搬运一个连续传输数据块一个数据块的长度为2个datablock一个datablock为32bytes // writeLocal为SPM Buffer上的half类型的LocalTensor pipe.WriteSpmBuffer(writeLocal, copyParams, offset); // 将ub上的连续传输数据块搬运到SPM Buffer pipe.ReadSpmBuffer(writeLocal, copyParams, offset); // 将暂存在SPM Buffer的数据读回到local数据 ... // 当ub内存足够时将暂存在SPM Buffer的数据块搬运回GM上dstGlobal为half类型的GlobalTensor AscendC::DataCopy(dstGlobal, writeLocal, copyParams);使用writeSize连续搬运AscendC::TPipe pipe; int dataSize 32; // 假设T为half类型从ub上申请一块内存32 * sizeof(half)字节 int offset 32; // 拷贝到spmBuffer时偏移32字节 ; // writeLocal为SPM Buffer上的half类型的LocalTensor pipe.WriteSpmBuffer(writeLocal, dataSize, offset); // 将ub上的连续传输数据块搬运到SPM Buffer pipe.ReadSpmBuffer(writeLocal, dataSize, offset); // 将暂存在SPM Buffer的数据读回到local数据 ... // 当ub内存足够时将暂存在SPM Buffer的数据块搬运回GM上dstGlobal为half类型的GlobalTensor AscendC::DataCopy(dstGlobal, writeLocal, dataSize);创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考