Skip to content
版 本

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按 源 地 址 的 寻 址 方 式 分 为 以 下 三 类 接 口:基 址 寻 址 接 口标 量 偏 移 寻 址 接 口地 址 寄 存 器 偏 移 寻 址 接 口。支 持 的 数 据 类 型 请 参 见数 据 类 型章 节。

基 址 寻 址 接 口

C++
__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)

C++
__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对 齐 要 求。

C++
__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_tvector_int4x2_t
fp4x2_e1m2_tvector_fp4x2_e1m2_t
fp4x2_e2m1_tvector_fp4x2_e2m1_t
int8_tvector_int8_t
uint8_tvector_uint8_t
fp8_e4m3fn_tvector_fp8_e4m3fn_t
fp8_e5m2_tvector_fp8_e5m2_t
fp8_e8m0_tvector_fp8_e8m0_t
hifloat8_tvector_hifloat8_t
int16_tvector_int16_t
uint16_tvector_uint16_t
halfvector_half
bfloat16_tvector_bfloat16_t
int32_tvector_int32_t
uint32_tvector_uint32_t
floatvector_float

返 回 值 说 明

无。

流 水 类 型

PIPE_V

约 束 说 明

调 用 示 例

从UB中 连 续 读 取 以32B对 齐 地 址src为 起 始 位 置 的float数 据。

基 址 寻 址 接 口

C++
for (uint16_t i = 0; i < repeat_times; i++) {
    asc_loadalign_deintlv(reg0, reg1, src + i * one_repeat_size);
    ...
}

标 量 偏 移 寻 址 接 口

C++
// 方 式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);
    ...
}

地 址 寄 存 器 偏 移 寻 址 接 口

C++
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);
    ...
}

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