33

如今,人们对 Erlang 作为一种在多核上编写并行程序的语言很感兴趣。我听说有人争辩说,Erlang 的消息传递模型比主要的共享内存模型(如线程)更容易编程。

相反,在高性能计算社区中,占主导地位的并行编程模型是 MPI,它也实现了消息传递模型。但在 HPC 世界中,这种消息传递模型通常被认为很难编程,人们认为 OpenMP 或 UPC 等共享内存模型更容易编程。

有谁知道为什么在 IT 和 HPC 世界中对消息传递和共享内存的理解存在如此大的差异?是不是因为 Erlang 和 MPI 在实现消息传递方面的一些根本差异,使得 Erlang 风格的消息传递比 MPI 更容易?还是有其他原因?

4

7 回答 7

39

我同意所有以前的答案,但我认为一个没有完全清楚的关键点是 MPI 可能被认为很难而 Erlang 容易的一个原因是模型与域的匹配。

Erlang 基于本地内存、异步消息传递和共享状态的概念,通过使用某种形式的所有线程都可以访问的全局数据库来解决。它专为不移动大量数据的应用程序而设计,并且不应该扩展到需要协调的 100k 单独节点。

MPI 基于本地内存和消息传递,旨在解决移动数据是域的关键部分的问题。高性能计算在很大程度上是将数据集用于解决问题,并将其拆分到大量计算资源中。这在消息传递系统中是一项相当艰巨的工作,因为数据必须在考虑平衡的情况下显式分布。从本质上讲,MPI 可以被视为共享内存无法扩展的勉强承认。它的目标是跨 100k 处理器或更多处理器进行高性能计算。

Erlang 并没有试图达到尽可能高的性能,而是将一个自然并行的问题分解成它的自然线程。与 MPI 相比,它的设计考虑了完全不同类型的编程任务。

因此,与 pthread 和其他相当局部的异构线程解决方案相比,Erlang 最好,而不是 MPI,后者真正针对的是非常不同的(并且在某种程度上固有地更难)问题集。

于 2008-11-01T21:13:56.457 回答
13

Erlang 中的并行性仍然很难实现。我的意思是你仍然需要弄清楚如何分解你的问题,但是与 C 或 C++ 中的某些 MPI 库相比,有一些小事情可以缓解这个困难。

首先,由于 Erlang 的消息传递是一流的语言特性,语法糖让它感觉更容易。

此外,Erlang 库都是围绕 Erlang 的消息传递构建的。这种支持结构有助于您进入并行处理领域。看看OTP 的组件,如 gen_server、gen_fsm、gen_event。这些是非常易于使用的结构,可以帮助您的程序变得并行。

我认为更多是可用标准库的稳健性将 erlang 的消息传递与其他 MPI 实现区分开来,而不是语言本身的任何特定功能。

于 2008-10-09T03:20:01.027 回答
10

通常,HPC 中的并发意味着处理大量数据。这种并行性称为数据并行性,使用 OpenMP 等共享内存方法确实更容易实现,因为操作系统会处理诸如调度和放置任务之类的事情,如果使用消息传递范式,则必须自己实现.

相比之下,Erlang 旨在应对电话系统中遇到的任务并行性,其中必须同时执行不同的代码片段,而通信量有限,并且对容错和恢复有很强的要求。

这个模型类似于大多数人使用 PThreads 的模型。它适合像 Web 服务器这样的应用程序,其中每个请求都可以由不同的线程处理,而 HPC 应用程序对大量数据执行几乎相同的操作,这些数据也必须在工作人员之间交换。

于 2011-12-07T15:57:18.887 回答
9

我认为这与使用 MPI 编程和使用 Erlang 编程时的思维方式有关。例如,MPI 不是语言内置的,而 Erlang 内置了对消息传递的支持。另一个可能的原因是仅发送/接收消息和将解决方案划分为并发执行单元之间的脱节。

使用 Erlang,您被迫在函数式编程框架中思考,其中数据实际上从函数调用到函数调用 - 并且接收是一种主动行为,看起来像该语言中的正常构造。这使您在实际执行的计算与发送/接收消息的行为之间建立了更紧密的联系。

另一方面,使用 MPI,您被迫只考虑实际的消息传递,而不是真正的工作分解。这种思维框架需要在编写解决方案和代码中的消息传递基础架构之间进行一些上下文切换。

讨论可以继续,但普遍的观点是,如果消息传递的结构实际上内置于您正在使用的编程语言和范式中,那么与其他“附加的东西”相比,这通常是表达解决方案的更好方法" 或作为语言的附加组件存在(以库或扩展的形式)。

于 2008-11-01T20:21:14.253 回答
5

有谁知道为什么在 IT 和 HPC 世界中对消息传递和共享内存的理解存在如此大的差异?是不是因为 Erlang 和 MPI 在实现消息传递方面的一些根本差异,使得 Erlang 风格的消息传递比 MPI 更容易?还是有其他原因?

原因只是并行性与并发性。Erlang 是为并发编程而生的。HPC 是关于并行编程的。这些是相关但不同的目标。

并发编程由于严重的非确定性控制流而变得非常复杂,并且延迟通常是一个重要目标。Erlang 对不可变数据结构的使用极大地简化了并发编程。

并行编程具有更简单的控制流程,目标都是关于最大总吞吐量而不是延迟。有效的缓存使用在这里更为重要,这使得 Erlang 和不可变数据结构在很大程度上都不合适。在这种情况下,改变共享内存既容易处理,也更好。实际上,缓存一致性为您提供了硬件加速的消息传递。

最后,除了这些技术差异之外,还有一个政治问题。Erlang 的人试图通过假装 Erlang 与多核相关,而实际上并不相关,从而乘风破浪。特别是,他们吹捧了极大的可扩展性,因此也必须考虑绝对性能。Erlang 可以毫不费力地从一个核心的绝对性能差到任意数量的核心的绝对性能差。正如您可以想象的那样,这并没有给 HPC 社区留下深刻印象(但对于许多高度并发的代码来说已经足够了)。

于 2010-12-27T01:13:12.567 回答
1

关于 MPI 与 OpenMP/UPC:MPI 迫使您将问题分成小块并负责移动数据。使用 OpenMP/UPC,“所有数据都在那里”,您只需要取消引用一个指针。MPI的优势是32-512 CPU集群比32-512 CPU单机便宜很多。此外,当您设计算法时,使用 MPI 的费用是前期费用。如果您的系统使用 NUMA(并且所有大型系统都使用),OpenMP/UPC 可以隐藏您将在运行时获得的延迟 - 您的程序将无法扩展,并且需要一段时间才能找出原因。

于 2008-10-09T00:19:28.097 回答
1

这篇文章实际上解释得很好,当我们发送小块数据时,Erlang 是最好的,而 MPI 在更复杂的事情上做得更好。Erlang 模型也很容易理解 :-)

Erlang 与 MPI - 最终结果和源代码

于 2012-06-19T10:39:04.937 回答