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

时间:2013-09-17 16:31:44

标签: opencl jocl multiple-gpu

Hello StackOverflow用户,

我有这个问题:我有一个非常大的图像,我想要处理。我的第一个想法是将大图像分成几个子图像,然后将这些子图像发送到不同的GPU。我不使用Image-Object,因为我不使用RGB-Value,但我只使用亮度值来操作图像。

我的问题是:

  1. 我可以为每个设备使用一个context多个commandqueues吗?或者我应该为每个设备使用一个context和一个commandqueue吗?
  2. 任何人都可以给我一个例子或想法,如何动态更改inputMem-Data(子图像数据)以设置内核参数以发送到每个设备? (我只知道如何发送相同的输入数据)
  3. 例如,如果我有比GPU编号更多的子图像,我该如何将子图像分发到GPU?
  4. 或许是另一种更聪明的方法?
  5. 我会感激每一个帮助和想法。 非常感谢你。

2 个答案:

答案 0 :(得分:4)

  1. 使用1个上下文和许多队列。简单的方法是每个设备一个队列。
  2. 为每个设备创建1个程序和一个内核(从同一程序创建)。然后创建不同的缓冲区(每个设备一个)并使用每个缓冲区设置每个内核。现在你有了不同的内核,你可以使用不同的参数并行排队。
  3. 要分发作业,只需使用事件系统即可。检查GPU是否为空并在那里排队等待下一份工作。
  4. 我可以提供更详细的代码示例,但作为应该遵循的一般草图。

答案 1 :(得分:1)

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

  1. SimpleMultiDevice:显示如何在单个上下文和一些性能结果上创建多个命令等级
  2. BinomailoptionMultiGPU:看看loadBalancing方法。它根据计算单位和时间划分缓冲区。可用gpus的最大时钟频率