Performance Erlang';s的并行性克服了它在数值计算中的弱点?

Performance Erlang';s的并行性克服了它在数值计算中的弱点?,performance,erlang,Performance,Erlang,随着最近关于并行计算的大肆宣传,我一直在思考很多关于并行、数字运算、集群等的问题 我开始读书。随着越来越多的人(包括我自己)学习,Erlang以一种令人印象深刻、优雅的方式处理并发 然后作者断言Erlang是。我可以理解像Erlang这样的语言会比C语言慢,但并发模型似乎非常适合图像处理或矩阵乘法之类的事情,尽管作者明确表示它不是 真的有那么糟糕吗?Erlang的优势克服了它在速度上的弱点,这是一个转折点吗?正在采取/正在采取哪些措施来应对速度问题 要明确的是:我并不是要开始一场辩论;我只是想知

随着最近关于并行计算的大肆宣传,我一直在思考很多关于并行、数字运算、集群等的问题

我开始读书。随着越来越多的人(包括我自己)学习,Erlang以一种令人印象深刻、优雅的方式处理并发

然后作者断言Erlang是。我可以理解像Erlang这样的语言会比C语言慢,但并发模型似乎非常适合图像处理或矩阵乘法之类的事情,尽管作者明确表示它不是

真的有那么糟糕吗?Erlang的优势克服了它在速度上的弱点,这是一个转折点吗?正在采取/正在采取哪些措施来应对速度问题

要明确的是:我并不是要开始一场辩论;我只是想知道

Erlang的优势克服了它在速度上的弱点,这是一个转折点吗

当然有。例如,当试图找到万亿数字的中位数时:):


就在您发布之前,我碰巧注意到这是erlang.reddit.com上的头号帖子。

有压力让erlang更快地执行数字代码。例如,HiPe编译器编译为本机代码而不是BEAM字节码,并且它可能对浮点代码进行了最有效的优化,从而避免了装箱。这对浮点代码非常有益,因为它可以将值直接存储在FPU寄存器中

对于大多数Erlang使用,Erlang的速度非常快。他们使用Erlang编写始终处于启动状态的控制系统,其中最重要的速度度量是低延迟响应。负载下的性能往往受IO限制。这些用户倾向于远离HiPe,因为它在调试实时系统时没有那么灵活/可塑性

现在,具有128Gb RAM的服务器并不少见,而且它们没有理由获得更多内存,一些IO限制的问题可能会转变为CPU限制。那可能是个司机

您应该遵循HiPe进行开发


你的图像处理和矩阵乘法的例子在我看来对Erlang来说是非常糟糕的匹配。这些都是受益于向量/SIMD操作的示例。Erlang不擅长并行(一次对多个值执行相同的操作)

Erlang进程是MIMD、多指令和多数据。Erlang在模式匹配和递归循环之后进行了大量分支。这会扼杀CPU指令管道

解决高度并行问题的最佳体系结构是GPU。对于用函数式语言编程GPU,我认为使用Haskell创建针对它们的程序最有潜力。GPU基本上是从输入数据到输出数据的纯函数。请参阅Haskell中创建FPGA电路的项目,如果可以在Haskell中如此干净地创建电路,那么为GPU创建程序数据就不会更难了


单元体系结构对于矢量化问题也非常好。

几乎任何语言都可以并行化。在一些语言中,这很简单,在另一些语言中,这是一件令人头痛的事,但这是可以做到的。如果你想在一个网格中运行8000个CPU的C++程序,那就继续吧!你可以做到。这是以前做过的

Erlang没有做任何在其他语言中不可能做到的事情。如果运行一个Erlang程序的单个CPU比运行一个C++程序的CPU效率低,那么二百CPU的运行Erlang也将比二百CPU运行C++的速度慢。 Erlang所做的是使这种并行性易于使用。它节省了开发人员的时间,减少了出现错误的机会

所以我要说不,Erlang的并行性不允许它超越另一种语言的数字运算能力

Erlang的得分在于更容易扩展并正确地进行扩展。但是,如果您愿意花费额外的开发时间,它仍然可以用其他更擅长数字运算的语言来完成

当然,我们不要忘记一个古老的观点,即语言没有速度。
一个足够好的Erlang编译器将产生完美的最佳代码。一个足够糟糕的C编译器会产生运行速度比任何其他编译器都慢的代码。

我认为更广泛的需要是指出,并行性不一定是速度的问题,甚至不是速度的问题


它是关于如何表达活动序列是偏序的算法或程序。

将并行性仅仅视为原始的数字运算能力是错误的。与GPU或经典超级计算机相比,Erlang更接近集群计算机的工作方式

在现代GPU和老式超级计算机中,性能完全取决于矢量化算法、专用计算硬件和处理单元之间的低延迟通信。因为通信延迟很低,而且每个单独的计算单元都非常快,所以理想的使用模式是用数据加载机器的RAM,并让它一次处理所有数据。这种处理可能涉及在节点之间传递大量数据,如图像处理或3D中所发生的情况,其中需要执行大量CPU限制的任务来将数据从输入表单转换为输出表单。当您经常需要转到磁盘、网络或其他低速I/O通道获取数据时,这种类型的机器是一个糟糕的选择。这至少会使一个昂贵的专用处理器闲置,而且可能还会阻塞数据处理管道,因此其他事情也无法完成

如果您的程序需要大量使用慢速I/O通道,那么更好的机器类型是具有许多廉价独立处理器(如集群)的机器。您可以在一台机器上运行Erlang,在这种情况下,您可以在该机器中获得类似集群的东西,或者可以轻松地在ac上运行它