我在集群中运行我的程序。每个节点有2个GPU。每个MPI任务都是调用一个CUDA函数。使用MPI在分布式内存上运行CUDA内核
我的问题是,如果在每个节点上运行两个mpi进程,每个CUDA函数调用是否安排在不同的GPU上,还是都运行在相同的?如果我在每个节点上运行4 mpi任务,那又如何呢?
我在集群中运行我的程序。每个节点有2个GPU。每个MPI任务都是调用一个CUDA函数。使用MPI在分布式内存上运行CUDA内核
我的问题是,如果在每个节点上运行两个mpi进程,每个CUDA函数调用是否安排在不同的GPU上,还是都运行在相同的?如果我在每个节点上运行4 mpi任务,那又如何呢?
MPI和CUDA基本上是正交的。您必须自己显式管理MPI流程 - GPU亲和性。要做到这一点,计算独占模式对每个GPU来说都是强制性的。一旦每个进程找到可以建立上下文的免费设备,您就可以使用具有着色功能的拆分通信器来实施处理器与GPU的亲和力。
NVIDIA的Massimo Fatica在NVIDIA论坛上发布了useful code snippet,可能会让你开始。
每个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上串行运行。
值得注意的是,在线程/进程独占计算模式下,并不总是需要明确管理GPU:通常只让驱动程序选择设备就可以实现。 – aland 2012-04-29 19:49:30
感谢代码段链接。这很有用。 – zimbra314 2012-04-30 00:21:51
@aland。在我看来,chemeng似乎也没有遇到类似的事情。 – zimbra314 2012-04-30 00:25:22