1

我在集群中运行我的程序。每个节点有 2 个 GPU。每个 MPI 任务都是调用一个 CUDA 函数。

我的问题是,如果每个节点上运行两个 mpi 进程,每个 CUDA 函数调用会被安排在不同的 GPU 上,还是它们都运行在同一个 GPU 上?如果我在每个节点上运行 4 个 mpi 任务会怎样?

4

2 回答 2

3

每个 MPI 任务调用一个 cuda 函数,该函数被安排在您选择的任何 GPU 上。您可以使用该功能选择您想要的 GPU cudaSetDevice()cudaSetDevice(0)在您的情况下,由于每个节点包含 2 个 GPU,您可以使用和 在每个 GPU 之间切换 cudaSetDevice(1)。如果您不使用 SetDevice 函数指定 GPU 并将其与 MPI 任务相结合rank,我相信 2 个 MPI 任务将在同一个默认 GPU(编号为 0)上连续运行两个 cuda 函数。此外,如果您在每个节点上运行 3 个或更多 mpi 任务,您肯定会遇到竞争条件,因为 2 个或更多 cuda 函数将在同一个 GPU 上连续运行。

于 2012-04-29T10:39:13.243 回答
2

MPI 和 CUDA 基本上是正交的。您必须自己显式管理 MPI 进程与 GPU 的关联性。为此,每个 GPU 都必须使用计算独占模式。一旦每个进程找到一个可以在其上建立上下文的空闲设备,您就可以使用带有着色的拆分通信器来强制执行处理器-GPU 关联。

来自 NVIDIA 的 Massimo Fatica 不久前在 NVIDIA 论坛上发布了一个有用的代码片段,可以帮助您入门。

于 2012-04-29T10:36:50.780 回答