CrossCoreWaitFlag(ISASI)
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_block_sync_intf.h"。
在 核 间 同 步 场 景 中,CrossCoreSetFlag接 口 和CrossCoreWaitFlag接 口 配 对 工 作,具 体 功 能 请 参 考CrossCoreSetFlag。
函 数 原 型
template <uint8_t modeId = 0, pipe_t pipe = PIPE_S>
__aicore__ inline void CrossCoreWaitFlag(uint16_t flagId)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| modeId | 核 间 同 步 的 模 式,支 持 的 取 值 如 下: • 模 式0:AI Core核 间 的 同 步 控 制(所 有AIC之 间 或 者 所 有AIV之 间)。 • 模 式1:AI Core内 部,Vector核(AIV)之 间 的 同 步 控 制。 • 模 式2:AI Core内 部,Cube核(AIC)与 所 有Vector核(AIV)之 间 的 同 步 控 制。 • 模 式4:AI Core内 部,AIC与 单 个AIV之 间 的 同 步 控 制。AIV0与AIV1可 单 独 触 发AIC等 待。 各 个 模 式 支 持 的 对 应Kernel类 型 请 参 照 表3。 |
| pipe | 设 置 这 条 指 令 所 在 的 流 水 类 型。模 式0、1、2支 持 的 流 水 类 型 为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX,不 支 持PIPE_S和PIPE_ALL。 针 对Ascend 950PR/Ascend 950DT,模 式4相 较 其 他 三 种 模 式 额 外 支 持PIPE_S流 水 类 型。 |
表 2 参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| flagId | 输 入 | 核 间 同 步 的 标 记。 • Ascend 950PR/Ascend 950DT,取 值 范 围 如 下: • AIV0发 起 的flagId 0-10的CrossCoreSetFlag操 作 对 应AIC CrossCoreWaitFlag中flagId 0-10的 操 作。 • AIV1发 起 的flagId 0-10的CrossCoreSetFlag操 作 对 应AIC CrossCoreWaitFlag中flagId 16-26的 操 作。 • AIC发 起 的flagId 0-10的CrossCoreSetFlag操 作 对 应AIV0 CrossCoreWaitFlag中flagId 0-10的 操 作。 • AIC发 起 的flagId 16-26的CrossCoreSetFlag操 作 对 应AIV1 CrossCoreWaitFlag中flagId 0-10的 操 作。 • Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,取 值 范 围 是0-10。 • Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,取 值 范 围 是0-10。 |
返 回 值 说 明
无
约 束 说 明
- 不 同 产 品 版 本 下,CrossCoreWaitFlag接 口 对 核 间 同 步 模 式 和 流 水 类 型 的 配 置 支 持 情 况 如 下:
- Ascend 950PR/Ascend 950DT,硬 件 支 持 配 置 核 间 同 步 模 式 和 流 水 类 型,模 板 参 数modeId和pipe生 效。模 式0、1、2支 持 的 流 水 类 型 为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX;模 式4相 较 其 他 三 种 模 式 额 外 支 持PIPE_S流 水 类 型。
由 于 当Kernel类 型 为KERNEL_TYPE_AIC_ONLY或 KERNEL_TYPE_AIV_ONLY时,硬 件 不 会 开 启 调 度 模 块,也 就 无 法 正 常 进 行 核 间 同 步,因 此 不 同 的 同 步 模 式 配 置Kernel类 型或函 数 修 饰 符的 情 况 如 不:
在 纯Vector/Cube场 景 下(模 式0或 模 式1),建 议 设 置Kernel类 型 为KERNEL_TYPE_MIX_AIV_1_0或KERNEL_TYPE_MIX_AIC_1_0,其 它 支 持 的Kernel类 型 请 参 考 表3。
对 于Vector和Cube混 合 场 景(模 式2),需 根 据AI Core中AIC和AIV的 比 例 灵 活 配 置Kernel类 型,不 同 模 式 支 持 的 函 数 修 饰 符 和Kernel类 型 请 参 照 表3。
表 3 模 式 与 支 持 的Kernel类 型 配 置
模 式 支 持 的 函 数 修 饰 符 支 持 的Kernel类 型 配 置 0 __mix__(0, 1),__mix__(1, 0), __mix__(1, 1),__mix__(1, 2) KERNEL_TYPE_MIX_AIV_1_0, KERNEL_TYPE_MIX_AIC_1_0,KERNEL_TYPE_MIX_AIC_1_1, KERNEL_TYPE_MIX_AIC_1_2 1 __mix__(1, 1),__mix__(1, 2) KERNEL_TYPE_MIX_AIC_1_1, KERNEL_TYPE_MIX_AIC_1_2 2 __mix__(1, 1),__mix__(1, 2) KERNEL_TYPE_MIX_AIC_1_1, KERNEL_TYPE_MIX_AIC_1_2
CrossCoreWaitFlag必 须 与CrossCoreSetFlag接 口 配 合 使 用,避 免 计 算 核 一 直 处 于 阻 塞 阶 段。
接 口 使 用 模 式0、1、2,需 要 避 免flagId使 用 冲 突:
Matmul高 阶API内 部 实 现 中 使 用 了CrossCoreSetFlag进 行 核 间 同 步 控 制,所 以 不 建 议 开 发 者 同 时 使 用CrossCoreSetFlag和Matmul高 阶API,否 则 会 有flagId冲 突 的 风 险。Matmul高 阶API内 部 占 用 的flagId范 围 与 定 义 的Matmul对 象 数 目 相 关,假 设 定 义 了N个Matmul对 象 数 目,Matmul高 阶API内 部 占 用 的flagId范 围 为[0, 2 * N - 1]。Matmul最 多 支 持 定 义4个 对 象,此 时flagId占 用 范 围 为[0,7]。
SyncAll硬 件 同 步 接 口 内 部 实 现 中 使 用 了CrossCoreSetFlag进 行 核 间 同 步 控 制,所 以 不 建 议 开 发 者 同 时 使 用CrossCoreSetFlag和SyncAll硬 件 同 步 接 口,否 则 会 有flagID冲 突 的 风 险。SyncAll硬 件 同 步 接 口flagId占 用 范 围 为[11-14]。
flagId相 关 的 约 束:
- 对 于 模 式0、1、2,每 个AIC和 每 个AIV都 各 自 有16个flagId,支 持 的 取 值 范 围 为0-15。如 果flagId的 值 超 出 该 范 围,则 会 取 截 取 最 低 位4bit为 准。
- 每 个flagId有 个 对 应 计 数 器,当 调 用CrossCoreWaitFlag时,若 计 数 器 值 为0则 会 阻 塞 后 续 指 令 下 发,已 下 发 指 令 可 正 常 执 行;当 调 度 模 块 感 知 到 核 间 同 步(CrossCoreSetFlag)全 部 完 成 后,会 将 对 应CrossCoreWaitFlag的 计 数 器 的 值 增 加1。此 时,计 数 器 值 为 非0,阻 塞 解 除,并 且 将 对 应 计 数 器 的 值 减 去1进 行 还 原。具 体 执 行 逻 辑 与 细 节 可 以 参 考关 键 特 性 说 明。flagId对 应 的 计 数 器 计 数 范 围 为0-15。如 果 计 数 器 的 值 超 出 该 范 围,则 会 异 常 报 错,中 断 流 程。
模 式0、1、2下,同 一 个flagId用 于 不 同 核 间 同 步 模 式 的 约 束:
- 同 一 核 上,若 同 一 个flagId需 用 于 不 同 核 间 同 步 模 式,须 在 模 式 切 换 前 完 成 前 一 个 模 式 的 所 有 同 步 操 作——即 确 保 该flagId关 联 的 所 有CrossCoreSetFlag与 配 套CrossCoreWaitFlag调 用 均 已 执 行 完 毕。
- 对 于 不 同 的 核,可 以 直 接 将 同 一flagId用 于 不 同 的 核 间 同 步 模 式,具 体 包 括 以 下2种 场 景:
- 多 个AI Core之 间,使 用flagId=0同 步 所 有 的AIC(模 式0);单 个AI Core内,使 用flagId=0同 步 所 有AIV(模 式1)。
- 单 个AI Core内,使 用flagId=0同 步 所 有AIV(模 式1);另 一 个AI Core内,使 用flagId=0同 步AIC与 所 有AIV(模 式2)。
使 用 该 接 口 模 式0时,建 议 开 启batchmode模 式,使 算 子 独 占 全 部 所 需 核 资 源,否 则 可 能 因 满 足 以 下 条 件 导 致 死 锁:
- 多 流 并 发 场 景(≥2条 执 行 流)。
- ≥2个 算 子 并 发 执 行。
- 所 有 并 发 算 子 的 核 数 总 和 超 过 物 理 核 数。
- ≥2个 并 发 算 子 使 用 了 核 间 同 步 功 能。
具 体 而 言,在 多 流 场 景 下,某 条 流 的 核 间 同 步 算 子 虽 分 配 到n个 物 理 核,但 可 能 仅 有n-m个 核 先 被 调 度 执 行,而 其 余m个 核 因 被 其 他 流 的 核 间 同 步 算 子 抢 占 而 尚 未 启 动。先 启 动 的n-m个 核 执 行 到 核 间 同 步 时 等 待 剩 余m核 完 成,而 剩 余m核 因 被 其 他 流 的 核 间 同 步 算 子 占 用 而 无 法 释 放,形 成 死 锁。
Kernel直 调 场 景 下 通 过__schedmode__(mode)限 定 符 来 设 置batchmode模 式;工 程 化 算 子 开 发 场 景 下,通 过TilingContext的SetScheduleMode接 口 来 设 置batchmode模 式,具 体 请 参 考《基 础 数 据 结 构 和 接 口》。
调 用 示 例
表3 样 例 描 述
| SCENARIO_NUM取 值 | 业 务 场 景 | 使 用 的 同 步 模 式 |
|---|---|---|
| 0 | 纯Vector计 算 场 景(16个AIV) | mode0(AIV全 核 同 步) |
| 1 | 纯Vector计 算 场 景(2个AIV) | mode1 |
| 2 | Cube与Vector融 合 计 算 场 景 | mode2(AIC等AIV)、mode2(AIV等AIC)、mode0(AIC全 核 同 步) |
如 上 表 所 示,当SCENARIO_NUM取 不 同 值 时,会 分 别 演 示 纯Vector计 算 场 景 和Cube与Vector融 合 计 算 场 景 下 三 种 同 步 模 式 的 具 体 使 用 方 法,下 面 展 示 了 纯Vector计 算 场 景 的 部 分 调 用 代 码:
AscendC::Muls(xLocal, xLocal, float(AscendC::GetBlockIdx()), this->blockLength);
AscendC::SetFlag<AscendC::HardEvent::V_MTE3>(EVENT_ID0);
AscendC::WaitFlag<AscendC::HardEvent::V_MTE3>(EVENT_ID0);
// UB到GM搬 运 启 用 原 子 累 加。
AscendC::SetAtomicAdd<float>();
// DataCopy属 于PIPE_MTE3流 水 操 作。
AscendC::DataCopy(atomicResultGm, xLocal, this->blockLength);
// 当 本AIV完 成 前 置PIPE_MTE3(DataCopy)流 水 操 作 后,通 知 其 他AIV核,本AIV已 经 完 成。
AscendC::CrossCoreSetFlag<0, PIPE_MTE3>(0);
// 阻 塞 本AIV继 续 往 下 执 行 指 令,直 到 其 他AIV全 部 都 完 成PIPE_MTE3流 水 操 作,才 解 除 阻 塞 往 下 执 行。
AscendC::CrossCoreWaitFlag(0);
// 关 闭 原 子 累 加。
AscendC::SetAtomicNone();
if (AscendC::GetBlockIdx() == 0) {
AscendC::DataCopy(yLocal, atomicResultGm, this->blockLength);
AscendC::SetFlag<AscendC::HardEvent::MTE2_MTE3>(EVENT_ID0);
AscendC::WaitFlag<AscendC::HardEvent::MTE2_MTE3>(EVENT_ID0);
AscendC::DataCopy(atomicResultGm, yLocal, this->blockLength);
return;
}
完 整 样 例 请 参 考CrossCoreSetFlag和CrossCoreWaitFlag核 间 同 步 样 例。