我需要让 OpenCL 内核迭代更新缓冲区并返回结果。澄清一下:
- 将初始缓冲区内容发送到内核
- 内核/worker 更新缓冲区中的每个元素
- 主机代码读取结果 - 希望是异步的,但我不确定如何在不阻塞内核的情况下执行此操作。
- 内核再次运行,再次更新每个元素,但新值取决于之前的值。
- 重复一些固定的迭代次数。
到目前为止,我已经能够通过提供输入和输出缓冲区、在内核完成执行时将输出复制回输入并重新启动内核来伪造它。这似乎是对时间的巨大浪费和对有限内存带宽的滥用,因为缓冲区非常大 (~1GB)。
有什么建议/例子吗?我是 OpenCL 的新手,所以这可能有一个非常简单的答案。
如果重要的话,我在 NVidia GTX460 和两个 GTX295 上使用 Cloo/OpenCL.NET。
最佳答案
我建议您在设备中创建一个 cl_mem。在那里复制数据。并与内核进行迭代。 使用相同的内存来存储结果,这对您来说会更容易,因为您的内核将只有 1 个参数。
然后你只需要将数据复制到cl_mem,然后运行内核。之后,从设备中提取数据,并再次运行内核。
如果您不关心本次迭代是否可以从下一次迭代中获得一些数据。您可以大大提高性能、使用事件和 OUT_OF_ORDER_QUEUE。这样,当您将数据复制回来时,内核就可以运行。
关于OpenCL - 迭代更新 GPU 驻留缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885793/