MPI + GPU : how to mix the two techniques

标签 mpi gpu hpc

我的程序非常适合 MPI。每个 CPU 都做自己的、特定的(复杂的)工作,产生一个 double ,然后我使用 MPI_Reduce将每个 CPU 的结果相乘。

但是我重复了很多很多次(> 100,000)。因此,我突然想到 GPU 会显着加快速度。

我用谷歌搜索过,但找不到任何具体的东西。您如何将 MPI 与 GPU 混合使用?程序有没有办法查询验证 “哦,这个等级是 GPU,其他都是 CPU”? 有推荐的教程之类的吗?

重要的是,我不需要或不需要一整套 GPU。我真的只需要很多CPU,然后一个GPU来加速经常使用的MPI_Reduce手术。

这是我正在谈论的一个示意性示例:

假设我有 500 个 CPU。每个 CPU 以某种方式产生,比如说,50 double s。我需要将所有 250,00 相乘 double一起。然后我重复 10,000 到 100 万次。如果我可以拥有一个 GPU(除了 500 个 CPU),这可能会非常高效。每个 CPU 将计算其 50 double s 适用于所有约 100 万个“状态”。然后,所有 500 个 CPU 将发送它们的 double s 到 GPU。然后 GPU 将乘以 250,000 double为 100 万个“状态”中的每一个加在一起,产生 100 万个 doubles .
这些数字并不准确。计算量确实很大。我只是想传达一般问题。

最佳答案

这不是思考这些事情的方式。

我喜欢说 MPI 和 GPGPU 的东西是正交的(*)。您在任务之间使用 MPI(对于这些思考节点,尽管每个节点可以有多个任务),并且每个任务可能会或可能不会使用 GPU 之类的加速器来加速任务内的计算。 GPU 上没有 MPI 等级。

无论如何,Talonmies 是对的。这个特定的例子听起来似乎不会从 GPU 中受益。每项任务有数万次 double 也无济于事;如果您每双只执行一个或几个 FLOP,则将数据发送到 GPU 的成本将超过让所有这些内核在它们上运行的好处。

(*) 这曾经更清楚;现在,例如,GPUDirect能够通过 infiniband 将内存复制到远程 GPU,区别更加模糊。然而,我坚持认为这仍然是最有用的思考方式,像 RDMA 到 GPU 之类的东西是一个重要的优化,但在概念上是一个小调整。

关于MPI + GPU : how to mix the two techniques,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074047/

相关文章:

c - 连续内存分配的好处

c++ - 将 std::vector<bool> 传递给外部函数

c - 段错误和 MPI

gpu - 使用 VMWare Fusion 访问 GPU

c - MPI_Scatter - 未按预期工作

opencl - PowerVR SGX530 GPU 设备是否可以使用 OpenCL?

tensorflow - Keras 和 Tensorflow 的 NVIDIA GPU 使用率低

cluster-computing - 是否可以使用 DRMAA 列出正在运行的作业?

c - MPI-- 进程的逻辑循环

MPICH2 : API for fetching process's computer names