最近关于多核编程的讨论是否有人在探索使用MPI的可能性?
我在具有多核节点的大型集群上广泛使用了MPI.我不确定这对于单个多核盒子是否正确,但是如果你预计你的代码可能有一天比单个芯片更大,你可以考虑在MPI中实现它.现在,没有什么比MPI更大.我不确定提到不可接受的管理费用的海报来自何处,但我试图概述下面的相关权衡.继续阅读更多内容.
MPI是大规模科学计算的事实上的标准,并且已经在多核机器上广泛使用.它非常快.看一下最新的500强名单.该列表中的顶级机器在某些情况下具有数十万个处理器,具有多插槽双核和四核节点.这些机器中的许多都具有非常快速的定制网络(Torus,Mesh,Tree等)和优化的MPI实现,这些实现了解硬件.
如果你想将MPI与单芯片多核机器一起使用,它将正常工作.事实上,最新版本的Mac OS X 预装了OpenMPI,您可以在普通的多核Linux机器上轻松下载安装OpenMPI.OpenMPI在其大部分系统上都在Los Alamos使用. 利弗莫尔在他们的Linux集群上使用mvapich.在潜入之前你应该记住的是MPI是为解决分布式内存系统上的大规模科学问题而设计的.您正在处理的多核盒可能具有共享内存.
默认情况下,OpenMPI和其他实现使用共享内存进行本地消息传递,因此在将消息传递给本地进程时,您不必担心网络开销.这是非常透明的,我不确定其他海报在哪里得到他们对高开销的担忧.需要注意的是,MPI不是最容易用来在单个多核盒子上获得并行性的东西.在MPI中,所有消息传递都是显式的.由于这个原因,它被称为并行编程的"汇编语言".如果您不是经验丰富的HPC人员,并且还有其他更适合共享内存的范例(UPC,OpenMP,Erlang,仅举几例),您可以先尝试一下.
我的建议是,如果您预计编写可能需要多台机器来解决的并行应用程序,请使用MPI.您将能够使用常规多核盒进行测试和运行,并且一旦您在那里工作,迁移到群集将非常轻松.如果您正在编写只需要一台机器的应用程序,请尝试其他方法.有更简单的方法来利用这种并行性.
最后,如果您真的喜欢冒险,请尝试将MPI与线程,OpenMP或其他一些本地共享内存范例结合使用.您可以将MPI用于分布式消息传递,并使用其他方式进行节点上并行操作.这就是大型机器的发展方向; 具有数十万或更多处理器的未来机器预计将具有可扩展到所有节点但不是所有核心的MPI实现,并且HPC人员将被迫构建混合应用程序.这不适合胆小的人,在这个领域有一个公认的范例之前还有很多工作要做.
我不得不同意tgamblin.您可能不得不卷起袖子并真正深入研究代码以使用MPI,明确地处理自己传递消息的组织.如果这是你喜欢或不介意做的事情,我希望MPI在多核计算机上的工作方式与在分布式集群上的工作方式一样.
从个人经验来说......我在研究生院编写了一些C代码,在集群上进行电生理模型的大规模建模,其中每个节点本身就是一个多核机器.因此,我想到了一些不同的并行方法来解决这个问题.
1)我可以单独使用MPI,将每个处理器视为它自己的"节点",即使它们中的一些在同一台机器上组合在一起.
2)我可以使用MPI处理在多核节点之间移动的数据,然后在每个多核机器中使用线程(POSIX线程),其中处理器共享内存.
对于我正在研究的具体数学问题,我首先在一台多核机器上测试了两种配方:一种使用MPI,另一种使用POSIX线程.事实证明,MPI实现效率更高,双核机器的速度提高了接近2,而线程实现的速度提高了1.3-1.4.对于MPI代码,我能够组织操作,以便处理器很少空闲,在它们之间传递消息时保持忙碌并屏蔽传输数据的大部分延迟.使用线程代码,我最终遇到了许多互斥锁瓶颈,迫使线程经常坐下来等待其他线程完成计算.保持线程之间的计算负载平衡似乎没有帮助这个事实.
这可能只是我正在研究的模型所特有的,并且线程与MPI的有效性可能会因其他类型的并行问题而有很大差异.不过,我不同意MPI的开销很大.