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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCL中不允许使用可变长度数组声明 - 为什么?相关的知识,希望对你有一定的参考价值。

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

你的经历与众不同吗?也许它只是APP?或者这里有一些理由吗?

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

答案

您可以动态分配本地块的大小。您需要将其作为内核的参数,并在调用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'值。

另一答案

不知道为什么人们说你不能这样做,因为这是很多人用OpenCL做的事情(是的,我知道它并不完全相同,但它适用于很多情况)。

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

以上是关于OpenCL中不允许使用可变长度数组声明 - 为什么?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中声明可变长度二维数组的正确方法

在 MS Visual C++ 中启用 VLA(可变长度数组)?

如何声明和定义具有多个可变长度数组的结构?

C 可变长度数组存储持续时间

使用可变长度数组是不是有任何开销?

关于零长度数组