2

您好 StackOverflow 用户,

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

我的问题是:

  1. 我可以为每台设备使用一个context与多个吗?commandqueues或者我应该为每个设备使用一个context和一个?commandqueue
  2. 谁能给我一个例子或想法,我如何动态更改 inputMem-Data(子图像数据)以设置内核参数以发送到每个设备?(我只知道如何发送相同的输入数据)
  3. 例如,如果我有比 GPU 数量更多的子图像,我如何将子图像分配给 GPU?
  4. 或者也许是另一种更聪明的方法?

我会感谢每一个帮助和想法。非常感谢。

4

2 回答 2

4
  1. 使用 1 个上下文和许多队列。简单的方法是每个设备一个队列。
  2. 为每个设备创建 1 个程序和一个内核(从同一程序创建)。然后创建不同的缓冲区(每个设备一个)并为每个内核设置每个缓冲区。现在你有了不同的内核,你可以用不同的参数将它们并行排队。
  3. 要分配作业,只需使用事件系统。检查 GPU 是否为空并在那里排队等待下一个作业。

我可以用代码提供更详细的示例,但作为一般草图应该是遵循的方式。

于 2013-09-17T22:52:05.287 回答
1

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

  1. SimpleMultiDevice:展示了如何在单个上下文中创建多个命令队列和一些性能结果
  2. BinomailoptionMultiGPU:看看 loadBalancing 方法。它根据计算单元和可用 GPU 的最大时钟频率划分缓冲区
于 2013-09-18T10:11:54.940 回答