OpenCL:为什么指向指针的指针不能作为参数传递给内核函数?

时间:2014-10-01 10:03:16

标签: opencv opencl

您好,                                                                                                                            我只想澄清为什么我们不能将2D数组指针作为参数传递给内核。 为什么不允许这样做。 如果我使用它作为参数会发生什么(内部?因为我知道代码会给出一些错误)。

请做好必要的事。

2 个答案:

答案 0 :(得分:4)

因为在OpenCL 1.x中,设备具有单独的地址空间。在设备上执行的内核不知道如何处理仅在主机地址空间中有用的指针。

请注意,在OpenCL 2.0中,共享虚拟内存(SVM)消除了此限制,并允许在主机和设备端使用包含指针的缓冲区。

答案 1 :(得分:0)

为了更具体一点,让我们说我有一个内核,指针指针作为参数: kernel void foo(global float * global * a){...}

在这种情况下,运行时知道它有一个指向全局浮点数的全局指针数组的私有指针。

当我将缓冲区传递给运行时时: clSetKernelArg(fooKernel,0,sizeof(cl_mem),& aBuffer);

运行时知道它需要一个指针。因为这是OpenCL 1.x它知道它必须将arg设置为指针。它知道它收到的指针是指向cl_mem的指针。它可以查看cl_mem,找到它已在设备内存中分配的地址,将该地址传递到设备并启动内核。但是,它(通常)不知道您要为缓冲区内的指针指向哪个缓冲区。即使它确实知道它们指向相同的缓冲区,它也必须通过整个缓冲区更新每个指针字段。如果指针嵌套,则必须有更多信息。在一般情况下,这是不可行的。

OpenCL 2.0支持共享虚拟内存,这意味着地址是固定的,并且在主机和设备上是相同的(即使内存不必直接共享)。没有必要进行转换,因此它成为可能。