0

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

4

1 回答 1

2

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

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

于 2013-02-02T23:00:35.567 回答