WriteSpmBuffer
产 品 支 持 情 况
功 能 说 明
将 需 要 溢 出 暂 存 的 数 据 拷 贝 到SPM Buffer中。
函 数 原 型
适 用 于 连 续 和 不 连 续 的 数 据 暂 存:
Texttemplate <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const DataCopyParams& copyParams, int32_t writeOffset = 0)适 用 于 连 续 的 数 据 暂 存:
Texttemplate <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const int32_t writeSize, int32_t writeOffset = 0)
参 数 说 明
表 1 接 口 参 数 说 明
搬 运 参 数,DataCopyParams类 型,DataCopyParams结 构 定 义 请 参 考表2。 | ||
表 2 DataCopyParams结 构 体 参 数 定 义
约 束 说 明
- 暂 存 拷 贝 到L1时 注 意writeSize和writeOffset保 证32字 节 对 齐。
- 拷 贝 的 内 存 不 要 超 出 初 始 化 的SPM Buffer大 小,否 则 会 存 在 溢 出 踩 踏 等 问 题。
返 回 值 说 明
无
调 用 示 例
使 用DataCopyParams搬 运
TextAscendC::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连 续 搬 运
TextAscendC::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);