Skip to content
版 本

AtomicCas

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

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

x

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

x

Atlas 200I/500 A2 推 理 产 品

x

Atlas 推 理 系 列 产 品AI Core

x

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

x

功 能 说 明

调 用 该 接 口 后,可 在 指 定GM地 址 上 进 行 原 子 比 较,如 果 和value1相 等,则 把value2的 值 赋 值 到GM上;如 果 和value1不 相 等,则GM上 的 值 不 变。

函 数 原 型

Text
template <typename T>
__aicore__ inline T AtomicCas(__gm__ T *address, T value1, T value2)

参 数 说 明

表 1 模 板 参 数 说 明

参 数 名

描 述

T

操 作 数 数 据 类 型。

Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:uint32_t/uint64_t

表 2 参 数 说 明

参 数 名

输 入/输 出

描 述

address

输 入

输 入GM的 地 址。

value1/value2

输 入

标 量 值,支 持 数 据 类 型 和address指 向 的 数 据 类 型 保 持 一 致。

返 回 值 说 明

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

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