【问题标题】:OpenCL: Sending same cl_mem to multiple devicesOpenCL:将相同的 cl_mem 发送到多个设备
【发布时间】:2012-09-25 05:10:31
【问题描述】:

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

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

  1. 内存是用 CL_MEM_COPY_HOST_PTR 创建的
  2. 内存是用 CL_MEM_USE_HOST_PTR 创建的

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      Appendix A of the OpenCL Specification 解释了不同命令队列之间共享对象所需的同步。

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

      【讨论】:

      • 它说“在一个命令队列中修改共享资源而另一个命令队列正在使用它的结果是未定义的。”。这实际上是我正在做的 - 在多个 GPU 上更改一个 cl_mem。结果,在程序开始运行一分钟左右后,我得到了随机蓝屏......非常奇怪。
      • 当多个命令队列在多个设备上写入同一个内存缓冲区但在该缓冲区的不同区域时,情况如何?
      • 未定义。如果我没记错的话,它在同一个附录中提到过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2014-02-16
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多