【问题标题】:Strange behavior of OpenCL atomic add operationOpenCL 原子添加操作的奇怪行为
【发布时间】:2011-11-02 12:07:57
【问题描述】:

对于一个项目,我不得不深入研究 OpenCL:除了现在我需要原子操作之外,一切进展顺利。 我正在使用最后一个驱动程序在 Nvidia GPU 上执行 OpenCL 代码。 clGetDeviceInfo() 查询 CL_DEVICE_VERSION 返回我: OpenCL 1.0 CUDA,因此我想我必须参考 OpenCL 1.0 规范。

我开始在我的内核中对__global int* vnumber 缓冲区使用atom_add 操作: atom_add(&vnumber[0], 1);。这给了我明显错误的结果。因此,作为附加检查,我将 add 指令移到内核的开头,以便为每个线程执行它。当内核以 512 x 512 线程启动时,vnumber[0] 的内容是:524288,正好是 2 x 512 x 512,是我应该得到的值的两倍。有趣的是,通过将添加操作更改为atom_add(&vnumber[0], 2);,返回值是65536,又是我应该得到的两倍。

是否有人已经经历过类似的事情?我错过了一些非常基本的东西吗?我检查了数据类型的正确性,但看起来没问题(我正在使用*int 缓冲区,并使用sizeof(cl_int) 分配它)。

【问题讨论】:

    标签: opencl atomic gpgpu


    【解决方案1】:

    您正在使用 atom_add,它是本地内存的 OpenCL 1.0 扩展。然而,你正在传递它的全局记忆。相反,请尝试使用 OpenCL 1.1 的 atomic_add,它适用于全局内存。

    【讨论】:

    • 查询我的 CL_DEVICE_VERSION 返回 OpenCL 1.0,因此我指的是这些规范:link。原子作为扩展实现,我的 GPU 支持扩展“cl_khr_global_int32_base_atomics”,因此我想我只能在全局内存缓冲区上使用原子。或者,至少还有全局内存。另外,如果似乎只支持 1.0 版,我可以使用 atomic_add 指令吗?
    • atom_add 和 atomic_add 的区别不在于它适用于全局内存。有 cl_khr_(global or local)_int(size)_(base or extended)_atomics,然后是内置的。您需要根据需要启用全局和/或本地版本。 atom_* 是扩展的,atomic_ 是内置的,还要求指针是 volatile 的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2017-07-27
    • 2012-09-24
    • 2020-02-09
    相关资源
    最近更新 更多