AtomicExch
产 品 支 持 情 况
功 能 说 明
在GM内 存 中 执 行 原 子 交 换 操 作。具 体 来 说,它 读 取 指 定GM地 址 上 的 数 据,并 将 新 的 值 存 储 回 同 一 地 址。函 数 返 回 旧 值。
函 数 原 型
Text
template <typename T>
__aicore__ inline T AtomicExch(__gm__ T *address, T value)
参 数 说 明
表 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 value = 2;
uint32_t a = AscendC::AtomicExch(reinterpret_cast<__gm__ uint32_t *>(dstGm), value);
// 先 执 行 完 原 子 操 作 之 后 才 能 进 行 搬 运 操 作,有 数 据 依 赖
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