Opencl 如何解决将cl_mem列表传递到内核调用中的不恰当问题?
你想这么做有很多现实原因。这是因为我们有一个可变长度的数据结构列表,我们希望能够更改其中一个元素的大小,而无需重新压缩它们 以下是我尝试过的几件事:Opencl 如何解决将cl_mem列表传递到内核调用中的不恰当问题?,opencl,Opencl,你想这么做有很多现实原因。这是因为我们有一个可变长度的数据结构列表,我们希望能够更改其中一个元素的大小,而无需重新压缩它们 以下是我尝试过的几件事: 只是有很多内核参数。当然,听起来有点老套,但对小N有效。这实际上就是我们一直在做的 使用某种宏循环将内核参数扩展到最大大小(我认为这取决于设备)。我真的不想这么做。。。听起来很糟糕 创建一些包含指针的结构列表,并在内核调用之前填充它。我尝试过这个,我认为它违反了规范。根据我在英伟达论坛上所看到的,保存一个设备指针的地址超出了一个内核调用是非法的。如
我会选择选项5:不要使用可变大小的数据结构。如果你有办法使它们保持恒定的大小,那就一定要这样做。这会让你的生活轻松很多。准确地说,没有“可变尺寸结构”。每个结构定义都会生成大小不变的结构,因此,如果大小已更改,则结构本身已更改,因此需要另一个mem对象。传递给内核函数的每个指针必须有一个类型。除了sharpnelis答案选项5外: 如果对象具有相似的大小,则可以在最大可能的对象大小上使用并集。但要确保使用显式对齐。在静态大小联合缓冲区中传递第二个缓冲区,标识可变大小对象中每个对象使用的联合 在使用opencl lib代码时,我又回到了这一点,该代码只允许一个任意类型的变量数组。我只是使用
cl_float2
来传递两个float。由于cl\u floatN
类型是作为联合实现的,因此适用于内置类型的内容也适用于您