Skip to content
版 本

asc_mem_bar

产 品 支 持 情 况

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

功 能 说 明

Reg计 算 宏 函 数 内 不 同 流 水 线 之 间 的 同 步 指 令。该 同 步 指 令 指 定 源 流 水 线 和 目 的 流 水 线,如 下 图 所 示,目 的 流 水 线 将 等 待 源 流 水 线 上 所 有 指 令 完 成 才 进 行 执 行。 读 写 场 景 下,当 读 指 令 使 用 的 寄 存 器 和 写 指 令 使 用 的 寄 存 器 相 同 时,可 以 触 发 寄 存 器 保 序,指 令 将 会 按 照 代 码 顺 序 执 行,不 需 要 插 入 同 步 指 令,而 当 使 用 的 寄 存 器 不 同 时,如 果 要 确 保 读 写 指 令 执 行,则 需 要 插 入 同 步 指 令。写 写 场 景 同 理。

SIMD_VF函数内流水线等待示意图.png

函 数 原 型

C++
__simd_callee__ inline void asc_mem_bar(MEM_TYPE mem_type)

参 数 说 明

表1参 数 说 明

参 数 名输 入/输 出描 述
mem_type输 入同 步 流 水 线 的 类 型,类 型 为MEM_TYPE,取 值 范 围 见 表2 mem_type取 值 说 明。

表2 mem_type取 值 说 明(源 流 水 线/目 的 流 水 线 表 示 的 含 义 见 表3 Reg计 算 流 水 线 说 明)

源 流 水 线目 的 流 水 线
VV_ALLVEC_ALLVEC_ALL
VST_VLDVEC_STOREVEC_LOAD
VLD_VSTVEC_LOADVEC_STORE
VST_VSTVEC_STOREVEC_STORE
VS_ALLVEC_ALLSCALAR_ALL
VST_LDVEC_STORESCALAR_LOAD
VLD_STVEC_LOADSCALAR_STORE
VST_STVEC_STORESCALAR_STORE
SV_ALLSCALAR_ALLVEC_ALL
ST_VLDSCALAR_STOREVEC_LOAD
LD_VSTSCALAR_LOADVEC_STORE
ST_VSTSCALAR_STOREVEC_STORE
SS_ALLSCALAR_ALLSCALAR_ALL
ST_LDSCALAR_STORESCALAR_LOAD
LD_STSCALAR_LOADSCALAR_STORE
ST_STSCALAR_STORESCALAR_STORE

表3 Reg计 算 流 水 线 说 明

流 水 线含 义
VEC_STORESIMD_VF函 数 内 矢 量 写UB流 水 线。
对 应 寄 存 器 到UB的 搬 运 指 令,例 如asc_store
VEC_LOADSIMD_VF函 数 内 矢 量 读UB流 水 线。
对 应UB到 寄 存 器 的 搬 运 指 令,例 如asc_load
SCALAR_STORESIMD_VF函 数 内 标 量 写UB流 水 线。
对 应 标 量 写 入UB的 指 令,例 如asc_duplicate_scalar
SCALAR_LOADSIMD_VF函 数 内 标 量 读UB流 水 线。
对 应UB读 取 标 量 的 指 令。
VEC_ALLSIMD_VF函 数 内 所 有 矢 量 读 写UB流 水 线。
SCALAR_ALLSIMD_VF函 数 内 所 有 标 量 读 写UB流 水 线。

返 回 值 说 明

流 水 类 型

PIPE_S

约 束 说 明

调 用 示 例

如 下 示 例 中,for循 环 中 后 一 次 循 环 中 读UB矢 量 搬 运,和 前 一 次 循 环 中 写UB矢 量 搬 运,操 作 了 同 一 块UB地 址 空 间。因 此 后 一 次 循 环 中 读UB矢 量 搬 运 需 要 等 待 前 一 次 循 环 中 写UB矢 量 搬 运 执 行 完 成 后 才 能 执 行,需 要 插 入VEC_LOAD等 待VEC_STORE的 同 步VST_VLD。

C++
// ub_addr是 外 部 输 入 的UB内 存 空 间 地 址
__ubuf__ half* ub_addr;

vector_half dst;
vector_half src0;
vector_half src1;
vector_bool mask;

uint16_t repeatTime = 8;
uint16_t repeatSize = 64;
for (uint16_t i = 1; i < repeatTime; i++) {
    asc_mem_bar(VST_VLD);
    asc_loadalign(src0, ub_addr[0]);
    asc_loadalign(src1, ub_addr[i * repeatSize]);
    asc_add(dst, src0, src1, mask);
    asc_storealign(ub_addr[0], dst, mask);
}

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