asc_copy_l12l0a_trans
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
| Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ |
| Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ |
功 能 说 明
该 接 口 实 现 带 转 置 的2D格 式 数 据 从L1 Buffer到L0A Buffer的 加 载。
下 面 通 过 示 例 来 讲 解 接 口 功 能 和 关 键 参 数:下 文 图 中 一 个N形 或 者 一 个Z形 代 表 一 个 分 形。
- 对 于uint8_t/int8_t数 据 类 型,每 次 迭 代 处 理32 × 32 × 1B数 据,可 处 理2个 分 形(一 个 分 形512B),每 次 迭 代 中,源 操 作 数 中2个 连 续 的16 × 32分 形 将 被 合 并 为1个32 × 32的 方 块 矩 阵,基 于 方 块 矩 阵 做 转 置,转 置 后 分 裂 为2个16 × 32分 形,根 据 目 的 操 作 数 分 形 间 隔 等 参 数 可 以 有 不 同 的 排 布。
如 下 图 示 例:
- 共 处 理3072B的 数 据,每 次 迭 代 处 理32 × 32 × 1B数 据,需 要3次 迭 代 可 以 完 成,repeat_time = 3;
- src_stride = 1,表 示 相 邻 迭 代 间,源 操 作 数 前 一 个 方 块 矩 阵 与 后 一 个 方 块 矩 阵 起 始 地 址 的 间 隔 为1(单 位:32 × 32 × 1B),这 里 的 单 位 实 际 上 是 拼 接 后 的 方 块 矩 阵 的 大 小;
- dst_gap = 1,表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 到 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 的 间 隔 为1(单 位:512B);
- dst_frac_gap = 0,表 示 每 个 迭 代 内 目 的 操 作 数 前 一 个 分 形 的 结 束 地 址 与 后 一 个 分 形 起 始 地 址 的 间 隔 为0(单 位:512B)。

如 下 图 示 例:
- repeat_time和src_stride的 解 释 和 上 图 示 例 一 致。
- dst_gap = 0,表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 和 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 无 间 隔。
- dst_frac_gap = 2,表 示 每 个 迭 代 内 目 的 操 作 数 前 一 个 分 形 的 结 束 地 址 与 后 一 个 分 形 起 始 地 址 的 间 隔 为2(单 位:512B)。

- 对 于half/bfloat16_t数 据 类 型,每 次 迭 代 处 理16 × 16 × 2B数 据,可 处 理1个 分 形(一 个 分 形512B),每 次 迭 代 中,源 操 作 数 中1个16 × 16分 形 将 被 转 置。
- 因 为 每 次 迭 代 处 理16 × 16 × 2B数 据,需 要3次 迭 代 可 以 完 成,repeat_time = 3;
- src_stride = 1,表 示 相 邻 迭 代 间,源 操 作 数 前 一 个 方 块 矩 阵 与 后 一 个 方 块 矩 阵 起 始 地 址 的 间 隔 为1 (单 位:16 × 16 × 2B);
- dst_gap = 0,表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 到 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 无 间 隔;
- 该 场 景 下,因 为 其 分 形 即 为 方 块 矩 阵,每 个 迭 代 处 理 一 个 分 形,不 存 在 迭 代 内 分 形 的 间 隔,该 参 数 设 置 无 效。

- 对 于float/int32_t/uint32_t数 据 类 型,每 次 迭 代 处 理16 × 16 × 4B数 据,可 处 理2个 分 形(一 个 分 形512B),每 次 迭 代 中,源 操 作 数2个 连 续 的16 × 8分 形 将 被 合 并 为1个16 × 16的 方 块 矩 阵,基 于 方 块 矩 阵 做 转 置,转 置 后 分 裂 为2个16 × 8分 形,根 据 目 的 操 作 数 分 形 间 隔 等 参 数 可 以 有 不 同 的 排 布。 如 下 图 示 例:
- 因 为 每 次 迭 代 处 理16 × 16 × 4B数 据,需 要3次 迭 代 可 以 完 成,repeat_time = 3;
- src_stride = 1,表 示 相 邻 迭 代 间,源 操 作 数 前 一 个 方 块 矩 阵 与 后 一 个 方 块 矩 阵 起 始 地 址 的 间 隔 为1(单 位:16 × 16 × 4B),这 里 的 单 位 实 际 上 是 拼 接 后 的 方 块 矩 阵 的 大 小;
- dst_gap = 1,表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 到 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 的 间 隔 为1(单 位:512B);
- dst_frac_gap = 0,表 示 每 个 迭 代 内 目 的 操 作 数 前 一 个 分 形 结 束 地 址 与 后 一 个 分 形 起 始 地 址 的 间 隔 为0(单 位:512B)。

如 下 图 示 例:
- repeat_time和src_stride的 解 释 和 上 图 示 例 一 致。
- dst_gap = 0,表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 和 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 无 间 隔。
- dst_frac_gap = 2,表 示 每 个 迭 代 内 目 的 操 作 数 前 一 个 分 形 结 束 地 址 与 后 一 个 分 形 起 始 地 址 的 间 隔 为2(单 位:512B)。

函 数 原 型
高 维 切 分 搬 运
C++__aicore__ inline void asc_copy_l12l0a_trans(__ca__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans(__ca__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap)同 步 高 维 切 分 搬 运
C++__aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap) __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool addrmode, uint16_t dst_frac_gap)
参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| dst | 输 出 | 目 的 操 作 数。 |
| src | 输 入 | 源 操 作 数。 |
| index_id | 输 入 | 方 块 矩 阵 的ID,搬 运 起 始 位 置 为 源 操 作 数 中 第 几 个 方 块 矩 阵(0为 源 操 作 数 中 第1个 方 块 矩 阵)。取 值 范 围:index_id∈[0, 65535]。 |
| repeat | 输 入 | 迭 代 重 复 次 数。repeat∈[0, 255]。 对 于uint8_t/int8_t数 据 类 型,每 次 迭 代 处 理32 × 32 × 1B数 据; 对 于half/bfloat16_t数 据 类 型,每 次 迭 代 处 理16 × 16 × 2B数 据; 对 于float/int32_t/uint32_t数 据 类 型,每 次 迭 代 处 理16 × 16 × 4B数 据。 |
| src_stride | 输 入 | 表 示 相 邻 迭 代 间,源 操 作 数 前 一 个 方 块 矩 阵 与 后 一 个 方 块 矩 阵 起 始 地 址 的 间 隔,单 位:(1024B)。取 值 范 围:src_stride∈[0, 65535]。 对 于uint8_t/int8_t数 据 类 型,单 位 是32 × 32 × 1B; 对 于half/bfloat16_t数 据 类 型,单 位 是16 × 16 × 2B; 对 于float/int32_t/uint32_t数 据 类 型,单 位 是16 × 16 × 4B; 对 于int4b_t数 据 类 型,每 次 迭 代 处 理16 × 64 × 0.5B数 据。 |
| dst_gap | 输 入 | 表 示 相 邻 迭 代 间,目 的 操 作 数 前 一 个 迭 代 第 一 个 分 形 的 结 束 地 址 到 下 一 个 迭 代 第 一 个 分 形 起 始 地 址 的 间 隔。取 值 范 围:dst_gap∈[0, 65535]。 |
| addrmode | 输 入 | 控 制 地 址 更 新 方 式。 false: 递 增,每 次 迭 代 在 前 一 个 地 址 的 基 础 上 加 上src_stride。 true: 递 减,每 次 迭 代 在 前 一 个 地 址 的 基 础 上 减 去src_stride。 |
| dst_frac_gap | 输 入 | 每 个 迭 代 内 目 的 操 作 数 转 置 前 一 个 分 形 结 束 地 址 与 后 一 个 分 形 起 始 地 址 的 间 隔,单 位 为512B,仅 在 数 据 类 型 为float/int32_t/uint32_t/uint8_t/int8_t时 有 效。 |
返 回 值 说 明
无
流 水 类 型
PIPE_MTE1
约 束 说 明
- repeat=0表 示 不 执 行 搬 运 操 作。
- 开 发 者 需 要 保 证 目 的 操 作 数 转 置 后 的 分 形 没 有 重 叠。
调 用 示 例
C++
// 设 置 源 操 作 数 和 目 的 操 作 数,total_length指 参 与 计 算 的 数 据 长 度
constexpr uint64_t total_length = 512;
__cbuf__ int32_t src[total_length];
__cb__ int32_t dst[total_length];
// 设 置 搬 运 过 程 中 的 配 置
uint8_t n = 64;
uint8_t nBlockSize = 32;
uint8_t repeat = n / nBlockSize;
uint16_t index_id = 0;
uint16_t src_stride = 1;
uint16_t dst_gap = 1;
bool addrmode = false;
uint64_t dst_frac_gap = 0;
// 搬 运 过 程
asc_copy_l12l0a_trans(dst, src, index_id, repeat, src_stride, dst_gap, addrmode, dst_frac_gap);