SetAtomicAdd
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
√ |
|
√ |
|
√ |
|
√ |
|
x |
|
√ |
功能说明
调用该接口后,可对后续的从VECOUT/L0C/L1到GM的数据传输开启原子累加,通过模板参数设定不同的累加数据类型。
函数原型
1 2 | template <typename T> __aicore__ inline void SetAtomicAdd() |
参数说明
参数名 |
描述 |
|---|---|
T |
设定不同的累加数据类型。 Atlas 350 加速卡,支持的数据类型为int8_t/int16_t/half/bfloat16_t/int32_t/float;支持的数据通路为VECOUT/L0C Buffer->GM。 |
返回值说明
无
约束说明
- 累加操作完成后,建议通过DisableDmaAtomic关闭原子累加,以免影响后续相关指令功能。
- 该指令执行前不会对GM的数据做清零操作,开发者根据实际的算子逻辑判断是否需要清零,如果需要自行进行清零操作。
调用示例
本示例中,使用DataCopy从VECOUT搬出数据到外部dstGlobal时进行原子累加。为保证原子累加的正确性,在核函数调用前,需要对dstGm清零。
调用示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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>(); // 开启原子累加模式,3个核并行累加 AscendC::SetAtomicAdd<T>(); AscendC::DataCopy(dstGlobal, srcLocal, SIZE); // 关闭原子操作 AscendC::DisableDmaAtomic(); queueSrc.FreeTensor(srcLocal); } |
结果示例如下:
每个核的输入数据Src0: [1,1,1,1,1,...,1] // 256个1 输出数据初始值dstGm:[2,2,2,2,2,...,2] // dstGm初始值设置为2 最终输出数据dstGm: [5,5,5,5,5,...,5] // 256个5,3个核累加