10

我的程序非常适合 MPI。每个 CPU 都执行自己的特定(复杂)工作,生成单个double,然后我使用 anMPI_Reduce将每个 CPU 的结果相乘。

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-04-09T14:48:16.047 回答
1

在这里,我发现了一些关于该主题的新闻:

"MPI(消息传递接口)是一种标准 API,用于通过分布式进程之间的消息进行数据通信,通常在 HPC 中用于构建可扩展到多节点计算机集群的应用程序。因此,MPI 与 CUDA 完全兼容,CUDA 专为在单台计算机或节点上进行并行计算而设计。想要将 MPI 和 CUDA 这两种并行编程方法结合起来的原因有很多。一个常见的原因是能够解决数据量太大而无法放入单个 GPU 的内存的问题,或者在单个节点上需要不合理的长计算时间。另一个原因是使用 GPU 加速现有的 MPI 应用程序,或者使现有的单节点多 GPU 应用程序能够跨多个节点进行扩展。使用支持 CUDA 的 MPI,可以轻松高效地实现这些目标。"

于 2017-04-26T08:42:49.223 回答