2012-04-29 39 views
1

我在集群中运行我的程序。每个节点有2个GPU。每个MPI任务都是调用一个CUDA函数。使用MPI在分布式内存上运行CUDA内核

我的问题是,如果在每个节点上运行两个mpi进程,每个CUDA函数调用是否安排在不同的GPU上,还是都运行在相同的?如果我在每个节点上运行4 mpi任务,那又如何呢?

回答

2

MPI和CUDA基本上是正交的。您必须自己显式管理MPI流程 - GPU亲和性。要做到这一点,计算独占模式对每个GPU来说都是强制性的。一旦每个进程找到可以建立上下文的免费设备,您就可以使用具有着色功能的拆分通信器来实施处理器与GPU的亲和力。

NVIDIA的Massimo Fatica在NVIDIA论坛上发布了useful code snippet,可能会让你开始。

+0

值得注意的是,在线程/进程独占计算模式下,并不总是需要明确管理GPU:通常只让驱动程序选择设备就可以实现。 – aland 2012-04-29 19:49:30

+0

感谢代码段链接。这很有用。 – zimbra314 2012-04-30 00:21:51

+0

@aland。在我看来,chemeng似乎也没有遇到类似的事情。 – zimbra314 2012-04-30 00:25:22

3

每个MPI任务调用一个cuda函数,该函数根据您选择的任何GPU进行调度。您可以使用功能cudaSetDevice()选择所需的GPU。在你的情况下,由于每个节点包含2个GPU,你可以在每个GPU之间切换cudaSetDevice(0)cudaSetDevice(1)。如果您没有使用SetDevice函数指定GPU并将其与MPI任务rank相结合,我相信2 MPI任务将在同一个默认GPU(编号为0)上同时运行两个cuda函数。此外,如果您在每个节点上运行3个或更多mpi任务,您肯定会遇到竞争状况,因为2个或更多cuda功能将在同一GPU上串行运行。

+0

你确定使用相同的设备,即默认设备的两个cuda功能?我会假设它应该是最快的未使用的设备,在2 gpus的情况下将强制使用两者。 – zimbra314 2012-04-29 14:23:59

+0

我只是自己测试它,无论我创建了多少个mpi任务,它们都使用Device 0作为cuda调用。我不认为有任何优化功能可以分配负载,因为每个MPI任务都是独立的。您必须使用CudaSetDevice手动执行此操作。 – chemeng 2012-04-29 14:50:47