为什么MPI被认为比共享内存更难,而Erlang在消息传递时更容易被认为更容易?
-
06-07-2019 - |
题
目前,Erlang作为一种在多核上编写并行程序的语言,现在引起了很多人的兴趣。我听说有人认为Erlang的消息传递模型比主流共享内存模型(如线程)更容易编程。
相反,在高性能计算社区中,主要的并行编程模型是MPI,它也实现了消息传递模型。但是在HPC领域,这种消息传递模型通常被认为很难编程,人们认为OpenMP或UPC等共享内存模型更容易编程。
有谁知道为什么在IT和HPC世界中消息传递与共享内存的感知存在这样的差异?是否由于Erlang和MPI如何实现消息传递的一些根本区别,使得Erlang风格的消息传递比MPI更容易?还是有其他原因吗?
解决方案
我同意之前的所有答案,但我认为一个未完全明确的关键点是,MPI可能被认为很难并且Erlang容易的一个原因是模型与域的匹配。
Erlang基于本地内存,异步消息传递和共享状态的概念,通过使用所有线程可以获得的某种形式的全局数据库来解决。它专为不会移动大量数据的应用程序而设计,并且不应该爆炸到需要协调的100k个单独节点。
MPI基于本地内存和消息传递,适用于移动数据是域的关键部分的问题。高性能计算非常关注数据集的问题,并将其分解为大量计算资源。这在消息传递系统中非常困难,因为数据必须在记住平衡的情况下明确分发。从本质上讲,MPI可以被视为一种勉强的准入,共享内存不会扩展。它的目标是跨越100k或更多处理器的高性能计算。
Erlang并不是试图获得最高性能,而是将自然并行的问题分解为自然线程。与MPI相比,它的设计考虑了完全不同类型的编程任务。
因此,与pthreads和其他相当本地的异构线程解决方案相比,Erlang是最好的,而不是MPI,它实际上针对的是一个非常不同(在某种程度上固有的更难)的问题集。
其他提示
Erlang 中的并行性仍然很难实现。我的意思是你仍然需要弄清楚如何分解你的问题,但是与C或C ++中的某些MPI库相比,有一些小问题可以缓解这个难题。
首先,由于Erlang的消息传递是一流的语言特性,因此语法糖使其变得更容易。
此外,Erlang库都是围绕Erlang的消息传递构建的。这种支撑结构有助于提升并行处理的土地。请查看 OTP的组件,例如gen_server,gen_fsm,gen_event。这些是非常易于使用的结构,可以帮助您的程序变得平行。
我认为可用标准库的稳健性更多地区分了erlang从其他MPI实现传递的消息,而不是语言本身的任何特定功能。
我认为当你使用MPI进行编程以及使用Erlang进行编程时,它与思维方式有关。例如,MPI没有内置到语言中,而Erlang内置了对消息传递的支持。另一个可能的原因是仅发送/接收消息和将解决方案划分为并发执行单元之间的脱节。
使用Erlang,您不得不在函数式编程框架中思考数据实际上从函数调用到函数调用 - 并且接收是一种看起来像语言中的正常构造的活动行为。这使您可以在实际执行的计算与发送/接收消息的行为之间建立更紧密的联系。
另一方面,对于MPI,您不得不仅考虑实际的消息传递,而不是实际的分解工作。这种思维方式需要在代码中编写解决方案和消息传递基础结构之间进行某种上下文切换。
讨论可以继续进行,但常见的观点是,如果消息传递的构造实际上构建在您正在使用的编程语言和范例中,那么通常这是表达解决方案的更好方法,而不是其他方面。 “粘在上面”或作为语言的附加物存在(以库或扩展名的形式)。
有谁知道为什么在IT和HPC世界中消息传递与共享内存的感知存在这样的差异?是否由于Erlang和MPI如何实现消息传递的一些根本区别,使得Erlang风格的消息传递比MPI更容易?还是有其他原因吗?
原因很简单就是并行性与并发性。 Erlang是用于并发编程的。 HPC完全是关于并行编程的。这些是相关但不同的目标。
严重的非确定性控制流程使并发编程变得非常复杂,延迟通常是一个重要的目标。 Erlang使用不可变数据结构大大简化了并发编程。
并行编程具有更简单的控制流程,目标是最大总吞吐量而不是延迟。高效的缓存使用在这里更为重要,这使得Erlang和不可变数据结构在很大程度上都不合适。在这种情况下,变异共享内存既易于处理,也更好。实际上,缓存一致性为您提供了硬件加速的消息传递。
最后,除了这些技术差异之外,还存在一个政治问题。 Erlang家伙正试图通过假装Erlang与多核相关而不是多核的方式来进行多核炒作。特别值得一提的是,它们具有很强的可扩展性,因此必须考虑绝对性能。 Erlang可以毫不费力地从一个内核上的绝对性能差到任意数量内核上的绝对性能差。可以想象,这并没有给HPC社区留下深刻的印象(但它足以支持大量并发代码)。
关于MPI与OpenMP / UPC:MPI迫使您将问题分成小块并负责移动数据。使用OpenMP / UPC,“所有数据都在那里”,您只需取消引用指针即可。 MPI的优势在于32-512 CPU集群比32-512 CPU单机便宜得多。此外,在设计算法时,使用MPI可以预先支出费用。如果您的系统使用NUMA(并且所有大型系统都使用NUMA),OpenMP / UPC可以隐藏您在运行时获得的延迟 - 您的程序将无法扩展,并且需要一段时间来找出原因。
本文实际上很好地解释了它,当我们发送小块数据时,Erlang是最好的,而MPI在更复杂的事情上做得更好。 Erlang模型也很容易理解: - )