在OpenCL中,我们如何在内核声明期间发送内核中的内存对象或其他参数的地址(同时设置内核参数)并且不接受它们作为指针?如何将地址分配给非指针数据类型,如下所示:
//在主机代码中设置内核args:
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采样器, int width,int height)
该代码是Google Code上OpenCl Book Sample中给出的“ImageFilter”代码的一部分。
我有两个疑问:
1)这里imageObjects [0]已经包含了输入图像的地址,那么为什么需要将& imageObjects [0]传递给内核呢?如果地址被传递,为什么它们不被接受为指针
2)传递args高度和宽度的地址,但是没有args被接受为指针,而且如果它们被接受为指针,则在编译时给出错误。为什么会这样。
答案 0 :(得分:2)
ImageObjects[0]
是cl_mem
个对象。它不是输入图像的地址。在这种情况下,传递给clSetKernelArg
的内容以及内核实际获得的内容是不同的。
使用大小和地址的clSetKernelArg
语法允许使用相同的API调用传递任何类型(包括内存对象,采样器等OpenCL对象)。