SetAtomicType
功能说明
通过设置模板参数来设定原子操作不同的数据类型。
函数原型
template <typename T> __aicore__ inline void SetAtomicType()
参数说明
参数名 |
输入/输出 |
描述 |
---|---|---|
T |
输入 |
设定不同的数据类型。 Atlas A2训练系列产品/Atlas 800I A2推理产品,支持float/half/int16_t/int32_t/int8_t/bfloat16_t Atlas推理系列产品AI Core,支持float/half/int16_t |
返回值
无
支持的型号
Atlas A2训练系列产品/Atlas 800I A2推理产品
Atlas推理系列产品AI Core
调用示例
本演示示例使用DataCopy从VECOUT搬出到外部dstGlobal时进行原子最小,并调用SetAtomicType修改原子最小的数据类型。 using namespace AscendC; SET_G_CORE_TYPE_IS_AIV static const int data_size = 256; namespace TEST_CASE { template <typename T> class KernelDataCopyAtomicMin { public: __aicore__ inline KernelDataCopyAtomicMin() {} __aicore__ inline void Init(GM_ADDR src0_gm, GM_ADDR src1_gm, GM_ADDR dst_gm) { src0Global.SetGlobalBuffer((__gm__ T *)src0_gm); src1Global.SetGlobalBuffer((__gm__ T *)src1_gm); dstGlobal.SetGlobalBuffer((__gm__ T *)dst_gm); pipe.InitBuffer(queueSrc, 2, data_size * sizeof(T)); } __aicore__ inline void Process() { CopyIn(); Compute(); CopyOut(); } private: __aicore__ inline void CopyIn() { LocalTensor<T> src0local = queueSrc.AllocTensor<T>(); LocalTensor<T> src1local = queueSrc.AllocTensor<T>(); DataCopy(src0local, src0Global, data_size); queueSrc.EnQue(src0local); DataCopy(src1local, src1Global, data_size); queueSrc.EnQue(src1local); } __aicore__ inline void Compute() { LocalTensor<T> src0local = queueSrc.DeQue<T>(); LocalTensor<T> src1local = queueSrc.DeQue<T>(); Abs(src0local, src0local, data_size); Abs(src1local, src1local, data_size); queueSrc.EnQue(src0local); queueSrc.EnQue(src1local); } __aicore__ inline void CopyOut() { LocalTensor<T> dst0Local = queueSrc.DeQue<T>(); LocalTensor<T> dst1Local = queueSrc.DeQue<T>(); DataCopy(dstGlobal, dst1Local, data_size); SetAtomicMin<int8_t>(); // 此处设置的类型可随意,此例中以int8_t为例 SetAtomicType<T>(); // 此处设置真实的数据类型 DataCopy(dstGlobal, dst0Local, data_size); queueSrc.FreeTensor(dst0Local); DataCopy(dstGlobal, dst1Local, data_size); queueSrc.FreeTensor(dst1Local); SetAtomicNone(); } private: TPipe pipe; TQue<QuePosition::VECIN, 2> queueSrc; GlobalTensor<T> src0Global, src1Global, dstGlobal; }; } // namespace TEST_CASE 每个核的输入数据为: Src0: [1,1,1,1,1,...,1] // 256个1 Src1: [2,2,2,2,2,...,2] // 256个2 最终输出数据: [1,1,1,1,1,...,1] // 256个1
父主题: 原子操作