OpenCL中不允许使用可变长度数组声明 - 为什么?

时间:2013-08-01 13:52:05

标签: arrays memory memory-management opencl c99

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

您的体验有所不同吗?也许它只是APP?或者这里有一些理由吗?

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

2 个答案:

答案 0 :(得分: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'值。

答案 1 :(得分:3)

不确定为什么人们说你不能这样做,因为这是很多人用OpenCL做的事情(是的,我知道它不完全相同,但在许多情况下效果都不错)。

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