WriteSpmBuffer
函数原型
- 适用于连续和不连续的数据暂存:
1 2
template <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeLocal, const DataCopyParams& copyParams, int32_t writeOffset = 0)
- 适用于连续的数据暂存:
1 2
template <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeLocal, const int32_t writeSize, int32_t writeOffset = 0)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
writeLocal |
输入 |
需要溢出暂存的Local内存。 |
copyParams |
输入 |
搬运参数,DataCopyParams类型,DataCopyParams结构定义请参考表2。 |
writeSize |
输入 |
拷贝的元素个数。 |
writeoffset |
输入 |
拷贝到SPM Buffer的偏移,单位为字节。 |
参数名称 |
含义 |
---|---|
blockCount |
指定该指令包含的连续传输数据块个数,取值范围:blockCount∈[1, 4095]。 |
blockLen |
指定该指令每个连续传输数据块长度,单位为datablock(32Bytes)。取值范围:blockLen∈[1, 65535]。 特别的,当dstLocal位于C2PIPE2GM时,单位为128B;当dstLocal位于C2时,单位为64B。 |
srcStride |
源操作数,相邻连续数据块的间隔(前面一个数据块的尾与后面数据块的头的间隔),单位为datablock(32Bytes)。数据类型为uint16_t,srcStride不要超出该数据类型的取值范围。 |
dstStride |
目的操作数,相邻连续数据块间的间隔(前面一个数据块的尾与后面数据块的头的间隔),单位为datablock(32Bytes)。数据类型为uint16_t,dstStride不要超出该数据类型的取值范围。 特别的,当dstLocal位于C2PIPE2GM时,单位为128B;当dstLocal位于C2时,单位为64B。 |
支持的型号
Atlas 训练系列产品
Atlas推理系列产品AI Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
注意事项
- 暂存拷贝到L1时注意writeSize和writeOffset保证32字节对齐
- 拷贝的内存不要超出初始化的SPM Buffer大小,否则会存在溢出踩踏等问题。
返回值
无
调用示例
1 2 3 4 5 6 7 8 |
AscendC::TPipe pipe; AscendC::TQue<AscendC::QuePosition::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::LocalTensor<half> writeLocal = inQueueSrcVecIn.AllocTensor<half>(); AscendC::DataCopyParams copyParams{1, 2, 0, 0}; // 从ub上搬运一个连续传输数据块,一个数据块的长度为2个datablock,一个datablock32bytes pipe.WriteSpmBuffer(writeLocal, copyParams, offset); |
1 2 3 4 5 6 7 |
AscendC::TPipe pipe; AscendC::TQue<AscendC::QuePosition::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::LocalTensor<half> writeLocal = inQueueSrcVecIn.AllocTensor<half>(); pipe.WriteSpmBuffer(writeLocal, dataSize, offset); |
父主题: SPM Buffer