c++ - Opencl atomic_add() 函数返回错误值

标签 c++ c opencl

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

我的内核代码是:

__kernel void kernelfunction(__global uint32_t* buffer){

buffer[3] = 100;

atomic_add(&buffer[3], 1);

...

}

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

我尝试过的:

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

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : 启用

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

你能帮帮我吗? 谢谢

最佳答案

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

buffer[3] = 100;

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

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

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

关于c++ - Opencl atomic_add() 函数返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028018/

相关文章:

c - C 语言中 NULL 总是为零吗?

opencl - 内置函数 isequal、isnotequal、isgreater 等有什么意义?

android - 带有Android OpenCV SDK的OpenCL和GPU

struct - OpenCL floatn 与自定义结构有何不同

c++ - 使用 std::bind 从 BinaryPredicate 创建 UnaryPredicate 以在 std::transform 中使用

c++ - 缓存对象

c - 如何在c中的数组中存储多个字符串

c++ - 具有 min()/max() 调用的代码出现奇怪的 C++ 错误

c++ - 在 Visual Studio Code 中设置相对于工作区路径的 c/c++ 项目路径(.json 配置)

c++ - 硬件加速 Unicode 文本渲染