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

在OpenCL内核中传递的内存对象和其他参数,opencl,Opencl,在OpenCL中,我们如何在内核中发送内存对象或其他参数的地址(设置内核参数时),而在内核声明期间不接受它们作为指针?如何将地址分配给非指针数据类型,例如: //在主机代码中设置内核参数: errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &imageObjects[0]); errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &imageObjects[1]); errNum

在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);
//内核声明:

__内核无效高斯滤波器(只读图像2d\t srcImg, __仅写入图像2D\t dstImg, 采样器, 整数宽度,整数高度)

该代码是“ImageFilter”代码的一部分,该代码在谷歌代码上的OpenCl图书示例中给出

我有两个疑问:

1) 这里imageObjects[0]已经包含输入图像的地址,那么为什么需要将&imageObjects[0]传递给内核呢?此外,如果地址被传递,为什么它们不被接受为指针


2) 传递参数height和width的地址,但是没有一个参数被接受为指针,而且如果它们被接受为指针,则在编译时会给出错误。为什么会发生这种情况。

ImageObjects[0]
是一个
cl\u mem
对象。它不是输入图像的地址。在本例中,传递给
clSetKernelArg
的内容和内核实际得到的内容是不同的


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

您真的有问题吗,或者你只是要求澄清API的技术性问题?我有个问题,我不知道这是否是API技术性的一部分。请解决我的疑问,即使它们与OpenCLAPI有关。我知道参数是如何传递的,但不知道它们为什么以这种方式传递。。。!是的,我知道imageObjects[0]是一个cl_mem对象,但是当一个输入图像被加载到其中时,它到底包含了什么。。。?(我想它可能包含创建的cl_映像的起始地址)cl_mem对象到底是什么?cl_mem对象表示是内部的。它至少会引用您创建时传递的数据,以及一些特定于设备的信息。