asc_loadalign_deintlv
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
功 能 说 明
asc_loadalign_deintlv用 于 从UB中 读 取 以32B对 齐 地 址 为 起 始 位 置 的 连 续2 x VL长 度 数 据。数 据 按 元 素 类 型 宽 度 进 行 解 释,在Load过 程 中 完 成 解 交 织 后,分 别 写 入 两 个 目 的 矢 量 数 据 寄 存 器。
以float数 据 类 型、Ascend 950PR/Ascend 950DT产 品 为 例,若VL = 256B,则 单 次 操 作 覆 盖64个float元 素。调 用asc_loadalign_deintlv后,数 据 从UB到Reg的 排 布 如 下 图 所 示。

提 示:
使 用 本 接 口 需 要 包 含 头 文 件
reg_load.h。
函 数 原 型
asc_loadalign_deintlv按 源 地 址 的 寻 址 方 式 分 为 以 下 三 类 接 口:基 址 寻 址 接 口、标 量 偏 移 寻 址 接 口、地 址 寄 存 器 偏 移 寻 址 接 口。支 持 的 数 据 类 型 请 参 见数 据 类 型章 节。
基 址 寻 址 接 口
__simd_callee__ inline void asc_loadalign_deintlv(vector_int4x2_t& dst0, vector_int4x2_t& dst1, __ubuf__ int4b_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int8_t& dst0, vector_int8_t& dst1, __ubuf__ int8_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint8_t& dst0, vector_uint8_t& dst1, __ubuf__ uint8_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e2m1_t& dst0, vector_fp4x2_e2m1_t& dst1, __ubuf__ fp4x2_e2m1_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e1m2_t& dst0, vector_fp4x2_e1m2_t& dst1, __ubuf__ fp4x2_e1m2_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_hifloat8_t& dst0, vector_hifloat8_t& dst1, __ubuf__ hifloat8_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e8m0_t& dst0, vector_fp8_e8m0_t& dst1, __ubuf__ fp8_e8m0_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e5m2_t& dst0, vector_fp8_e5m2_t& dst1, __ubuf__ fp8_e5m2_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e4m3fn_t& dst0, vector_fp8_e4m3fn_t& dst1, __ubuf__ fp8_e4m3fn_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int16_t& dst0, vector_int16_t& dst1, __ubuf__ int16_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint16_t& dst0, vector_uint16_t& dst1, __ubuf__ uint16_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_half& dst0, vector_half& dst1, __ubuf__ half* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_bfloat16_t& dst0, vector_bfloat16_t& dst1, __ubuf__ bfloat16_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int32_t& dst0, vector_int32_t& dst1, __ubuf__ int32_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint32_t& dst0, vector_uint32_t& dst1, __ubuf__ uint32_t* src)
__simd_callee__ inline void asc_loadalign_deintlv(vector_float& dst0, vector_float& dst1, __ubuf__ float* src)
标 量 偏 移 寻 址 接 口
源 地 址 通 过src + offset计 算 得 到,且 计 算 结 果 必 须 满 足32B对 齐 要 求。offset的 单 位 为 元 素 个 数,实 际 地 址 偏 移 字 节 数 为:offset * sizeof(data_type)。
__simd_callee__ inline void asc_loadalign_deintlv(vector_int8_t& dst0, vector_int8_t& dst1, __ubuf__ int8_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint8_t& dst0, vector_uint8_t& dst1, __ubuf__ uint8_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e2m1_t& dst0, vector_fp4x2_e2m1_t& dst1, __ubuf__ fp4x2_e2m1_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e1m2_t& dst0, vector_fp4x2_e1m2_t& dst1, __ubuf__ fp4x2_e1m2_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e8m0_t& dst0, vector_fp8_e8m0_t& dst1, __ubuf__ fp8_e8m0_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e5m2_t& dst0, vector_fp8_e5m2_t& dst1, __ubuf__ fp8_e5m2_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e4m3fn_t& dst0, vector_fp8_e4m3fn_t& dst1, __ubuf__ fp8_e4m3fn_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_hifloat8_t& dst0, vector_hifloat8_t& dst1, __ubuf__ hifloat8_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int16_t& dst0, vector_int16_t& dst1, __ubuf__ int16_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint16_t& dst0, vector_uint16_t& dst1, __ubuf__ uint16_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_half& dst0, vector_half& dst1, __ubuf__ half* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_bfloat16_t& dst0, vector_bfloat16_t& dst1, __ubuf__ bfloat16_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int32_t& dst0, vector_int32_t& dst1, __ubuf__ int32_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint32_t& dst0, vector_uint32_t& dst1, __ubuf__ uint32_t* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_float& dst0, vector_float& dst1, __ubuf__ float* src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int4x2_t& dst0, vector_int4x2_t& dst1, __ubuf__ int4b_t* src, int32_t offset)
地 址 寄 存 器 偏 移 寻 址 接 口
该 类 接 口 通 过 地 址 寄 存 器iter_reg offset生 成 实 际 访 问 地 址。地 址 寄 存 器 通 常 在 循 环 场 景 中 使 用,需 配 合asc_create_iter_reg完 成 初 始 化。实 际 访 问 地 址 必 须 满 足32B对 齐 要 求。
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e1m2_t& dst0, vector_fp4x2_e1m2_t& dst1, __ubuf__ fp4x2_e1m2_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp4x2_e2m1_t& dst0, vector_fp4x2_e2m1_t& dst1, __ubuf__ fp4x2_e2m1_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint8_t& dst0, vector_uint8_t& dst1, __ubuf__ uint8_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int8_t& dst0, vector_int8_t& dst1, __ubuf__ int8_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e4m3fn_t& dst0, vector_fp8_e4m3fn_t& dst1, __ubuf__ fp8_e4m3fn_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e5m2_t& dst0, vector_fp8_e5m2_t& dst1, __ubuf__ fp8_e5m2_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_fp8_e8m0_t& dst0, vector_fp8_e8m0_t& dst1, __ubuf__ fp8_e8m0_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_hifloat8_t& dst0, vector_hifloat8_t& dst1, __ubuf__ hifloat8_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint16_t& dst0, vector_uint16_t& dst1, __ubuf__ uint16_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int16_t& dst0, vector_int16_t& dst1, __ubuf__ int16_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_bfloat16_t& dst0, vector_bfloat16_t& dst1, __ubuf__ bfloat16_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_half& dst0, vector_half& dst1, __ubuf__ half* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_uint32_t& dst0, vector_uint32_t& dst1, __ubuf__ uint32_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int32_t& dst0, vector_int32_t& dst1, __ubuf__ int32_t* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_float& dst0, vector_float& dst1, __ubuf__ float* src, iter_reg offset)
__simd_callee__ inline void asc_loadalign_deintlv(vector_int4x2_t& dst0, vector_int4x2_t& dst1, __ubuf__ int4b_t* src, iter_reg offset)
参 数 说 明
| 参 数 名 | 输 入/输 出 | 说 明 |
|---|---|---|
| dst0 | 输 出 | 第 一 个 目 的 向 量 寄 存 器。 |
| dst1 | 输 出 | 第 二 个 目 的 向 量 寄 存 器。 |
| src | 输 入 | 源 数 据 在UB中 的 起 始 地 址。对 于 不 同 寻 址 接 口,src分 别 表 示 基 址 或 参 与 地 址 计 算 的 基 地 址。 |
| offset | 输 入 | 地 址 偏 移 量。对 于 标 量 偏 移 寻 址 接 口,单 位 为 元 素 个 数;对 于 地 址 寄 存 器 偏 移 寻 址 接 口,表 示 地 址 寄 存 器。 |
寄 存 器 类 型 的 详 细 说 明 请 参 见reg数 据 类 型 定 义.md。
数 据 类 型
asc_loadalign_deintlv支 持 的 数 据 类 型 如 下 表 所 示。三 类 寻 址 接 口 均 支 持 表 中 所 列 数 据 类 型。
源 数 据 类 型src | 目 的 寄 存 器 类 型dst0/dst1 |
|---|---|
int4b_t | vector_int4x2_t |
fp4x2_e1m2_t | vector_fp4x2_e1m2_t |
fp4x2_e2m1_t | vector_fp4x2_e2m1_t |
int8_t | vector_int8_t |
uint8_t | vector_uint8_t |
fp8_e4m3fn_t | vector_fp8_e4m3fn_t |
fp8_e5m2_t | vector_fp8_e5m2_t |
fp8_e8m0_t | vector_fp8_e8m0_t |
hifloat8_t | vector_hifloat8_t |
int16_t | vector_int16_t |
uint16_t | vector_uint16_t |
half | vector_half |
bfloat16_t | vector_bfloat16_t |
int32_t | vector_int32_t |
uint32_t | vector_uint32_t |
float | vector_float |
返 回 值 说 明
无。
流 水 类 型
PIPE_V
约 束 说 明
- 对 于基 址 寻 址 接 口,
src必 须 为32B对 齐 地 址,且 访 问 范 围 不 能 超 过UB有 效 地 址 上 界 减 去2 x VL。 - 对 于标 量 偏 移 寻 址 接 口和地 址 寄 存 器 偏 移 寻 址 接 口,实 际 访 问 地 址 必 须 为32B对 齐,且 访 问 范 围 不 能 超 过UB有 效 地 址 上 界 减 去
2 x VL。 - 使 用 地 址 寄 存 器 偏 移 寻 址 接 口 时,需 要 先 通 过
asc_create_iter_reg完 成 地 址 寄 存 器 初 始 化。
调 用 示 例
从UB中 连 续 读 取 以32B对 齐 地 址src为 起 始 位 置 的float数 据。
基 址 寻 址 接 口
for (uint16_t i = 0; i < repeat_times; i++) {
asc_loadalign_deintlv(reg0, reg1, src + i * one_repeat_size);
...
}
标 量 偏 移 寻 址 接 口
// 方 式1:通 过offset控 制 偏 移
for (uint16_t i = 0; i < repeat_times; i++) {
asc_loadalign_deintlv(reg0, reg1, src, i * one_repeat_size);
...
}
// 方 式2:通 过src控 制 偏 移
for (uint16_t i = 0; i < repeat_times; i++) {
asc_loadalign_deintlv(reg0, reg1, src + i * one_repeat_size, 0);
...
}
地 址 寄 存 器 偏 移 寻 址 接 口
iter_reg addr_reg = asc_create_iter_reg_b32(one_repeat_size);
for (uint16_t i = 0; i < repeat_times; i++) {
asc_loadalign_deintlv(reg0, reg1, src, addr_reg);
...
}