【发布时间】: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,这也是很小的计算量。