SetAtomicMin
功能说明
原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最小值写入GM。
可通过设置模板参数来设定不同的数据类型。
函数原型
参数说明
参数名 |
输入/输出 |
描述 |
|---|---|---|
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 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<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
父主题: 原子操作