AtomicCas
产 品 支 持 情 况
功 能 说 明
调 用 该 接 口 后,可 在 指 定GM地 址 上 进 行 原 子 比 较,如 果 和value1相 等,则 把value2的 值 赋 值 到GM上;如 果 和value1不 相 等,则GM上 的 值 不 变。
函 数 原 型
Text
template <typename T>
__aicore__ inline T AtomicCas(__gm__ T *address, T value1, T value2)
参 数 说 明
表 1 模 板 参 数 说 明
表 2 参 数 说 明
返 回 值 说 明
GM地 址 上 做 原 子 操 作 前 的 数 据。
约 束 说 明
原 子 操 作 涉 及 标 量 计 算,如 果 标 量 计 算 单 元 和 搬 运 单 元(MTE2/MTE3)在 读 写GM时 存 在 数 据 依 赖,开 发 者 需 要 根 据 实 际 情 况 插 入 同 步。
调 用 示 例
更 多 样 例 请 参 见ScalarAtomicOperations样 例。
Text
// 传 入 全 局 数 据 地 址,初 始 化dstGlobal与dstLocal
dstGlobal.SetGlobalBuffer(reinterpret_cast<__gm__ T *>(dstGm), dataSize);
LocalTensor<T> dstLocal = inQueueX.AllocTensor<T>();
uint32_t value1 = 1;
uint32_t value2 = 2;
uint32_t a = AscendC::AtomicCas(reinterpret_cast<__gm__ uint32_t *>(dstGm), value1, value2);
// 先 执 行 完 原 子 操 作 之 后 才 能 进 行 搬 运 操 作,有 数 据 依 赖
event_t eventIdSToMte2 = static_cast<event_t>(GetTPipePtr()->AllocEventID<HardEvent::S_MTE2>());
// 手 动 插 入MTE2等 待Scalar的 同 步
SetFlag<HardEvent::S_MTE2>(eventIdSToMte2);
WaitFlag<HardEvent::S_MTE2>(eventIdSToMte2);
DataCopy(dstLocal, dstGlobal, dataSize);
// ...
假 设 上 述 函 数 在3个 核 上 执 行,核1、核2、核3依 次 调 度,结 果 示 例 如 下:
Text
原GM数 据dst: [1,1,1,1,1,...,1]
核1:
原 子 计 算 后GM数 据dst: [2,1,1,1,1,...,1]
返 回 值 a: 1
核2:
原 子 计 算 后GM数 据dst: [2,1,1,1,1,...,1]
返 回 值 a: 2
核3:
原 子 计 算 后GM数 据dst: [2,1,1,1,1,...,1]
返 回 值 a: 2