ndrange的工作项目数量

NDRange Number of work-items

本文关键字:项目数 工作 ndrange      更新时间:2023-10-16

我正在尝试使用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);

给出segfault。

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

运行正常,但仅退还图像的一部分。

我在这里缺少什么?

正如您已经正确说明的那样,您的cl_device_max_work_group_size少于要启动的线程数。SEGFAULT指示运行时的错误。如果在代码文件开头添加以下定义(在包含任何OpenCL标题之前),则可以从OpenCL中获取C 错误。

#define __CL_ENABLE_EXCEPTIONS 

第二行代码显然仅复制图像的第一个10000像素,而不是所有60000。P>

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

此外,我不确定将本地工作组大小设置为nullrange的效果。由于本地工作组的大小在您的情况下并不重要,因此我认为最好只忽略此参数并使用只有3个参数的enqueueNDRangeKernel版本(省略最后一个)。