【问题标题】:Running CUDA kernel on distributed memory with MPI使用 MPI 在分布式内存上运行 CUDA 内核
【发布时间】:2012-05-09 09:01:56
【问题描述】:

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

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

【问题讨论】:

    标签: cuda mpi distributed


    【解决方案1】:

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

    【讨论】:

    • 您确定两个 cuda 功能都使用相同的设备,即默认设备吗?我认为它应该是最快的未使用设备,在 2 gpus 的情况下将强制使用两者。
    • 我只是自己测试了一下,无论我创建了多少 mpi-tasks,它们都使用 Device 0 进行 cuda 调用。我认为没有任何优化功能可以分配负载,因为每个 MPI 任务都是独立的。您必须使用 CudaSetDevice 手动完成。
    【解决方案2】:

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

    来自 NVIDIA 的 Massimo Fatica 不久前在 NVIDIA 论坛上发布了 useful code snippet,这可能会帮助您入门。

    【讨论】:

    • 值得注意的是,在线程/进程独占计算模式下,并不总是需要明确管理 GPU:通常只需让驱动程序选择设备就可以了。
    • @aland 。就我而言,似乎没有发生 chemeng 也经历过类似的事情。
    猜你喜欢
    • 2012-06-15
    • 2017-07-14
    • 2011-08-24
    • 2012-04-06
    • 1970-01-01
    • 2011-08-28
    • 2022-01-14
    • 2015-04-06
    相关资源
    最近更新 更多