文档
注册

SetAtomicMax

功能说明

原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最大值写入GM。

可通过设置模板参数来设定不同的数据类型。

函数原型

  • 开启原子最大操作

    template <typename T> __aicore__ inline void SetAtomicMax() {}

  • 关闭原子最大操作

    __aicore__ inline void SetAtomicNone();

参数说明

表1 接口参数说明

参数名

输入/输出

描述

T

输入

设定不同的数据类型。

Atlas A2训练系列产品/Atlas 800I A2推理产品,支持float/half/int16_t/int32_t/int8_t/bfloat16_t

返回值

支持的型号

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

约束说明

使用完后,建议关闭原子最大操作,以免影响后续相关功能。

调用示例

本演示示例使用DataCopy从VECOUT搬出到外部dstGlobal时进行原子最大。
using namespace AscendC;
SET_G_CORE_TYPE_IS_AIV
static const int data_size = 256;

namespace TEST_CASE {
template <typename T>
class KernelDataCopyAtomicMax {
public:
    __aicore__ inline KernelDataCopyAtomicMax()
    {}
    __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>();
        SetAtomicMax<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
最终输出数据: [2,2,2,2,2,...,2] // 256个2
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词