将OpenCL用于多个设备(多个GPU)

将OpenCL用于多个设备(多个GPU),opencl,jocl,multiple-gpu,Opencl,Jocl,Multiple Gpu,各位用户好 我有一个问题:我有一个非常大的形象,我想工作。我的第一个想法是将大图像分成两个子图像,然后将这些子图像发送到不同的GPU。我不使用图像对象,因为我不使用RGB值,但我只使用亮度值来操纵图像 我的问题是: 我可以为每个设备使用一个上下文和多个命令队列吗?或者我应该为每个设备使用一个context和一个commandqueue 有人能给我举个例子或想法吗?我如何动态更改inputMem数据(子映像数据),以设置要发送到每个设备的内核参数?(我只知道如何发送相同的输入数据) 例如,如果子映

各位用户好

我有一个问题:我有一个非常大的形象,我想工作。我的第一个想法是将大图像分成两个子图像,然后将这些子图像发送到不同的GPU。我不使用图像对象,因为我不使用RGB值,但我只使用亮度值来操纵图像

我的问题是:

  • 我可以为每个设备使用一个
    上下文
    和多个
    命令队列
    吗?或者我应该为每个设备使用一个
    context
    和一个
    commandqueue
  • 有人能给我举个例子或想法吗?我如何动态更改inputMem数据(子映像数据),以设置要发送到每个设备的内核参数?(我只知道如何发送相同的输入数据)
  • 例如,如果子映像多于GPU编号,如何将子映像分发到GPU
  • 或者是另一种更聪明的方法
  • 我会感谢你的帮助和建议。 多谢各位

  • 使用1个上下文和多个队列。简单的方法是每个设备一个队列
  • 为每个设备创建一个程序和一个内核(由同一程序创建)。然后创建不同的缓冲区(每个设备一个),并用每个缓冲区设置每个内核。现在您有了不同的内核,可以使用不同的参数并行地对它们进行排队
  • 要分发作业,请使用事件系统。检查GPU是否为空,并在那里查询下一个作业

  • 我可以提供更详细的代码示例,但作为一般草图,这应该是接下来的方法。

    AMD APP SDK在多gpu处理方面的示例很少。你应该看看这两个样品

  • SimpleMultiDevice:演示如何在单个上下文和一些性能结果上创建多个CommandQueue
  • BinomailoptionMultiGPU:看看负载平衡方法。它根据计算单元和可用GPU的最大时钟频率划分缓冲区

  • 谢谢你,我一定会调查的。哈罗,黑零。谢谢你的帮助,我会马上测试。嗨@DarkZeros,3号。事件系统是什么样子的?我应该把检查我的图像是否已经在进行的事件放在哪里?我无法将事件放在enqueueNDRangeKernel上,因为我已经在那里设置了用于组合结果的事件(使用clWaitForEvent函数)。你能给我举个例子吗?也许我误解了你的观点。谢谢你迟来的答复。您可以在每次将内核排队到设备时设置一个事件。然后,下次您必须对另一个内核排队时,只需检查事件状态(搜索已完成的事件)。这将给你一个已经没有工作的设备,并将内核排队到该设备。我忘了说,你可能有很多事件。您不必只有1个。我通常会为我打的每个电话安排一个活动,然后我只使用我真正需要的金额。(当然,我使用C++包装,否则,将是一个地狱,照顾他们)