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

Posted

技术标签:

【中文标题】MPI + GPU:如何混合两种技术【英文标题】:MPI + GPU : how to mix the two techniques 【发布时间】:2012-04-21 21:00:48 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

这听起来不太适合 GPU 计算。您提出的 GPU 组件仅包含几百个双精度 MFLops。这比 GPU 的盈利要小几个数量级,并且会被通过线路传输数据到托管 GPU 的节点以及通过 PCI-e 总线进入 GPU 内存的网络开销所淹没。 @talonmies 很抱歉这个误导性的示意图示例。我会更新我的问题。实际上,它稍微复杂一些。我需要在 *O*(10k) doubles 之间相乘。每个 CPU 都会产生一堆这样的doubles(不仅仅是一个)。状态的数量将在 ~10,000 到几百万之间(而不是简单的 100,000)。这整个过程会经常重复。 正如我所写的,那仍然只有几百个 MFlops。即使对于 CPU,这也是很小的计算量。 【参考方案1】:

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

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

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

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

【讨论】:

我想我低估了标准 CPU 的 float 乘法的速度?我当时在想:将 10,000 doubles 相乘,这样做大约 100 万次听起来像是大量的计算(100 亿)。不是吗? @CycoMatto:您的 10,000 个双打乘以 100 万次与乘以一对 1800x1800 密集矩阵的翻牌数相同。一次。即使是使用适度调整的 BLAS 的适度 x86 处理器,这也是几秒钟的 CPU 时间..... @talonmies 好的。如果还有另一个级别的重复/循环呢?即:我有大约 100 万次试验。每项试验的总和必须超过 100 万个州。每个状态都需要乘以约 10,000 个双精度数。由于这些原因,我一直专注于 GPU + MPI @CycoMatto:增加工作量并不会改变你想法的基本问题。您的计算需要 N 个 64 位字通过线路传递并进入 GPU 以执行 N 次浮点运算。无论 N 有多大,你永远无法“获胜”——通信将比各种规模的计算慢得多。这就是为什么使用 GPU 没有意义的原因。将此与我提到的矩阵乘法示例进行比较。在那里,您需要 2N^2 个字的数据传输才能获得 2N^3 个触发器。在 GPU 上这样做是有利可图的。 @tolonmies 感谢我在过去两周对 CUDA 基础知识的研究中从未发现的智慧点。凭借并行处理,GPU 可能是计算中最快的野兽——就像一群蜜蜂。但是给那些蜜蜂喂它们需要的东西并从它们那里拿走你想要的东西需要努力,有时甚至会使收益无效,比如 OP 的案例。 (GIST:I/O 开销可能超过处理开销,因此......)【参考方案2】:

Here我发现了一些关于这个话题的新闻:

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

【讨论】:

以上是关于MPI + GPU:如何混合两种技术的主要内容,如果未能解决你的问题,请参考以下文章

在混合 MPI/OpenMP 中进行 MPI 调用的线程

OpenMP 和 MPI 混合程序

MPI和OpenMP混合编程并行计算--入门程序

在 MPICH 中执行混合 OpenMP/MPI 作业

MPI和OpenMP混合编程计算pi π值

LSF 中的混合 MPI/OpenMP