AtomicExch【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品xAtlas A2 训练系列产品 / Atlas A2 推理系列产品xAtlas 200I/500 A2 推理产品xAtlas 推理系列产品 AI CorexAtlas 推理系列产品 Vector CorexAtlas 训练系列产品x功能说明在GM内存中执行原子交换操作。具体来说它读取指定GM地址上的数据并将新的值存储回同一地址。函数返回旧值。函数原型template typename T __aicore__ inline T AtomicExch(__gm__ T *address, T value)参数说明表 1模板参数说明参数名描述T操作数数据类型。Ascend 950PR/Ascend 950DT支持的数据类型为uint32_t/uint64_t表 2参数说明参数名输入/输出描述address输入输入GM的地址。value输入标量值支持数据类型和address指向的数据类型保持一致。返回值说明GM地址上做原子操作前的数据。约束说明原子操作涉及标量计算如果标量计算单元和搬运单元MTE2/MTE3在读写GM时存在数据依赖开发者需要根据实际情况插入同步。调用示例更多样例请参见ScalarAtomicOperations样例。// 传入全局数据地址初始化dstGlobal与dstLocal dstGlobal.SetGlobalBuffer(reinterpret_cast__gm__ T *(dstGm), dataSize); LocalTensorT dstLocal inQueueX.AllocTensorT(); uint32_t value 2; uint32_t a AscendC::AtomicExch(reinterpret_cast__gm__ uint32_t *(dstGm), values); // 先执行完原子操作之后才能进行搬运操作有数据依赖 event_t eventIdSToMte2 static_castevent_t(GetTPipePtr()-AllocEventIDHardEvent::S_MTE2()); // 手动插入MTE2等待Scalar的同步 SetFlagHardEvent::S_MTE2(eventIdSToMte2); WaitFlagHardEvent::S_MTE2(eventIdSToMte2); DataCopy(dstLocal, dstGlobal, dataSize); // ...假设上述函数在3个核上执行核1、核2、核3依次调度结果示例如下原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本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考