OpenCL:向多个设备发送相同的cl_mem

OpenCL:向多个设备发送相同的cl_mem,opencl,Opencl,我正在写一个多GPU并行算法。我面临的一个问题是,如果我将一个cl_mem推送到多个设备上,并让它们同时运行同一个内核,会发生什么情况。内核将更改传递给设备的内存 编写和调试OpenCL代码非常耗时。所以在我开始做这件事之前,我想从Stackoverflow的其他用户那里得到一些建议——我想知道在以下两种情况下做这件事的后果(例如,在执行过程中是否会引发任何异常?数据是否同步?使用CL_MEM_COPY_HOST_PTR时,该CL_MEM指向的内存区域是否正确复制到设备?等等): 内存是用CL_

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

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

  • 内存是用CL_MEM_COPY_HOST_PTR创建的
  • 内存是用CL_MEM_USE_HOST_PTR创建的

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

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


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

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

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

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

    解释了不同命令队列之间共享的对象所需的同步

    基本上,它说您应该使用OpenCL事件和
    clFlush
    来同步命令队列之间的执行。OpenCL实现将在OpenCL上下文的不同设备之间同步内存对象的内容。使用/COPY\u HOST\u PTR没有任何区别,但使用\u HOST\u PTR将避免两种情况主机内存中数据的额外副本。使用
    clEnqueueMapBuffer
    在末尾与主机同步位。

    解释了不同命令队列之间共享的对象所需的同步


    基本上,它说您应该使用OpenCL事件和
    clFlush
    来同步命令队列之间的执行。OpenCL实现将在OpenCL上下文的不同设备之间同步内存对象的内容。使用/COPY\u HOST\u PTR没有任何区别,但使用\u HOST\u PTR将避免两种情况主机内存中数据的额外副本。使用
    clEnqueueMapBuffer
    在末尾与主机同步位。

    它表示“当一个命令队列中的共享资源被另一个命令队列使用时,修改该资源的结果未定义。”.这实际上就是我正在做的-在多个GPU上更改一个cl_mem。因此,在程序开始运行一分钟左右后,我会得到随机的蓝色屏幕…非常奇怪。当多个设备上的多个命令队列写入同一个内存缓冲区,但在该缓冲区的不同区域时,情况如何?这是未定义的。如果我请正确记住,在同一附录中提到了它。它说“当一个命令队列正在被另一个命令队列使用时,修改一个命令队列中的共享资源的结果是未定义的。”.这实际上就是我正在做的-在多个GPU上更改一个cl_mem。因此,在程序开始运行一分钟左右后,我会得到随机的蓝色屏幕…非常奇怪。当多个设备上的多个命令队列写入同一个内存缓冲区,但在该缓冲区的不同区域时,情况如何?这是未定义的。如果我请正确记住,它在同一附录中提到。