Opencl 如何解决将cl_mem列表传递到内核调用中的不恰当问题?

Opencl 如何解决将cl_mem列表传递到内核调用中的不恰当问题?,opencl,Opencl,你想这么做有很多现实原因。这是因为我们有一个可变长度的数据结构列表,我们希望能够更改其中一个元素的大小,而无需重新压缩它们 以下是我尝试过的几件事: 只是有很多内核参数。当然,听起来有点老套,但对小N有效。这实际上就是我们一直在做的 使用某种宏循环将内核参数扩展到最大大小(我认为这取决于设备)。我真的不想这么做。。。听起来很糟糕 创建一些包含指针的结构列表,并在内核调用之前填充它。我尝试过这个,我认为它违反了规范。根据我在英伟达论坛上所看到的,保存一个设备指针的地址超出了一个内核调用是非法的。如

你想这么做有很多现实原因。这是因为我们有一个可变长度的数据结构列表,我们希望能够更改其中一个元素的大小,而无需重新压缩它们

以下是我尝试过的几件事:

  • 只是有很多内核参数。当然,听起来有点老套,但对小N有效。这实际上就是我们一直在做的
  • 使用某种宏循环将内核参数扩展到最大大小(我认为这取决于设备)。我真的不想这么做。。。听起来很糟糕
  • 创建一些包含指针的结构列表,并在内核调用之前填充它。我尝试过这个,我认为它违反了规范。根据我在英伟达论坛上所看到的,保存一个设备指针的地址超出了一个内核调用是非法的。如果有人能指出规范中的位置,我很想知道,因为我找不到它。但是,这在ATI硬件上肯定会中断,因为它会移动对象
  • 放弃,将可变大小的对象存储在一个大数组中,并编写一个巧妙的算法来使用空空间,这样整个数组就必须减少回流次数。这将起作用,但这是一个不雅观、复杂的设计。而且,它需要很多可怕的指针算法
  • 还有其他人有其他想法吗?尝试这样做的经验如何;有没有最简单的方法?为什么?

    到3: OpenCL1.1规范第193页说“程序中内核函数的参数不能声明为指向指针的指针。”

    包含指向指针的指针(指向缓冲区对象的指针)的结构可能不反对严格阅读这句话,但它符合精神:指向缓冲区对象的指针不能作为参数从主机代码传递到内核,即使它们隐藏在用户定义的结构中


    我会选择选项5:不要使用可变大小的数据结构。如果你有办法使它们保持恒定的大小,那就一定要这样做。这会让你的生活轻松很多。准确地说,没有“可变尺寸结构”。每个结构定义都会生成大小不变的结构,因此,如果大小已更改,则结构本身已更改,因此需要另一个mem对象。传递给内核函数的每个指针必须有一个类型。

    除了sharpnelis答案选项5外:

    如果对象具有相似的大小,则可以在最大可能的对象大小上使用并集。但要确保使用显式对齐。在静态大小联合缓冲区中传递第二个缓冲区,标识可变大小对象中每个对象使用的联合

    在使用opencl lib代码时,我又回到了这一点,该代码只允许一个任意类型的变量数组。我只是使用
    cl_float2
    来传递两个float。由于
    cl\u floatN
    类型是作为联合实现的,因此适用于内置类型的内容也适用于您