SyncAll
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_block_sync_intf.h"。
SyncAll是 核 间 同 步 控 制 接 口,根 据 不 同 的 函 数 原 型 介 绍 其 功 能:
硬 件 同 步 接 口:
用 于 多 个 核 之 间 的 同 步 控 制,支 持 以 下 同 步 场 景:
- 纯Vector算 子 的 全 核 同 步,可 参 考CrossCoreSetFlag的 模 式0。
- 融 合 算 子 的 全 核 同 步,一 次 性 实 现 三 个 核 间 同 步 能 力(参 考CrossCoreSetFlag的 关 键 特 性 说 明):首 先 完 成 单 个AI Core内,AIC与 所 有AIV同 步(AIC等AIV);接 着 完 成 多 个AI Core间,所 有AIC的 同 步;最 后 完 成 单 个AI Core内,所 有AIV与AIC同 步(AIV等AIC)。
软 件 同 步 接 口:
仅 支 持 纯Vector算 子 的 多 核(参 与 同 步 的 核 数 可 通 过 入 参 指 定)同 步。每 一 个AIV都 向 全 局 内 存 对 应 位 置 写 入 信 号 值1,接 着 每 一 个AIV都 持 续 轮 询 全 局 内 存 中 所 有AIV对 应 的 信 号 值,直 到 所 有AIV核 对 应 的 信 号 值 都 变 为1。
在 纯Vector算 子 场 景 中,若 所 有AIV核 默 认 参 与 同 步,推 荐 采 用 性 能 更 优 的 硬 件 同 步 接 口;若 需 指 定 部 分AIV核 参 与 同 步,则 应 使 用 软 件 同 步 接 口,并 通 过 入 参usedCores完 成 配 置。
函 数 原 型
软 同 步
C++template <bool isAIVOnly = true> __aicore__ inline void SyncAll(const GlobalTensor<int32_t>& gmWorkspace, const LocalTensor<int32_t>& ubWorkspace, const int32_t usedCores = 0)硬 同 步
C++template <bool isAIVOnly = true> __aicore__ inline void SyncAll()以 下 函 数 原 型 仅 支 持Ascend 950PR/Ascend 950DT型 号。
C++template <bool isAIVOnly = true, const SyncAllConfig& config = DEFAULT_SYNC_ALL_CONFIG> __aicore__ inline void SyncAll()
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| isAIVOnly | 控 制SyncAll作 用 于 纯Vector算 子 或 融 合(Cube和Vector融 合)算 子。可 选 值: • true(默 认 值):纯Vector算 子 的 全 核 同 步,仅 执 行Vector核 的 全 核 同 步。 • false:融 合 算 子 的 全 核 同 步,先 分 别 完 成Vector核 和Cube核 的 全 核 同 步,再 执 行 两 者 之 间 的 同 步(软 同 步 接 口 不 支 持 此 功 能)。 |
config | 该 参 数 仅 在Ascend 950PR/Ascend 950DT上 支 持。 控 制SyncAll函 数 的 行 为,在 多 个AI Core之 间 进 行 流 水 线 同 步 时,指 定 哪 些 管 道(pipe)用 于 触 发 和 等 待。 • triggerPipe:指 定 哪 个 管 道 用 于”发 送 触 发 信 号“。 • waitPipe:指 定 哪 个 管 道 用 于”接 收 等 待 信 号“。 默 认 为SyncAllConfig DEFAULT_SYNC_ALL_CONFIG= {PIPE_ALL, PIPE_ALL},使 用 全 部 管 道 来 进 行 触 发 和 等 待 行 为。 |
表 2 参 数 说 明
| 参 数 名 称 | 输 入/输 出 | 含 义 |
|---|---|---|
| gmWorkspace | 输 入 | gmWorkspace为 用 户 定 义 的 全 局 空 间,作 为 所 有 核 共 用 的 缓 存,用 于 保 存 每 个 核 的 状 态 标 记,类 型 为GlobalTensor,支 持 的 数 据 类 型 为int32_t。GlobalTensor数 据 结 构 的 定 义 请 参 考GlobalTensor。 所 需 空 间 大 小 和 使 用 注 意 项 参 见约 束 说 明。 硬 同 步 接 口 不 支 持 该 参 数。 |
| ubWorkspace | 输 入 | ubWorkspace为 用 户 定 义 的 局 部 空 间,每 个 核 单 独 自 用,用 于 标 记 当 前 核 的 状 态。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT,支 持 的 数 据 类 型 为int32_t。 所 需 空 间 大 小 参 见约 束 说 明。 硬 同 步 接 口 不 支 持 该 参 数。 |
| usedCores | 输 入 | 指 定 多 少 个 核 之 间 的 同 步,传 入 数 值 不 能 超 过 算 子 调 用 时 指 定 的 逻 辑numBlocks。此 参 数 为 默 认 参 数,不 传 此 参 数 表 示 全 核 软 同 步。 仅 在 软 同 步 接 口 中 支 持,硬 同 步 接 口 不 支 持 该 参 数。 |
返 回 值 说 明
无
约 束 说 明
SyncAll硬 件 同 步 和 软 件 同 步 接 口 的 内 部 实 现 不 同,约 束 条 件 也 有 所 区 别。
软 件 同 步 接 口 约 束:
- gmWorkspace缓 存 申 请 的 空 间 大 小 要 求 大 于 等 于GetBlockNum()*32Bytes,并 且 缓 存 的 值 需 要 初 始 化 为0。目 前 常 见 的 有 两 种 初 始 化 方 式:
- 通 过 在host侧 进 行 初 始 化 操 作,确 保 传 入 该 接 口 时,gmWorkspace缓 存 已 经 初 始 化 为0;
- 在kernel侧 初 始 化 的 时 候 对gmWorkspace缓 存 初 始 化,需 要 注 意 的 是,每 个 核 上 都 需 要 初 始 化 全 部 的gmWorkspace缓 存 空 间。
- ubWorkspace申 请 的 空 间 大 小 要 求 大 于 等 于GetBlockNum()*32Bytes。
- 在 纯Vector算 子 场 景 中,若 所 有AIV核 默 认 参 与 同 步,推 荐 采 用 性 能 更 优 的 硬 件 同 步 接 口;若 需 指 定 部 分AIV核 参 与 同 步,则 应 使 用 软 件 同 步 接 口,并 通 过 入 参usedCores完 成 配 置。
- usedCores传 入 数 值 不 能 超 过 算 子 调 用 时 指 定 的 逻 辑AI Core中AIV的 数 量:GetBlockNum()*GetTaskRatio(),不 传 此 参 数 表 示 全 核 软 同 步。
- 针 对Ascend 950PR/Ascend 950DT,SyncAll软 同 步 接 口 内 部 实 现 中 标 量 单 元 连 续 读 取 相 同GM地 址 时 用 于 进 行 多 核 同 步,会 造 成Bus被 长 期 占 用,导 致 其 他 核 无 法 访 问 该GM,导 致 多 核 读 同 一GM出 现 卡 死 现 象。若 需 要Polling,建 议 在 该 使 用 接 口 间,增 加Nop指 令,指 令 量 建 议 为800个,一 般 为 需 要 同 步 的 核 数 * 200。
- gmWorkspace缓 存 申 请 的 空 间 大 小 要 求 大 于 等 于GetBlockNum()*32Bytes,并 且 缓 存 的 值 需 要 初 始 化 为0。目 前 常 见 的 有 两 种 初 始 化 方 式:
硬 件 同 步 接 口 约 束:
使 用 硬 同 步 接 口 时,需 根 据 场 景 使 用 合 适 的 核 函 数 修 饰 符:
- 在 纯Vector算 子,需 使 用__mix__(0, 1)修 饰 核 函 数,而 不 是 使 用__vector__,具 体 原 因 请 参 考。
- 对 于Mix(包 含Cube和Vector计 算)算 子,需 使 用__mix__(1, 1)或__mix__(1, 2)修 饰 核 函 数。
对 于 纯Vector算 子,模 板 参 数isAIVOnly必 须 设 置 为true,否 则 会 导 致 程 序 卡 死。
对 于Mix(包 含Cube和Vector计 算)算 子,模 板 参 数isAIVOnly设 置 为true,会 导 致 接 口 实 际 只 能 完 成Vector全 核 同 步 与 预 期 同 步 行 为 不 符。
使 用 该 接 口 时,建 议 开 启batchmode模 式,使 算 子 独 占 全 部 所 需 核 资 源,否 则 可 能 因 满 足 以 下 条 件 导 致 死 锁:
- 多 流 并 发 场 景(≥2条 执 行 流)。
- ≥2个 算 子 并 发 执 行。
- 所 有 并 发 算 子 的 核 数 总 和 超 过 物 理 核 数。
- ≥2个 并 发 算 子 使 用 了 核 间 同 步 功 能。
具 体 而 言,在 多 流 场 景 下,某 条 流 的 核 间 同 步 算 子 虽 分 配 到n个 物 理 核,但 可 能 仅 有n-m个 核 先 被 调 度 执 行,而 其 余m个 核 因 被 其 他 流 的 核 间 同 步 算 子 抢 占 而 尚 未 启 动。先 启 动 的n-m个 核 执 行 到 核 间 同 步 时 等 待 剩 余m核 完 成,而 剩 余m核 因 被 其 他 流 的 核 间 同 步 算 子 占 用 而 无 法 释 放,形 成 死 锁。 Kernel直 调 场 景 下 通 过__schedmode__(mode)限 定 符 来 设 置batchmode模 式;工 程 化 算 子 开 发 场 景 下,通 过TilingContext的SetScheduleMode接 口 来 设 置batchmode模 式,具 体 请 参 考《基 础 数 据 结 构 和 接 口》。
SyncAll硬 件 同 步 接 口 内 部 实 现 中 使 用 了CrossCoreSetFlag进 行 核 间 同 步 控 制,所 以 不 建 议 开 发 者 同 时 使 用CrossCoreSetFlag和SyncAll硬 件 同 步 接 口,否 则 会 有flagID冲 突 的 风 险。SyncAll硬 件 同 步 接 口flagId占 用 范 围 为[11-14]。
硬 件 同 步 接 口 和 软 件 同 步 接 口 公 共 约 束:使 用 该 接 口 进 行 多 核 控 制 时,算 子 调 用 时 指 定 的 逻 辑AI Core核 数numBlocks必 须 保 证 不 大 于 实 际 运 行 该 算 子 的AI处 理 器 核 数,否 则 框 架 进 行 多 轮 调 度 时 会 插 入 异 常 同 步,导 致Kernel“卡 死”现 象。
调 用 示 例
本 示 例 实 现 功 能 为 使 用8个 核 进 行 数 据 处 理,每 个 核 均 是 处 理32个float类 型 数 据,对 该 数 据 乘2后 再 与 其 他 核 上 进 行 同 样 乘2的 数 据 进 行 相 加,中 间 结 果 保 存 到workGm,因 此 多 个 核 之 间 需 要 进 行 数 据 同 步。此 样 例 中,使 用 软 同 步,入 口 函 数 传 入 的syncGm里 的 值 都 已 经 在host侧 初 始 化 为0。若 以 下 用 例 改 成 使 用 硬 同 步,则 不 需 要 传 入syncGm,并 且 不 需 要 使 用workQueue。
// syncGlobal为 用 户 定 义 的 全 局 空 间,作 为 所 有 核 共 用 的 缓 存,类 型 为GlobalTensor;workLocal为 用 户 定 义 的 局 部 空 间,每 个 核 单 独 自 用,类 型 为LocalTensor。
int srcDataSize = 256; // 参 与 计 算 的 元 素 个 数。
int32_t blockNum = AscendC::GetBlockNum(); // 获 取 核 总 数。
int32_t blockIdx = AscendC::GetBlockIdx(); // 获 取 当 前 工 作 的 核ID。
uint32_t perBlockSize = srcDataSize / blockNum; // 每 个 核 平 分 处 理 相 同 个 数。
// 当 前 工 作 核 计 算 后 的 数 据 先 保 存 到 外 部 工 作 空 间,workGlobal为GlobalTensor,dstLocal为LocalTensor。
AscendC::DataCopy(workGlobal[blockIdx * perBlockSize], dstLocal, perBlockSize);
// 等 待 所 有 核 都 完 成 计 算。
AscendC::SyncAll(syncGlobal, workLocal);
完 整 样 例 请 参 考SyncAll样 例。