MPI&x2B;GPU:如何混合这两种技术

MPI&x2B;GPU:如何混合这两种技术,mpi,gpu,hpc,Mpi,Gpu,Hpc,我的程序非常适合MPI。每个CPU都执行自己的特定(复杂)任务,生成一个double,然后我使用MPI\u Reduce将每个CPU的结果相乘 但我重复了很多次(>100000次)。因此,我想到GPU会大大加快速度 我用谷歌搜索过,但找不到任何具体的东西。如何将MPI与GPU混合使用?程序是否有办法查询和验证“哦,这个级别是GPU,其他所有都是CPU”是否有推荐的教程或其他内容 重要的是,我不想要或不需要一整套GPU。我真的需要很多CPU,然后一个GPU来加速频繁使用的MPI\u Reduce操

我的程序非常适合MPI。每个CPU都执行自己的特定(复杂)任务,生成一个
double
,然后我使用
MPI\u Reduce
将每个CPU的结果相乘

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

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

重要的是,我不想要或不需要一整套GPU。我真的需要很多CPU,然后一个GPU来加速频繁使用的
MPI\u Reduce
操作

下面是我所说内容的示意图示例:

假设我有500个CPU。每个CPU以某种方式产生,比如说,50个
double
s。我需要将所有250,00个
double
s相乘。然后我重复了10000到100万次。如果我能有一个GPU(除了500个CPU),这将是非常有效的。每个CPU将为所有~100万个“状态”计算其50个
double
s。然后,所有500个CPU都会将它们的
double
s发送到GPU。然后,GPU将100万个“州”中的每一个州的250000个
double
s相乘,产生100万个
double


这些数字并不准确。计算量确实很大。我只是想表达一般问题。

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

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

不管怎样,Talonmes是对的;这个特殊的例子听上去并没有从GPU中获得多少好处。而且,每项任务都有数万个翻倍,这也不会有什么帮助;如果你每翻倍只做一次或几次,那么将数据发送到GPU的成本将超过让所有这些内核在其上运行的好处

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

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


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

这听起来不太适合GPU计算。您建议的GPU组件只包含几百个双精度MFLOP。这比GPU有利的数量级要小,并且会被通过导线将数据传输到承载GPU的节点以及通过PCI-e总线将数据传输到GPU内存的网络开销所淹没。@Talonmes为这个误导性的原理图示例感到抱歉。我将更新我的问题。实际上,它稍微复杂一些。我需要在*O*(10k)
两倍之间相乘。每个CPU都会产生一堆这样的
双倍
(而不仅仅是一个)。州的数量将在10000到几百万之间(不是简单的100000)。整个过程将经常重复。正如我所写的,这仍然只是几百兆次。这是一个很小的计算量,即使对于CPU来说也是如此。我想我低估了标准CPU的
float
乘法的速度?我在想:将10000次
相乘可以将
翻一番,这样做100万次听起来像是一个巨大的计算量(100亿次)。是吗?@CycoMatto:你的10000个双倍乘以100万次与乘以一对1800x1800密集矩阵的失败次数相同。一旦即使使用一个经过合理调整的BLAS的普通x86处理器,也只需要几秒钟的CPU时间。…@talonmies OK。如果还有另一个级别的重复/循环呢?i、 e:我有大约100万次试用。每次审判的州数必须超过100万。每个州需要大约10000倍的乘法。出于这些原因,我专注于GPU+MPI@CycoMatto:增加工作量并不能改变你想法的基本问题。您的计算需要N个64位字通过导线进入GPU,以便执行N次触发器。不管N有多大,你永远不可能“赢”——无论大小,通信都会比计算慢得多。这就是为什么使用GPU没有意义。将此与我提到的矩阵乘法示例进行比较。在这里,您需要2N^2个字的数据传输才能获得2N^3个触发器。在GPU上这样做是有利可图的。@Tolonmy感谢我在过去两周的CUDA基础研究中从未发现的智慧点。GPU可能是t中最快的野兽