我正在编写一个多GPU并行算法。我面临的一个问题是找出如果我将一个cl_mem推送到多个设备会发生什么,并让它们同时运行相同的内核。内核将更改传递给设备的内存。
编写和调试OpenCL代码非常耗时。所以在我开始这样做之前,我想从其他Stackoverflow用户那里得到一些建议 - 我想知道在以下两种情况下做这种事情的后果(例如在执行期间是否会引发任何异常?数据是否同步?当CL_MEM_COPY_HOST_PTR时使用的是这个cl_mem指向的内存区域是否正确复制到设备?等。):
答案 0 :(得分:3)
我没有在OpenCL规范中看到任何明确的内容,以确保数据将跨设备同步。我没有看到OpenCL实现如何知道如何在多个设备之间分配缓冲区以及如何在以后再次聚合这些缓冲区。
我采用的方法是为每个设备创建一个单独的上下文,读取,写入和内核执行队列。然后,我在每个设备上创建单独的缓冲区,并将写入/读取入队以将数据移入/移出设备。因此,我自己明确地处理了所有这些。
我想要一个更好的解决方案,但至少上述方法有效,并且不依赖于任何特定于实现的内容。
答案 1 :(得分:2)
Appendix A of the OpenCL Specification解释了在不同命令队列之间共享的对象所需的同步。
基本上它说你应该使用OpenCL事件和clFlush
来同步命令队列之间的执行。 OpenCL实现将在OpenCL上下文的不同设备之间同步内存对象的内容。 USE / COPY _HOST_PTR没有任何区别,但USE_HOST_PTR将避免主机内存中的几个额外数据副本。使用clEnqueueMapBuffer
在末尾与主机同步位。