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

时间:2011-05-04 15:21:04

标签: opencl

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

  1. 将内容的初始缓冲区发送到内核
  2. 内核/工作人员更新缓冲区中的每个元素
  3. 主机代码以异步方式读取结果 - 尽管我不确定如何在不阻塞内核的情况下执行此操作。
  4. 内核再次运行,再次更新每个元素,但新值取决于之前的值。
  5. 重复一定数量的迭代。
  6. 到目前为止,我已经能够通过提供输入和输出缓冲区来伪造它,在内核完成执行时将输出复制回输入,然后重新启动内核。这似乎是浪费时间和滥用有限的内存带宽,因为缓冲区非常大(~1GB)。

    有什么建议/例子吗?我是OpenCL的新手,所以这可能有一个非常简单的答案。

    如果重要,我在NVidia GTX460和两台GTX295上使用Cloo / OpenCL.NET。

2 个答案:

答案 0 :(得分:3)

我建议你在设备中创建一个cl_mem。在那里复制数据。并使用内核进行迭代。 使用相同的内存来存储结果,这对你来说更容易,因为你的内核只有1个参数。

然后你只需要将数据复制到cl_mem,然后运行内核。之后,从设备中提取数据,然后再次运行内核。

如果您不关心此迭代是否可以包含下一次迭代的某些数据。你可以提高性能,使用事件和OUT_OF_ORDER_QUEUE。这样,在您复制数据时内核可以正在运行。

答案 1 :(得分:2)

您可以将初始数据写入设备并使用内核更改其内容。一旦内核完成其迭代,您就可以读回相同的内存缓冲区并重新启动内核以进行下一次迭代。数据可以保留在OpenCL设备上。无需再次将其发送到设备。

据我所知,没有办法在主机和设备之间同步工作。您只能启动内核等待并返回它。然后回读结果并重新开始。异步读取会很危险,因为你可能会得到不一致的结果。