Openclatomic_add() 函数返回错误值

Mah*_*ebi 3 c c++ atomic opencl data-race

我在 OpenCL 1.2 中遇到问题。__global看,我有一个内核中的数组,组大小为 1000。问题是该atomic_add()函数无法正常工作。

我的内核代码是:

__kernel void kernelfunction(__global uint32_t* buffer){

buffer[3] = 100;

atomic_add(&buffer[3], 1);

...

}
Run Code Online (Sandbox Code Playgroud)

如果我创建 1000 个线程,我预计 的值buffer[3]将是 1100,对吗?但程序的行为是未定义的。有时会是 1100,有时是 1064,有时是 1093,...

我尝试过的:

我还启用了 opencl 扩展,如下所示:

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable

但问题依然存在。在另一个项目中,我创建了一个简单的 opencl 项目并且工作atomic_add正常,并且我检查了几乎整个项目配置,但我不知道问题出在哪里。

你能帮助我吗?谢谢

hus*_*sik 6

如果没有原子,简单的访问在对同一元素执行时会出现竞争条件,更糟糕的是,所有数据都可能已缓存在每个计算单元中,并且直到内核结束才更新。

buffer[3] = 100;
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为。结果甚至可能是 101;

如果没有同步命令,即使同一本地组中的线程也无法拥有真实数据。

初始化应该由主机进行,因为 GPU 并发运行线程。不是连续的,不包括原子。或者,您为其自己的组进行初始化(从其他组中不可见)并在barrier(CLK_GLOBAL_MEM_FENCE)其后添加一个,以便同一组中的其他线程可以正确看到它。