PipeBarrier(ISASI)
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_block_sync_intf.h"。
如 下 图1所 示,完 成 同 一 流 水 线 内 的 同 步 控 制,用 于 在 同 一 流 水 线 内 部 约 束 执 行 顺 序。其 作 用 是,保 证 前 序 指 令 中 所 有 数 据 的 读 写 工 作 全 部 完 成,后 序 指 令 才 能 执 行。
函 数 原 型
template <pipe_t pipe>
__aicore__ inline void PipeBarrier()
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| pipe | 模 板 参 数,表 示 阻 塞 的 流 水 类 别。 支 持 的 流 水 参 考硬 件 流 水 类 型,其 中 不 支 持PIPE_S。 如 果 不 关 注 流 水 类 别,希 望 阻 塞 所 有 流 水,可 以 传 入PIPE_ALL。 |
返 回 值 说 明
无
约 束 说 明
Scalar流 水 之 间 的 同 步 由 硬 件 自 动 保 证,PipeBarrier接 口 不 支 持PIPE_S单 流 水 的 同 步。
PipeBarrier<PIPE_ALL>()会 等 待 所 有 流 水 线 中 所 有 先 前 提 交 的 接 口 完 成,这 会 对 性 能 产 生 影 响。若 仅 阻 塞 单 条 流 水 线 即 可 解 决 问 题,应 避 免 随 意 调 用PipeBarrier<PIPE_ALL>()。PIPE_MTE2/PIPE_MTE3在 搬 运 地 址 有 重 叠 的 情 况 下 需 要 开 发 者 插 入 同 步。例 如,当 需 要 执 行 多 个DataCopy指 令,且DataCopy的 目 的 地 址 存 在 重 叠 时,需 要 通 过 调 用 来 插 入PipeBarrier同 步 指 令,保 证 多 个DataCopy指 令 的 串 行 化,防 止 出 现 异 常 数 据。如 下 图 左 侧 示 意 图,执 行 两 个DataCopy指 令,搬 运 的 目 的GM地 址 存 在 重 叠,两 条 搬 运 指 令 之 间 需 要 通 过 调 用
PipeBarrier<PIPE_MTE3>()添 加MTE3搬 出 流 水 的 同 步;如 下 图 右 侧 示 意 图 所 示,搬 运 的 目 的 地 址UB存 在 重 叠,两 条 搬 运 指 令 之 间 需 要 调 用PipeBarrier<PIPE_MTE2>()添 加MTE2搬 入 流 水 的 同 步。

调 用 示 例
如 下 示 例,Mul指 令 的 输 入dst0Local是Add指 令 的 输 出,两 个 矢 量 运 算 指 令 产 生 依 赖,需 要 插 入PipeBarrier保 证 两 条 指 令 的 执 行 顺 序。
注:仅 作 为 示 例 参 考,开 启 自 动 同 步(Kernel直 调 算 子 工 程 和 自 定 义 算 子 开 发 工 程 已 默 认 开 启)的 情 况 下,编 译 器 自 动 插 入PIPE_V同 步,无 需 开 发 者 手 动 插 入。
图 2 Mul指 令 和Add指 令 是 串 行 关 系,必 须 等 待Add指 令 执 行 完 成 后,才 能 执 行Mul指 令。
AscendC::LocalTensor<half> src0Local;
AscendC::LocalTensor<half> src1Local;
AscendC::LocalTensor<half> src2Local;
AscendC::LocalTensor<half> dst0Local;
AscendC::LocalTensor<half> dst1Local;
AscendC::Add(dst0Local, src0Local, src1Local, 512);
AscendC::PipeBarrier<PIPE_V>();
AscendC::Mul(dst1Local, dst0Local, src2Local, 512);
