gpt4 book ai didi

c++ - NDRange 工作项数

转载 作者:行者123 更新时间:2023-11-28 00:34:10 24 4
gpt4 key购买 nike

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

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

我在这里错过了什么?

最佳答案

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

#define __CL_ENABLE_EXCEPTIONS 

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

一般来说,我建议要么使用 cl::copy 来复制图像,要么修改内核以在每个线程中复制多个像素。

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

关于c++ - NDRange 工作项数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612136/

24 4 0
文章推荐: c++ - vector 与数组(速度)
文章推荐: javascript - 使用 select2 设置