1

我正在编写一个多 GPU 并行算法。我面临的问题之一是找出如果我将一个 cl_mem 推送到多个设备并让它们同时运行同一个内核会发生什么。内核将对传递给设备的内存进行更改。

编写和调试 OpenCL 代码非常耗时。所以在我开始做之前,我想从 Stackoverflow 其他用户那里得到一些建议——我想知道在以下两种情况下做这样的事情的后果(例如,在执行过程中是否会引发任何异常?数据是否同步?当 CL_MEM_COPY_HOST_PTR使用的是这个 cl_mem 指向的同一内存区域是否正确复制到设备?等):

  1. 使用 CL_MEM_COPY_HOST_PTR 创建内存
  2. 使用 CL_MEM_USE_HOST_PTR 创建内存
4

2 回答 2

3

我在 OpenCL 规范中没有看到任何明确的内容可以保证数据将在设备之间同步。我不明白 OpenCL 实现如何知道如何在多个设备之间分配缓冲区以及以后如何再次聚合这些缓冲区。

我采用的方法是为每个设备创建一个单独的上下文、读、写和内核执行队列。然后,我在每个设备上创建单独的缓冲区,并将写入/读取排入队列以将数据移入/移出设备。因此,我自己明确地处理所有这些。

我想要一个更好的解决方案,但至少上述方法有效并且不依赖于任何特定于实现的东西。

于 2012-09-24T15:33:13.460 回答
2

OpenCL 规范的附录 A解释了不同命令队列之间共享对象所需的同步。

基本上它说您应该使用 OpenCL 事件并clFlush在命令队列之间同步执行。OpenCL 实现将在 OpenCL 上下文的不同设备之间同步内存对象的内容。USE/COPY _HOST_PTR 没有任何区别,但 USE_HOST_PTR 将避免主机内存中数据的几个额外副本。最后用于clEnqueueMapBuffer与主机同步位。

于 2012-09-24T17:00:24.330 回答