在 OpenCL 中,我们如何在内核中发送内存对象或其他参数的地址(在设置内核参数时)并且在内核声明期间不接受它们作为指针?如何将地址分配给非指针数据类型,如下所示:
//在主机代码中设置内核参数:
errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &imageObjects[0]);
errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &imageObjects[1]);
errNum |= clSetKernelArg(kernel, 2, sizeof(cl_sampler), &sampler);
errNum |= clSetKernelArg(kernel, 3, sizeof(cl_int), &width);
errNum |= clSetKernelArg(kernel, 4, sizeof(cl_int), &height);
// 内核声明:
__kernel void gaussian_filter(__read_only image2d_t srcImg, __write_only image2d_t dstImg, sampler_t sampler, int width, int height)
该代码是 OpenCl Book Sample on Google Code 中给出的“ImageFilter”代码的一部分。
我有两个疑问:
1)这里的imageObjects[0]已经包含了输入图像的地址,那为什么还要把&imageObjects[0]传给内核呢?如果地址被传递,为什么不接受它们作为指针
2) args 高度和宽度的地址被传递,但没有一个 args 被接受为指针,而且如果它们被接受为指针,则在编译时给出错误。为什么会这样。