当共享内存和Erlang都是消息传递时,为什么认为MPI比共享内存和Erlang更难?

当共享内存和Erlang都是消息传递时,为什么认为MPI比共享内存和Erlang更难?,erlang,multicore,parallel-processing,mpi,Erlang,Multicore,Parallel Processing,Mpi,最近,人们对Erlang作为一种在多核上编写并行程序的语言产生了很大的兴趣。我听说有人认为Erlang的消息传递模型比主流的共享内存模型(如线程)更容易编程 相反,在高性能计算社区中,占主导地位的并行编程模型是MPI,它也实现了消息传递模型。但在HPC世界中,这种消息传递模型通常被认为很难编程,人们认为像OpenMP或UPC这样的共享内存模型更容易编程 有人知道为什么在IT和HPC世界中,信息传递与共享内存的感知存在如此大的差异吗?是因为Erlang和MPI实现消息传递的方式存在一些根本性差异,

最近,人们对Erlang作为一种在多核上编写并行程序的语言产生了很大的兴趣。我听说有人认为Erlang的消息传递模型比主流的共享内存模型(如线程)更容易编程

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


有人知道为什么在IT和HPC世界中,信息传递与共享内存的感知存在如此大的差异吗?是因为Erlang和MPI实现消息传递的方式存在一些根本性差异,使得Erlang样式的消息传递比MPI容易得多吗?还是有其他原因

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

Erlang中的并行性仍然很难实现。我的意思是,你仍然需要知道如何分解你的问题,但是有一些小的事情可以缓解这个困难,与一些C或C++中的MPI库相比。p> 首先,由于Erlang的消息传递是一种一流的语言特性,因此语法上的糖分让它感觉更简单

此外,Erlang库都是围绕Erlang的消息传递构建的。这种支撑结构有助于提升并行处理能力。看看类似gen_服务器、gen_fsm和gen_事件。这些结构非常容易使用,可以帮助您的程序变得并行


我认为erlang的消息传递与其他MPI实现的区别在于可用标准库的健壮性,而不是语言本身的任何特定功能。

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

使用Erlang时,您必须在函数编程框架中思考,在这个框架中,数据实际上从一个函数调用到另一个函数调用,而接收是一种活动行为,看起来像语言中的正常构造。这使您能够在实际执行的计算与发送/接收消息的行为之间建立更紧密的联系

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


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

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

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

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

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

因此,与pthread和其他本地异构线程解决方案相比,Erlang是最好的选择,而不是MPI,MPI真正针对的是一个非常不同(并且在某种程度上本质上更难)的问题集

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

原因很简单,就是并行与并发。Erlang是为并发编程而产生的。HPC是关于并行编程的。这些是相关但不同的目标

hea使并发编程变得非常复杂