Skip to content
版 本

CrossCoreWaitFlag(ISASI)

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品

Atlas 200I/500 A2 推 理 产 品

x

Atlas 推 理 系 列 产 品AI Core

x

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

x

功 能 说 明

头 文 件 路 径 为:"basic_api/kernel_operator_block_sync_intf.h"

在 核 间 同 步 场 景 中,CrossCoreSetFlag接 口 和CrossCoreWaitFlag接 口 配 对 工 作,具 体 功 能 请 参 考CrossCoreSetFlag

函 数 原 型

C++
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接 口 对 核 间 同 步 模 式 和 流 水 类 型 的 配 置 支 持 情 况 如 下:
Text
- Ascend 950PR/Ascend 950DT,硬 件 支 持 配 置 核 间 同 步 模 式 和 流 水 类 型,模 板 参 数modeId和pipe生 效。模 式0、1、2支 持 的 流 水 类 型 为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX;模 式4相 较 其 他 三 种 模 式 额 外 支 持PIPE_S流 水 类 型。
- Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,硬 件 不 支 持 配 置 核 间 同 步 模 式 和 流 水 类 型,传 入 该 接 口 的 模 板 参 数modeId和pipe不 生 效。
- Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,硬 件 不 支 持 配 置 核 间 同 步 模 式 和 流 水 类 型,传 入 该 接 口 的 模 板 参 数modeId和pipe不 生 效。
  • 由 于 当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
2Cube与Vector融 合 计 算 场 景mode2(AIC等AIV)、mode2(AIV等AIC)、mode0(AIC全 核 同 步)

如 上 表 所 示,当SCENARIO_NUM取 不 同 值 时,会 分 别 演 示 纯Vector计 算 场 景 和Cube与Vector融 合 计 算 场 景 下 三 种 同 步 模 式 的 具 体 使 用 方 法,下 面 展 示 了 纯Vector计 算 场 景 的 部 分 调 用 代 码:

C++
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核 间 同 步 样 例

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