MPI + GPU:如何混合这两种技术

cmo*_*cmo 8 gpu hpc mpi

我的程序非常适合MPI.每个CPU都有自己的,特定的(复杂的)作业,产生一个double,然后我使用a MPI_Reduce来乘以每个CPU的结果.

但我重复了很多次(> 100,000次).因此,我想到GPU会大大加快速度.

我已经谷歌了,但找不到任何具体的东西.你如何将MPI与GPU混合?有没有办法让程序查询和验证"哦,这个等级是GPU,所有其他都是CPU"? 有推荐的教程还是什么?

重要的是,我不想要或不需要全套GPU.我真的只需要很多CPU,然后单个GPU来加速常用MPI_Reduce操作.

这是我正在谈论的示意图:

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

Jon*_*rsi 2

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

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

无论如何,塔隆米斯是对的。这个特定的例子听起来并不会从 GPU 中受益匪浅。每个任务有数以万计的双打也无济于事。如果每次双倍只执行一次或几次 FLOP,则将数据发送到 GPU 的成本将超过让所有这些核心在其上运行的好处。

(*) 这在过去更明显是正确的;例如,现在GPUDirect能够通过 infiniband 将内存复制到远程 GPU,这种区别就变得更加模糊了。然而,我认为这仍然是最有用的思考方式,例如 GPU 的 RDMA 是一项重要的优化,但在概念上只是一个小小的调整。