我需要有一个OpenCL内核迭代更新缓冲区并返回结果。澄清:
到目前为止,我已经能够通过提供输入和输出缓冲区来伪造它,在内核完成执行时将输出复制回输入,然后重新启动内核。这似乎是浪费时间和滥用有限的内存带宽,因为缓冲区非常大(~1GB)。
有什么建议/例子吗?我是OpenCL的新手,所以这可能有一个非常简单的答案。
如果重要,我在NVidia GTX460和两台GTX295上使用Cloo / OpenCL.NET。
答案 0 :(得分:3)
我建议你在设备中创建一个cl_mem。在那里复制数据。并使用内核进行迭代。 使用相同的内存来存储结果,这对你来说更容易,因为你的内核只有1个参数。
然后你只需要将数据复制到cl_mem,然后运行内核。之后,从设备中提取数据,然后再次运行内核。
如果您不关心此迭代是否可以包含下一次迭代的某些数据。你可以提高性能,使用事件和OUT_OF_ORDER_QUEUE。这样,在您复制数据时内核可以正在运行。
答案 1 :(得分:2)
您可以将初始数据写入设备并使用内核更改其内容。一旦内核完成其迭代,您就可以读回相同的内存缓冲区并重新启动内核以进行下一次迭代。数据可以保留在OpenCL设备上。无需再次将其发送到设备。
据我所知,没有办法在主机和设备之间同步工作。您只能启动内核等待并返回它。然后回读结果并重新开始。异步读取会很危险,因为你可能会得到不一致的结果。