OpenCL - 迭代更新 GPU 驻留缓冲区?

标签 opencl

我需要让 OpenCL 内核迭代更新缓冲区并返回结果。澄清一下:

  1. 将初始缓冲区内容发送到内核
  2. 内核/worker 更新缓冲区中的每个元素
  3. 主机代码读取结果 - 希望是异步的,但我不确定如何在不阻塞内核的情况下执行此操作。
  4. 内核再次运行,再次更新每个元素,但新值取决于之前的值。
  5. 重复一些固定的迭代次数。

到目前为止,我已经能够通过提供输入和输出缓冲区、在内核完成执行时将输出复制回输入并重新启动内核来伪造它。这似乎是对时间的巨大浪费和对有限内存带宽的滥用,因为缓冲区非常大 (~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/

相关文章:

OpenCL 总线错误

c++ - OpenCL 将 float16 转换为 float*

java - 如何在 OpenCL 中将 int 转换为 float?

c++ - OpenCL 光线追踪器在 CPU 上工作正常,但在 GPU 上(总是)不工作

opencl - 寄存器和专用缓冲区

c# - OpenCL 和 GPU 编程路线图

integer - CG 中的定点数据类型整数精度范围(12 位)

macos - 2012 Macbook pro 上的 OpenCL 设备数量

c++ - 提高密集光流分析的性能(容易)?

c - OpenCL内核优化