NDRange工作项数

时间:2014-02-06 19:27:15

标签: c++ opencl

我正在尝试使用OpenCL复制图像:

std::string kernelCode =
            "void kernel copy(global const int* image, global int* result)"
            "{"
                "result[get_global_id(0)] = image[get_global_id(0)];"
            "}";

图像包含200 * 300像素。

根据CL_DEVICE_MAX_WORK_GROUP_SIZE

,最大工作项数为4100

在队列中:

int size = _originalImage.width() * _originalImage.height();
//...
queue.enqueueNDRangeKernel(imgProcess, cl::NullRange, cl::NDRange(size), cl::NullRange);

给出了段错误。

queue.enqueueNDRangeKernel(imgProcess, cl::NullRange, cl::NDRange(10000), cl::NullRange);

运行良好,但它只返回部分图像。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

正如您已经正确说明的那样,您的CL_DEVICE_MAX_WORK_GROUP_SIZE小于您要启动的线程数。段错误表示运行时出错。如果在代码文件的开头添加以下定义(在包含任何OpenCL标头之前),则可以从OpenCL获得C ++错误。

#define __CL_ENABLE_EXCEPTIONS 

第二行代码显然只复制图像的前10000个像素而不是全部60000个像素。如果只想使用10000个线程,则每次调整NDRange偏移量需要进行六次此调用。

通常我会建议使用cl :: copy复制图像或修改内核以复制每个线程的多个像素。

此外,我不太确定将本地工作组大小设置为NullRange的效果。由于本地工作组大小在您的情况下无关紧要,我认为最好省略此参数并使用仅包含3个参数的enqueueNDRangeKernel版本(省略最后一个参数)。