Skip to content
版 本

asc_loadalign_deintlv_postupdate

产 品 支 持 情 况

产 品是 否 支 持
Ascend 950PR/Ascend 950DT支 持

功 能 说 明

asc_loadalign_deintlv_postupdate用 于 从UB中 读 取 以32B对 齐 地 址src为 起 始 位 置 的 连 续2 x VL长 度 数 据。数 据 按 元 素 类 型 宽 度 进 行 解 释,在Load过 程 中 完 成 解 交 织 后,分 别 写 入 两 个 目 的 向 量 寄 存 器dst0dst1

asc_loadalign_deintlv不 同,该 接 口 在 完 成 数 据 加 载 后,会 对 源 地 址 参 数src执 行 后 更 新 操 作:

C++
src = src + offset

其 中,offset的 单 位 为 元 素 个 数,实 际 地 址 偏 移 字 节 数 为:offset * sizeof(data_type)

float数 据 类 型、Ascend 950PR/Ascend 950DT产 品 为 例,若VL = 256Bsrc = 32offset = 128,调 用asc_loadalign_deintlv_postupdate后,数 据 从UB到Reg的 排 布 如 下 图 所 示,同 时src会 更 新 为544,可 直 接 用 于 后 续 计 算。

提 示:

  1. 使 用 本 接 口 需 要 包 含 头 文 件reg_load.h
  2. 本 接 口 会 修 改 输 入 的UB地 址 参 数src。若 需 要 保 留 原 始 地 址,请 使 用asc_loadalign_deintlv

函 数 原 型

支 持 的 数 据 类 型 请 参 见数 据 类 型章 节。

C++
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int4x2_t& dst0, vector_int4x2_t& dst1, __ubuf__ int4b_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(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_postupdate(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_postupdate(vector_int8_t& dst0, vector_int8_t& dst1, __ubuf__ int8_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint8_t& dst0, vector_uint8_t& dst1, __ubuf__ uint8_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(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_postupdate(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_postupdate(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_postupdate(vector_hifloat8_t& dst0, vector_hifloat8_t& dst1, __ubuf__ hifloat8_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int16_t& dst0, vector_int16_t& dst1, __ubuf__ int16_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint16_t& dst0, vector_uint16_t& dst1, __ubuf__ uint16_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_half& dst0, vector_half& dst1, __ubuf__ half*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_bfloat16_t& dst0, vector_bfloat16_t& dst1, __ubuf__ bfloat16_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int32_t& dst0, vector_int32_t& dst1, __ubuf__ int32_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint32_t& dst0, vector_uint32_t& dst1, __ubuf__ uint32_t*& src, int32_t offset)
__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_float& dst0, vector_float& dst1, __ubuf__ float*& src, int32_t offset)

参 数 说 明

参 数 名输 入/输 出说 明
dst0输 出第 一 个 目 的 向 量 寄 存 器。
dst1输 出第 二 个 目 的 向 量 寄 存 器。
src输 入/输 出源 数 据 在UB中 的 起 始 地 址,要 求32B对 齐。接 口 执 行 完 成 后,src会 更 新 为src + offset
offset输 入地 址 偏 移 量,单 位 为 元 素 个 数。

向 量 寄 存 器 类 型 的 详 细 说 明 请 参 见reg数 据 类 型 定 义.md

数 据 类 型

asc_loadalign_deintlv_postupdate支 持 的 数 据 类 型 如 下 表 所 示。

源 数 据 类 型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

约 束 说 明

  • src必 须 为32B对 齐 地 址,且 访 问 范 围 不 能 超 过UB有 效 地 址 上 界 减 去2 x VL,否 则 可 能 导 致UB越 界 访 问。
  • 在 循 环 中 使 用 本 接 口 时,offset的 取 值 需 要 保 证 更 新 后 的src仍 满 足32B对 齐 要 求。
  • offset以 元 素 为 单 位,实 际 地 址 步 长 需 要 结 合 源 数 据 类 型 宽 度 进 行 换 算。

调 用 示 例

从UB中 连 续 读 取 以32B对 齐 地 址src为 起 始 位 置 的float数 据,并 在 每 次 调 用 后 自 动 更 新 地 址。

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

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