gpt4 book ai didi

opencl - 如何解决无法将 cl_mem 列表传递到内核调用的问题?

转载 作者:行者123 更新时间:2023-12-02 20:41:30 24 4
gpt4 key购买 nike

您想要这样做的现实原因有很多。我们的原因是因为我们有一个可变长度数据结构的列表,并且我们希望能够更改其中一个元素的大小,而无需重新复制所有元素。

以下是我尝试过的一些方法:

  1. 只是有很多内核参数。当然,听起来很老套,但对小 N 有效。这实际上是我们一直在做的事情。
  2. 执行 1) 使用某种宏循环,将内核参数扩展到最大大小(我认为这与设备相关)。我真的不想这样做...听起来很糟糕。
  3. 创建某种包含指针的结构列表,并在内核调用之前填充它。我尝试了这个,我认为它违反了规范。根据我在 nVidia 论坛上看到的内容,在一次内核调用之外保留设备指针的地址是非法的。如果有人能指出规范中的具体位置,我很想知道,因为我找不到它。然而,这在 ATI 硬件上肯定会崩溃,因为它会移动对象。
  4. 放弃吧,将可变大小的对象存储在一个大数组中,并编写一个聪明的算法来使用空白空间,这样整个数组的回流次数就必须减少。这可行,但设计不优雅且复杂。而且,它需要大量可怕的指针算术......

还有人有其他想法吗?尝试这样做的经验怎么样?有没有最简单的方法?为什么?

最佳答案

到3:OpenCL 1.1 规范第 193 页表示“程序中内核函数的参数不能声明为指向指针的指针。”

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

我选择选项 5:不要使用可变大小的数据结构。如果你有办法让它们保持恒定的大小,就一定要这么做。这将使您的生活变得更加轻松。准确地说,不存在“可变大小结构”。每个结构体定义都会生成恒定大小的结构体,因此如果大小发生变化,则结构体本身也会发生变化,因此需要另一个 mem 对象。传递给内核函数的每个指针都必须具有单一类型。

关于opencl - 如何解决无法将 cl_mem 列表传递到内核调用的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6850723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com