内存对象和OpenCL内核中传递的其他参数

时间:2013-02-02 18:15:35

标签: opencl

在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被接受为指针,而且如果它们被接受为指针,则在编译时给出错误。为什么会这样。

1 个答案:

答案 0 :(得分:2)

ImageObjects[0]cl_mem个对象。它不是输入图像的地址。在这种情况下,传递给clSetKernelArg的内容以及内核实际获得的内容是不同的。

使用大小和地址的clSetKernelArg语法允许使用相同的API调用传递任何类型(包括内存对象,采样器等OpenCL对象)。