【发布时间】: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) 分配它)。
【问题讨论】: