SetAtomicMax(ISASI)
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | x |
| Atlas 推理系列产品AI Core | x |
| Atlas 推理系列产品Vector Core | x |
| Atlas 训练系列产品 | x |
功能说明
头文件路径为:"basic_api/kernel_operator_set_atomic_intf.h"。
设置后续搬运到GM的数据是否执行原子比较:将待拷贝的内容和GM已有内容进行比较,然后将最大值写入GM。SetAtomicMax接口可通过设置模板参数来设定不同的数据类型。
函数原型
template <typename T>
__aicore__ inline void SetAtomicMax()
参数说明
表 1 模板参数说明
| 参数名 | 描述 |
|---|---|
| T | 设定不同的原子最大操作数据类型。 |
数据类型
支持的数据类型为int8_t、int16_t、half、bfloat16_t、int32_t、float。
返回值说明
无
约束说明
- Ascend 950PR/Ascend 950DT,支持的数据通路为UB/L0C Buffer->GM。
- Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持的数据通路为UB/L0C Buffer/L1 Buffer->GM。
- Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持的数据通路为UB/L0C Buffer/L1 Buffer->GM。
- 使用完后,建议通过DisableDmaAtomic关闭原子最大操作,以免影响后续相关功能。
- 该接口执行前不会自动清零GM数据。开发者需根据算子逻辑判断是否清零,如需清零,请在执行前手动完成。
- SetAtomicMax内部已集成与SetAtomicType相同的功能。建议调用上述接口时,通过设置模板参数显式指定原子操作的数据类型,无需额外调用SetAtomicType接口。
调用示例
#include "kernel_operator.h"
constexpr uint32_t SIZE = 256;
__aicore__ inline void CopyIn()
{
AscendC::LocalTensor<T> srcLocal = queueSrc.AllocTensor<T>();
// 清空原子操作的状态
AscendC::DisableDmaAtomic();
AscendC::DataCopy(srcLocal, srcGlobal, SIZE);
queueSrc.EnQue(srcLocal);
// 核间同步
AscendC::SyncAll();
}
__aicore__ inline void CopyOut()
{
AscendC::LocalTensor<T> srcLocal = queueSrc.DeQue<T>();
// 开启原子MAX模式,3个核取最大值
AscendC::SetAtomicMax<T>();
AscendC::DataCopy(dstGlobal, srcLocal, SIZE);
// 关闭原子操作
AscendC::DisableDmaAtomic();
queueSrc.FreeTensor(srcLocal);
}
/*
每个核的输入数据为:
Src0: [1,1,1,1,1,...,1] // 256个1
Src1: [2,2,2,2,2,...,2] // 256个2
最终输出数据: [2,2,2,2,2,...,2] // 256个2
*/