IBWait
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_block_sync_intf.h"。
当 不 同 核 之 间 操 作 同 一 块 全 局 内 存 且 可 能 存 在 读 后 写、写 后 读 以 及 写 后 写 等 数 据 依 赖 问 题 时,通 过 调 用 该 函 数 来 插 入 同 步 语 句 来 避 免 上 述 数 据 依 赖 时 可 能 出 现 的 数 据 读 写 错 误 问 题。
调 用IBSet设 置 某 一 个 核 的 标 志 位,与IBWait成 对 使 用,表 示 核 之 间 的 同 步 等 待 指 令:被 等 待 核 中 调 用IBSet,通 过 将 值1写 入 全 局 内 存 中 某 块 地 址 来 通 知 等 待 核;而 等 待 核 中 调 用IBWait,持 续 读 取 全 局 内 存 中 相 应 地 址 块 的 值,直 到 其 值 变 为1,从 而 实 现 核 间 同 步。
函 数 原 型
C++
template <bool isAIVOnly = true>
__aicore__ inline void IBWait(const GlobalTensor<int32_t>& gmWorkspace, const LocalTensor<int32_t>& ubWorkspace, int32_t blockIdx, int32_t eventID)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| isAIVOnly | 控 制 是 否 为AIVOnly模 式,默 认 为true。 |
表 2 接 口 参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| gmWorkspace | 输 入 | 外 部 存 储 核 状 态 的 公 共 缓 存,类 型 为GlobalTensor。GlobalTensor数 据 结 构 的 定 义 请 参 考GlobalTensor。 |
| ubWorkspace | 输 入 | 存 储 当 前 核 状 态 的 公 共 缓 存。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 |
| blockIdx | 输 入 | 表 示 等 待 核 的idx号,取 值 范 围:[0, 核 数-1]。 |
| eventID | 输 入 | 用 来 控 制 当 前 核 的set、wait事 件。 |
返 回 值 说 明
无
约 束 说 明
- gmWorkspace申 请 的 空 间 最 少 要 求 为:核 数32ByteseventID_max+blockIdx_max*32Bytes+32Bytes(eventID_max和blockIdx_max分 别 指eventID、blockIdx的 最 大 值)。需 要 注 意 的 是,如 果 是AIVOnly模 式,核 数=GetBlockNum();如 果 是MIX模 式,核 数=GetBlockNum()*2。
- ubWorkspace申 请 的 空 间 最 少 要 求 为:32Bytes。
- 使 用 该 接 口 进 行 多 核 控 制 时,算 子 调 用 时 指 定 的 逻 辑AI Core核 数numBlocks必 须 保 证 不 大 于 实 际 运 行 该 算 子 的AI处 理 器 核 数,否 则 框 架 进 行 多 轮 调 度 时 会 插 入 异 常 同 步,导 致Kernel“卡 死”现 象。
- IBSet和IBWait配 对 使 用 时,除 了ubWorkspace其 余 所 有 参 数 都 必 须 相 同,否 则 程 序 会 在IBWait处 卡 死。
- 分 离 模 式 下,使 用 该 接 口 进 行 两 个 核 间 的 同 步 时,仅 对AIV核 生 效。
- IBSet接 口 的gmWorkspace缓 存 的 值 需 要 初 始 化 为0。
调 用 示 例
完 整 样 例 请 参 考调 用 示 例。