8

我想在我的 OpenCL 内核中创建一个本地数组,其大小取决于内核的参数。似乎这是不允许的 - 至少对于 AMD APP。

你的经历有什么不同吗?也许只是APP?或者这里有什么理由吗?

编辑:我现在建议在 CPU 端代码中也应该允许可变长度数组,这是 C 标准委员会的不幸呼吁;但问题是存在的。

4

2 回答 2

4

您可以动态分配本地块的大小。您需要将其作为内核参数,并在调用 clSetKernelArg 时定义其大小。

定义示例:

__kernel void kernelName(__local float* myLocalFloats, ...)

主机代码:

clSetKernelArg(kernel, 0, myLocalFloatCount * sizeof(float), NULL); // <-- set the size to the correct number of bytes to allocate, but use NULL for the data.

在执行此操作之前,请确保您知道设备上的本地内存限制。调用 clGetDeviceInfo,并轮询“CL_DEVICE_LOCAL_MEM_SIZE”值。

于 2013-08-01T15:11:22.717 回答
3

不知道为什么人们说你不能这样做,因为这是许多人使用 OpenCL 所做的事情(是的,我知道它并不完全相同,但它在很多情况下都足够好用)。

由于 OpenCL 内核是在运行时编译的,就像文本一样,您只需将大小设置为您想要的任何大小,然后重新编译您的内核。如果您的尺寸变化很大,这显然不是完美的,但通常我在启动时编译几种不同的尺寸,然后根据需要调用正确的尺寸(在您的情况下基于内核参数)。如果我得到一个新的大小,我没有内核,因为我会立即编译它并缓存内核以防它再次出现。

于 2013-08-07T18:00:25.930 回答