asc_ndim_copy_gm2ub
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
| √ |
功 能 说 明
多 维 数 据 搬 运 接 口,将 数 据 从Global Memory (GM)搬 运 到Unified Buffer (UB)。相 比 于 基 础 数 据 搬 移 接 口,可 以 更 加 自 由 配 置 搬 入 的 维 度 信 息。 本 功 能 最 多 能 处 理5个 维 度,每 个 维 度 都 可 以 单 独 配 置Stride,且 支 持 随 路Padding功 能。相 关 配 置 参 数 有 很 多,需 要 通 过 不 同 的 接 口 传 入。
表1 Stride配 置 涉 及 的 所 有 参 数 及 其 传 入 接 口,其 中i表 示 第i维,可 取 值[0,4]
| 参 数 | 传 入 接 口 | 描 述 |
|---|---|---|
| loopi_size | 本 接 口 | 表 示 每 个 维 度 内,处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loopi_src_stride | asc_set_ndim_loopi_stride | 表 示 每 个 维 度 内,该 源 操 作 数 元 素 与 下 一 个 元 素 间 的 间 隔。 单 位 为 元 素 个 数,取 值 范 围 为[0, 2^40-1]。 |
| loopi_dst_stride | asc_set_ndim_loopi_stride | 表 示 每 个 维 度 内,该 目 的 操 作 数 元 素 与 下 一 个 元 素 间 的 间 隔。 单 位 为 元 素 个 数,取 值 范 围 为[0, 2^20-1]。 |
表2 Padding配 置 涉 及 的 所 有 参 数 及 其 传 入 接 口,其 中i表 示 第i维,可 取 值[0,4]
| 参 数 | 传 入 接 口 | 描 述 |
|---|---|---|
| padding_mode | 本 接 口 | 表 示Padding值 填 取 方 式,类 型 为bool。 • true:使 用 常 数 填 充 方 式,即 所 有Padding值 为 固 定 值pad_value。 • false:使 用 最 近 值 填 充 方 式,即 左 右Padding值 会 选 取 当 前 维 度 最 左 或 最 右 的 值 进 行 填 充。 |
| pad_value | asc_set_ndim_pad_value | 当padding_mode为true时,该 值 将 作 为Padding的 填 充 固 定 值。当padding_mode为false时,该 值 不 生 效。 |
| loopi_lp_count | • 0维:本 接 口 • 1至4维:asc_set_ndim_pad_count | 表 示 每 个 维 度 内,左 侧 需 要 补 齐 的 元 素 个 数。 单 位 为 元 素 个 数,取 值 范 围 为[0, 255]。 |
| loopi_rp_count | • 0维:本 接 口 • 1至4维:asc_set_ndim_pad_count | 表 示 每 个 维 度 内,右 侧 需 要 补 齐 的 元 素 个 数。 单 位 为 元 素 个 数,取 值 范 围 为[0, 255]。 |
以 下 以2维 的 例 子,介 绍 几 个 典 型 使 用 场 景。
2D Padding场 景,使 用 固 定 值 填 充 方 式

2D Padding场 景,使 用 最 近 值 填 充 方 式

2D Transpose场 景

2D Slice场 景

2D BroadCast场 景

函 数 原 型
C++
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ int8_t* dst, __gm__ int8_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ uint8_t* dst, __gm__ uint8_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ fp4x2_e2m1_t* dst, __gm__ fp4x2_e2m1_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ fp4x2_e1m2_t* dst, __gm__ fp4x2_e1m2_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ fp8_e8m0_t* dst, __gm__ fp8_e8m0_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ fp8_e5m2_t* dst, __gm__ fp8_e5m2_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ fp8_e4m3fn_t* dst, __gm__ fp8_e4m3fn_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ int16_t* dst, __gm__ int16_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ uint16_t* dst, __gm__ uint16_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ half* dst, __gm__ half* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ bfloat16_t* dst, __gm__ bfloat16_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ int32_t* dst, __gm__ int32_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ uint32_t* dst, __gm__ uint32_t* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
__aicore__ inline void asc_ndim_copy_gm2ub(__ubuf__ float* dst, __gm__ float* src, uint32_t loop0_size, uint32_t loop1_size, uint32_t loop2_size, uint32_t loop3_size, uint32_t loop4_size, uint8_t loop0_lp_count, uint8_t loop0_rp_count, bool padding_mode, uint8_t cache_mode)
参 数 说 明
表1参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| dst | 输 出 | 目 的UB地 址。 |
| src | 输 入 | 源GM地 址。 |
| loop0_size | 输 入 | 表 示0维 处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loop1_size | 输 入 | 表 示1维 处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loop2_size | 输 入 | 表 示2维 处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loop3_size | 输 入 | 表 示3维 处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loop4_size | 输 入 | 表 示4维 处 理 的 元 素 个 数(不 包 含Padding元 素)。 单 位 为 元 素 个 数,取 值 范 围 为[1, 2^20-1]。 |
| loop0_lp_count | 输 入 | 表 示0维 左 侧 需 要 补 齐 的 元 素 个 数。 单 位 为 元 素 个 数,取 值 范 围 为[0, 255]。 |
| loop0_rp_count | 输 入 | 表 示0维 右 侧 需 要 补 齐 的 元 素 个 数。 单 位 为 元 素 个 数,取 值 范 围 为[0, 255]。 |
| padding_mode | 输 入 | 表 示Padding值 填 取 方 式。 • true:使 用 常 数 填 充 方 式,即 所 有Padding值 为 固 定 值pad_value。 • false:使 用 最 近 值 填 充 方 式,即 左 右Padding值 会 选 取 当 前 维 度 最 左 或 最 右 的 值 进 行 填 充。 |
| cache_mode | 输 入 | L2 cache模 式。 |
返 回 值 说 明
无
流 水 类 型
PIPE_MTE2
约 束 说 明
- src的 起 始 地 址 要 求 按 照 对 应 数 据 类 型 所 占 字 节 数 对 齐。
- dst的 起 始 地 址 要 求32字 节 对 齐。
- 如 果 需 要 执 行 多 条asc_ndim_copy_gm2ub指 令,且asc_ndim_copy_gm2ub指 令 的 目 的 地 址 存 在 重 叠,需 要 插 入 同 步 指 令,保 证 多 个asc_ndim_copy_gm2ub指 令 的 串 行 化,防 止 出 现 异 常 数 据。
- 一 条 指 令 所 能 获 取 的 所 有 数 据 的 地 址 范 围 宽 度 不 能 超 过40位(1TB),即:源 操 作 数 的i维 大 小 为(loopi_lp_size + loopi_size + loopi_rp_size - 1) * loop0_src_stride,目 的 操 作 数 的i维 大 小 为:(loopi_lp_size + loopi_size + loopi_rp_size - 1) * loop0_dst_stride,所 有 的 维 度 的 大 小 加 起 来 不 超 过2^40位。
- 当 每 维 的loopi_dst_stride为 升 序 序 列,则 不 同 循 环 间 的 地 址 空 间 不 能 交 织 或 重 叠。
调 用 示 例
2D Padding场 景,使 用 固 定 值 填 充 方 式 
C++
// total_length指 参 与 搬 运 的 数 据 总 长 度。src是 外 部 输 入 的half类 型 的GM内 存。
constexpr uint64_t total_length = 54;
__ubuf__ half dst[total_length];
uint32_t loop0_size = 3;
uint32_t loop1_size = 4;
uint32_t loop2_size = 1;
uint32_t loop3_size = 1;
uint32_t loop4_size = 1;
uint64_t loop0_src_stride = 1;
uint64_t loop1_src_stride = 3;
uint64_t loop2_src_stride = 0;
uint64_t loop3_src_stride = 0;
uint64_t loop4_src_stride = 0;
uint64_t loop0_dst_stride = 1;
uint64_t loop1_dst_stride = 6;
uint64_t loop2_dst_stride = 0;
uint64_t loop3_dst_stride = 0;
uint64_t loop4_dst_stride = 0;
bool padding_mode = true;
half pad_value = 88.0;
uint8_t loop0_lp_count = 2;
uint8_t loop1_lp_count = 2;
uint8_t loop0_rp_count = 1;
uint8_t loop1_rp_count = 3;
asc_set_ndim_loop0_stride(loop0_dst_stride, loop0_src_stride);
asc_set_ndim_loop1_stride(loop1_dst_stride, loop1_src_stride);
asc_set_ndim_loop2_stride(loop2_dst_stride, loop2_src_stride);
asc_set_ndim_loop3_stride(loop3_dst_stride, loop3_src_stride);
asc_set_ndim_loop4_stride(loop4_dst_stride, loop4_src_stride);
asc_set_ndim_pad_value(pad_value);
asc_ndim_pad_count_config pad_count_config;
pad_count_config.loop1_lp_count = loop1_lp_count;
pad_count_config.loop1_rp_count = loop1_rp_count;
asc_set_ndim_pad_count(pad_count_config);
asc_ndim_copy_gm2ub(dst, src, loop0_size, loop1_size, loop2_size, loop3_size, loop4_size,
loop0_lp_count, loop0_rp_count, padding_mode, 0);