DataCopyPad(ISASI)
产 品 支 持 情 况
功 能 说 明
该 接 口 提 供 数 据 非 对 齐 搬 运 的 功 能,其 中 从Global Memory搬 运 数 据 至Local Memory时,可 以 根 据 开 发 者 的 需 要 自 行 填 充 数 据。
函 数 原 型
dataCopyParams为DataCopyExtParams类 型,相 比 于DataCopyParams类 型,支 持 的 操 作 数 步 长 等 参 数 取 值 范 围 更 大
通 路:Global Memory->Local Memory
Texttemplate <typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const DataCopyPadExtParams<T>& padParams)Texttemplate <typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const DataCopyPadExtParams<T>& padParams)通 路:Local Memory->Global Memory
Texttemplate <typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams)Texttemplate <typename T> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams)通 路:Local Memory->Local Memory,实 际 搬 运 过 程 是VECIN/VECOUT->GM->TSCM
Texttemplate <typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const Nd2NzParams& nd2nzParams)
dataCopyParams为DataCopyParams类 型
通 路:Global Memory->Local Memory
Texttemplate<typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyParams& dataCopyParams, const DataCopyPadParams& padParams)Texttemplate<typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyParams& dataCopyParams, const DataCopyPadParams& padParams)通 路:Local Memory->Global Memory
Texttemplate<typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src,const DataCopyParams& dataCopyParams)Texttemplate<typename T> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src,const DataCopyParams& dataCopyParams)通 路:Local Memory->Local Memory,实 际 搬 运 过 程 是VECIN/VECOUT->GM->TSCM
Texttemplate<typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyParams& dataCopyParams, const Nd2NzParams& nd2nzParams)
不 同 产 品 型 号 对 函 数 原 型 的 支 持 存 在 差 异,请 参 考 下 表 中 的 支 持 度 信 息,选 择 产 品 型 号 支 持 的 函 数 原 型 进 行 开 发。
表 1 不 同 产 品 型 号 对 函 数 原 型 的 支 持 度
是 否 支 持 设 置 数 据 搬 运 模 式mode(搬 运 模 式 包 括 单 次 搬 运 对 齐 和 整 块 数 据 搬 运 对 齐) | ||
|---|---|---|
GM->VECIN/VECOUT、GM->A1/B1、GM->TSCM、VECIN/VECOUT->GM、A1/B1->GM、VECIN/VECOUT->TSCM、 GM->VECCALC | ||
参 数 说 明
表 2 模 板 参 数 说 明
表 3 接 口 参 数 说 明
目 的 操 作 数,类 型 为LocalTensor或GlobalTensor。 | ||
源 操 作 数,类 型 为LocalTensor或GlobalTensor。 | ||
从Global Memory搬 运 数 据 至Local Memory时,可 以 根 据 开 发 者 需 要,在 搬 运 数 据 左 边 或 右 边 填 充 数 据。padParams是 用 于 控 制 数 据 填 充 过 程 的 参 数。 | ||
从VECIN/VECOUT->TSCM进 行 数 据 搬 运 时,可 以 进 行ND到NZ的 数 据 格 式 转 换。nd2nzParams是 用 于 控 制 数 据 格 式 转 换 的 参 数,Nd2NzParams类 型,具 体 参 数 请 参 考表3。 |
下 文 表 格 中 列 出 的 结 构 体 参 数 定 义 请 参 考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_data_copy.h,${INSTALL_DIR}请 替 换 为CANN软 件 安 装 后 文 件 存 储 路 径。
表 4 DataCopyExtParams结 构 体 参 数 定 义
表 5 DataCopyParams结 构 体 参 数 定 义
表 6 DataCopyPadExtParams<T>结 构 体 参 数 定 义
左 右 两 侧 需 要 填 充 的 数 据 值,需 要 保 证 在 数 据 占 用 字 节 范 围 内。 |
表 7 DataCopyPadParams结 构 体 参 数 定 义
下 面 分 别 给 出 如 下 场 景 的 配 置 示 例:
参 数 解 释
- 当blockLen+leftPadding+rightPadding满 足32字 节 对 齐 时,若isPad为false,左 右 两 侧 填 充 的 数 据 值 会 默 认 为 随 机 值;否 则 为paddingValue。
- 当blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐 时,框 架 会 填 充 一 些 假 数 据dummy,保 证 左 右 填 充 的 数 据 和blockLen、假 数 据 为32字 节 对 齐。若leftPadding、rightPadding都 为0:dummy会 默 认 填 充 待 搬 运 数 据 块 的 第 一 个 元 素 值;若leftPadding/rightPadding不 为0:isPad为false,左 右 两 侧 填 充 的 数 据 值 和dummy值 均 为 随 机 值;否 则 为paddingValue。
配 置 示 例1:
- blockLen为64,每 个 连 续 传 输 数 据 块 包 含64字 节;srcStride为1,因 为 源 操 作 数 的 逻 辑 位 置 为GM,srcStride的 单 位 为 字 节,也 就 是 说 源 操 作 数 相 邻 数 据 块 之 间 间 隔1字 节;dstStride为1,因 为 目 的 操 作 数 的 逻 辑 位 置 为VECIN/VECOUT,dstStride的 单 位 为DataBlock数 量(每DataBlock为32字 节),也 就 是 说 目 的 操 作 数 相 邻 数 据 块 之 间 间 隔1个dataBlock。
- blockLen+leftPadding+rightPadding满 足32字 节 对 齐,isPad为false,左 右 两 侧 填 充 的 数 据 值 会 默 认 为 随 机 值;否 则 为paddingValue。此 处 示 例 中,leftPadding、rightPadding均 为0,则 不 填 充。
- blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐 时,框 架 会 填 充 一 些 假 数 据dummy,保 证 左 右 填 充 的 数 据 和blockLen、假 数 据 为32字 节 对 齐。leftPadding/rightPadding不 为0:若isPad为false,左 右 两 侧 填 充 的 数 据 值 和dummy值 均 为 随 机 值;否 则 为paddingValue。

配 置 示 例2:
- blockLen为47,每 个 连 续 传 输 数 据 块 包 含47字 节;srcStride为1,表 示 源 操 作 数 相 邻 数 据 块 之 间 间 隔1字 节;dstStride为1,表 示 目 的 操 作 数 相 邻 数 据 块 之 间 间 隔1个dataBlock。
- blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐,leftPadding、rightPadding均 为0:dummy会 默 认 填 充 待 搬 运 数 据 块 的 第 一 个 元 素 值。
- blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐,leftPadding/rightPadding不 为0:若isPad为false,左 右 两 侧 填 充 的 数 据 值 和dummy值 均 为 随 机 值;否 则 为paddingValue。

配 置 示 例3:
- blockLen为48,每 个 连 续 传 输 数 据 块 包 含48字 节;srcStride为-48,表 示 源 操 作 数 相 邻 数 据 块 之 间 间 隔-48字 节,相 当 于 每 次 传 输 的 连 续 数 据 块 都 是 同 一 块;dstStride为1,表 示 目 的 操 作 数 相 邻 数 据 块 之 间 间 隔1个dataBlock。
- blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐,leftPadding、rightPadding均 为0:dummy会 默 认 填 充 待 搬 运 数 据 块 的 第 一 个 元 素 值。
- blockLen+leftPadding+rightPadding不 满 足32字 节 对 齐,leftPadding/rightPadding不 为0:若isPad为false,左 右 两 侧 填 充 的 数 据 值 和dummy值 均 为 随 机 值;否 则 为paddingValue。

当 每 个 连 续 传 输 数 据 块 长 度blockLen为32字 节 对 齐 时,下 图 呈 现 了 需 要 传 入 的DataCopyParams示 例,blockLen为64,每 个 连 续 传 输 数 据 块 包 含64字 节;srcStride为1,因 为 源 操 作 数 的 逻 辑 位 置 为VECIN/VECOUT,srcStride的 单 位 为dataBlock(32字 节),也 就 是 说 源 操 作 数 相 邻 数 据 块 之 间 间 隔1个dataBlock;dstStride为1,因 为 目 的 操 作 数 的 逻 辑 位 置 为GM,dstStride的 单 位 为 字 节,也 就 是 说 目 的 操 作 数 相 邻 数 据 块 之 间 间 隔1字 节。

当 每 个 连 续 传 输 数 据 块 长 度blockLen不 满 足32字 节 对 齐,由 于Unified Buffer要 求32字 节 对 齐,框 架 在 搬 出 时 会 自 动 补 充 一 些 假 数 据 来 保 证 对 齐,但 在 当 搬 到GM时 会 自 动 将 填 充 的 假 数 据 丢 弃 掉。下 图 呈 现 了 该 场 景 下 需 要 传 入 的DataCopyParams示 例 和 假 数 据 补 齐 的 原 理。blockLen为47,每 个 连 续 传 输 数 据 块 包 含47字 节,不 满 足32字 节 对 齐;srcStride为1,表 示 源 操 作 数 相 邻 数 据 块 之 间 间 隔1个dataBlock;dstStride为1,表 示 目 的 操 作 数 相 邻 数 据 块 之 间 间 隔1字 节。框 架 在 搬 出 时 会 自 动 补 充17字 节 的 假 数 据 来 保 证 对 齐,搬 到GM时 再 自 动 将 填 充 的 假 数 据 丢 弃 掉。

**注 意:**内 部 实 现 涉 及AIC和AIV之 间 的 通 信,实 际 搬 运 路 径 为VECIN/VECOUT->GM->TSCM,发 送 通 信 消 息 会 有 开 销,性 能 会 受 到 影 响。
如图1 VECIN/VECOUT->TSCM搬 运 示 意 图所 示,展 示 了 从VECIN/VECOUT搬 运 到GM,再 搬 运 到TSCM的 过 程:示 例 中 数 据 类 型 为half,单 个datablock(32字 节)含 有16个half元 素,源 操 作 数 中 的A1~A6、B1~B6、C1~C6为 需 要 进 行 搬 运 的 数 据。
从VECIN/VECOUT->GM的 搬 运,数 据 存 储 格 式 没 有 发 生 转 变,依 然 是ND。
- blockCount为 需 要 搬 运 的 连 续 传 输 数 据 块 个 数,设 置 为3;
- blockLen为 一 个 连 续 传 输 数 据 块 的 大 小(单 位 为 字 节),设 置 为6 * 32 = 192;
- srcStride为 源 操 作 数 相 邻 连 续 数 据 块 的 间 隔(前 面 一 个 数 据 块 的 尾 与 后 面 数 据 块 的 头 的 间 隔),源 操 作 数 逻 辑 位 置 为VECIN/VECOUT,其 单 位 为datablock,两 个 连 续 传 输 数 据 块(A1~A6、B1~B6)中 间 相 隔1个A7,因 此srcStride设 置 为1;
- dstStride为 目 的 操 作 数,相 邻 连 续 数 据 块 间 的 间 隔(前 面 一 个 数 据 块 的 尾 与 后 面 数 据 块 的 头 的 间 隔),目 的 操 作 数 逻 辑 位 置 为GM,其 单 位 为 字 节,两 个 连 续 传 输 数 据 块(A1~A6、B1~B6)中 间 相 隔2个 空 白 的datablock,因 此dstStride设 置 为64字 节。
从GM->TSCM的 搬 运,数 据 存 储 格 式 由ND转 换 为NZ。
- ndNum固 定 为1,即A1~A6、B1~B6、C1~C6视 作 一 整 个ndMatrix;
- nValue为ndMatrix的 行 数,即 为3行;
- dValue为ndMatrix中 一 行 包 含 的 元 素 个 数,即 为6 * 16 = 96个 元 素;
- srcNdMatrixStride为 相 邻ndMatrix之 间 的 距 离,因 为 仅 涉 及1个ndMatrix,所 以 可 填 为0;
- srcDValue表 明ndMatrix的 第x行 和 第x+1行 所 相 隔 的 元 素 个 数,如A1~B1的 距 离,即 为8个datablock,8 * 16 = 128个 元 素;
- dstNzC0Stride为src同 一 行 的 相 邻datablock在NZ矩 阵 中 相 隔datablock数,如A1~A2的 距 离,即 为7个datablock (A1 + 空 白 + B1 + 空 白 + C1 + 空 白 * 2);
- dstNzNStride为src中ndMatrix的 相 邻 行 在NZ矩 阵 中 相 隔 多 少 个datablock,如A1~B1的 距 离,即 为2个datablock(A1 + 空 白);
- dstNzMatrixStride为 相 邻NZ矩 阵 之 间 的 元 素 个 数,因 为 仅 涉 及1个NZ矩 阵,所 以 可 以 填 为1。
Normal模 式
blockLen为48,每 个 连 续 传 输 数 据 块 包 含48字 节;srcStride为0,因 为 源 操 作 数 的 逻 辑 位 置 为GM,srcStride的 单 位 为 字 节,即 源 操 作 数 相 邻 数 据 块 之 间 紧 密 排 列;dstStride为0,因 为 目 的 操 作 数 的 逻 辑 位 置 为VECIN、VECOUT,dstStride的 单 位 为DataBlock(32字 节),目 的 操 作 数 相 邻 数 据 块 之 间 无 间 隔,注 意 数 据 块 包 含leftPadding/rightPadding数 据。
blockLen + leftPadding + rightPadding满 足32字 节 对 齐,isPad为false,左 右 两 侧 填 充 的 数 据 值 会 默 认 为 随 机 值,否 则 为paddingValue。此 处 示 例 中,leftPadding为0,rightPadding为16,每 个 连 续 传 输 数 据 块 都 会 在 右 侧 填 充16字 节。目 的 操 作 数 的 总 长 度 为192字 节。
Compact模 式
blockLen为48,每 个 连 续 传 输 数 据 块 包 含48字 节;srcStride为0,因 为 源 操 作 数 的 逻 辑 位 置 为GM,srcStride的 单 位 为 字 节,即 源 操 作 数 相 邻 数 据 块 之 间 紧 密 排 列;dstStride为0,因 为 目 的 操 作 数 的 逻 辑 位 置 为VECIN、VECOUT,dstStride的 单 位 为DataBlock(32字 节),目 的 操 作 数 相 邻 数 据 块 之 间 紧 密 排 列,不 会 填 充 数 据
blockLen * blockCount + leftPadding + rightPadding 满 足32字 节 对 齐,isPad为false,左 右 两 侧 填 充 的 数 据 值 会 默 认 为 随 机 值,否 则 为paddingValue。此 处 示 例 中,leftPadding为0,rightPadding为16,在 最 后 一 个 数 据 块 右 侧 填 充16字 节。目 的 操 作 数 的 总 长 度 为160字 节。

返 回 值 说 明
无
约 束 说 明
- leftPadding、rightPadding的 字 节 数 均 不 能 超 过32字 节。
- 针 对Ascend 950PR/Ascend 950DT,VECIN/VECOUT->TSCM通 路,仅 支 持 如 下 数 据 类 型:half、bfloat16_t、int16_t、uint16_t、float、int32_t、uint32_t、int8_t、uint8_t、int64_t、uint64_t、double。
调 用 示 例
本 示 例 实 现 了GM->VECIN->GM的 非 对 齐 搬 运 过 程,完 整 使 用 样 例 请 参 见DataCopyPad样 例。
AscendC::DataCopyExtParams copyParams{1, 20 * sizeof(half), 0, 0, 0};
AscendC::DataCopyPadExtParams<half> padParams{true, 0, 2, 0};
// 从GM->VECIN搬 运40字 节
AscendC::DataCopyPad(dstGlobal, src0Global, copyParams, padParams);
结 果 示 例:
输 入 数 据src0Global: [1 2 3 ... 32]
输 出 数 据dstGlobal:[1 2 3 ... 20]
