Skip to content
版 本

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

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