Skip to content
版 本

WriteSpmBuffer

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品

Atlas 200I/500 A2 推 理 产 品

x

Atlas 推 理 系 列 产 品AI Core

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

Kirin X90

Kirin 9030

功 能 说 明

将 需 要 溢 出 暂 存 的 数 据 拷 贝 到SPM Buffer中。

函 数 原 型

  • 适 用 于 连 续 和 不 连 续 的 数 据 暂 存:

    Text
    template <typename T>
    __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const DataCopyParams& copyParams, int32_t writeOffset = 0)
    
  • 适 用 于 连 续 的 数 据 暂 存:

    Text
    template <typename T>
    __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const int32_t writeSize, int32_t writeOffset = 0)
    

参 数 说 明

表 1 接 口 参 数 说 明

参 数 名 称

输 入/输 出

含 义

writeBuffer

输 入

需 要 溢 出 暂 存 的Local内 存。

copyParams

输 入

搬 运 参 数,DataCopyParams类 型,DataCopyParams结 构 定 义 请 参 考表2

writeSize

输 入

拷 贝 的 元 素 个 数。

writeOffset

输 入

拷 贝 到SPM Buffer的 偏 移,单 位 为 字 节。

表 2 DataCopyParams结 构 体 参 数 定 义

参 数 名 称

含 义

blockCount

待 搬 运 的 连 续 传 输 数 据 块 个 数。uint16_t类 型,取 值 范 围:blockCount∈[1, 4095]。

blockLen

待 搬 运 的 每 个 连 续 传 输 数 据 块 长 度,单 位 为DataBlock(32字 节)。uint16_t类 型,取 值 范 围:blockLen∈[1, 65535]。

srcGap

源 操 作 数 相 邻 连 续 数 据 块 的 间 隔(前 面 一 个 数 据 块 的 尾 与 后 面 数 据 块 的 头 的 间 隔),单 位 为DataBlock(32字 节)。uint16_t类 型,srcGap不 要 超 出 该 数 据 类 型 的 取 值 范 围。

dstGap

目 的 操 作 数 相 邻 连 续 数 据 块 间 的 间 隔(前 面 一 个 数 据 块 的 尾 与 后 面 数 据 块 的 头 的 间 隔),单 位 为DataBlock(32字 节)。uint16_t类 型,dstGap不 要 超 出 该 数 据 类 型 的 取 值 范 围。

约 束 说 明

  • 暂 存 拷 贝 到L1时 注 意writeSize和writeOffset保 证32字 节 对 齐。
  • 拷 贝 的 内 存 不 要 超 出 初 始 化 的SPM Buffer大 小,否 则 会 存 在 溢 出 踩 踏 等 问 题。

返 回 值 说 明

调 用 示 例

  • 使 用DataCopyParams搬 运

    Text
    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连 续 搬 运

    Text
    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);
    

免 责 声 明:本 站 内 容 由 asc-devkit 仓 master 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区