【问题标题】:OpenCL - iteratively updating GPU-resident buffer?OpenCL - 迭代更新GPU驻留缓冲区?
【发布时间】:2011-05-06 20:23:18
【问题描述】:

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

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

到目前为止,我已经能够通过提供输入和输出缓冲区、在内核完成执行时将输出复制回输入以及重新启动内核来伪造这一点。由于缓冲区非常大(~1GB),这似乎是对时间的巨大浪费和对有限内存带宽的滥用。

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

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

【问题讨论】:

  • 你能详细说明你是如何工作的吗?

标签: opencl


【解决方案1】:

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

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

如果您不在乎此迭代是否可以包含下一次迭代的一些数据。您可以大大提高性能、使用事件和 OUT_OF_ORDER_QUEUE。这样,当您将数据复制回来时,内核就可以运行。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不认为你有这样的例子吗?每当我尝试写入我也在读取的任何内容时,我都会遇到错误。
    • 抱歉,我没有样品。很高兴听到它起作用了。不客气!
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2012-07-15
    • 2020-02-14
    • 1970-01-01
    • 2016-12-03
    • 2023-03-21
    • 2015-03-10
    相关资源
    最近更新 更多