我正在尝试使用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
在队列中:
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);
运行良好,但它只返回部分图像。
我在这里缺少什么?
答案 0 :(得分:3)
正如您已经正确说明的那样,您的CL_DEVICE_MAX_WORK_GROUP_SIZE小于您要启动的线程数。段错误表示运行时出错。如果在代码文件的开头添加以下定义(在包含任何OpenCL标头之前),则可以从OpenCL获得C ++错误。
#define __CL_ENABLE_EXCEPTIONS
第二行代码显然只复制图像的前10000个像素而不是全部60000个像素。如果只想使用10000个线程,则每次调整NDRange偏移量需要进行六次此调用。
通常我会建议使用cl :: copy复制图像或修改内核以复制每个线程的多个像素。
此外,我不太确定将本地工作组大小设置为NullRange的效果。由于本地工作组大小在您的情况下无关紧要,我认为最好省略此参数并使用仅包含3个参数的enqueueNDRangeKernel
版本(省略最后一个参数)。