【发布时间】:2015-06-18 19:42:47
【问题描述】:
背景:
我编写了一个对一系列符号执行处理的 CUDA 程序。该程序并行处理所有符号序列,并规定所有序列具有相同的长度。我将我的数据分组,每组完全由相同长度的序列组成。该程序一次处理 1 个组。
问题:
我在具有 4 个 GPU 的 Linux 机器上运行我的代码,并希望通过运行我的程序的 4 个实例(每个 GPU 1 个)来利用所有 4 个 GPU。是否可以让程序选择另一个 CUDA 应用程序未使用的 GPU 来运行?当程序在具有更多或更少数量的 GPU 的不同硬件上运行时,我不想硬编码任何会导致问题的东西。
【问题讨论】:
-
nvidia.com/docs/IO/116711/sc11-multi-gpu.pdf 是谷歌对您的问题的热门搜索。它能解决你的问题吗?
-
不是真的,解决在 1 个 CUDA 应用程序中使用多个 GPU 的问题,我问的是在多个 GPU 上同时运行多个 CUDA 程序(但每个实例仍然有 1 个 GPU)。我的代码需要大量重写才能在同一个实例中处理多个批次。
-
您正在进行异步调用,对吗?将组划分为 N(其中 N 是 GPU 的数量)子组,将每个子组发送到不同的 GPU,然后再次将它们收集起来?
-
每个组通常不包含足够的并行序列来充分利用甚至 1 个 GPU,因此将 1 个组分布在多个 GPU 上将毫无意义。这些组不能合并和拆分,因为每个序列对应一个 2D 矩阵,从中生成一个 3D 矩阵,用于计算另一个 2D 矩阵。容纳不同长度的序列需要完全重写我对这些矩阵的内存索引方案。