AtomicMin
产 品 支 持 情 况
功 能 说 明
调 用 该 接 口 后,可 在 指 定GM地 址 上 进 行 原 子 比 较 取 小 操 作。
函 数 原 型
Text
template <typename T>
__aicore__ inline T AtomicMin(__gm__ T *address, T value)
参 数 说 明
表 1 模 板 参 数 说 明
Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:int32_t/uint32_t/float/int64_t/uint64_t |
表 2 参 数 说 明
返 回 值 说 明
GM地 址 上 做 原 子 操 作 前 的 数 据。
约 束 说 明
原 子 操 作 涉 及 标 量 计 算,如 果 标 量 计 算 单 元 和 搬 运 单 元(MTE2/MTE3)在 读 写GM时 存 在 数 据 依 赖,开 发 者 需 要 根 据 实 际 情 况 插 入 同 步。
调 用 示 例
更 多 样 例 请 参 见ScalarAtomicOperations样 例。
Text
// 传 入 全 局 数 据 地 址,初 始 化dstGlobal与dstLocal
dstGlobal.SetGlobalBuffer(reinterpret_cast<__gm__ T *>(dstGm), dataSize);
LocalTensor<T> dstLocal = inQueueX.AllocTensor<T>();
int32_t value = 0;
int32_t a = AscendC::AtomicMin(reinterpret_cast<__gm__ int32_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: [0,1,1,1,1,...,1]
返 回 值 a: 1
核2:
原 子 计 算 后GM数 据dst: [0,1,1,1,1,...,1]
返 回 值 a: 0
核3:
原 子 计 算 后GM数 据dst: [0,1,1,1,1,...,1]
返 回 值 a: 0