Erlang的并行性在什么时候克服了它在数值计算方面的弱点?

随着最近在并行计算方面的所有炒作,我一直在考虑很多关于并行性,数字运算,集群等等。

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

然后,作者声称,Erlang 并不适合数字运算 。 我可以理解像Erlang这样的语言会比C语言慢,但是并发模型似乎非常适合像image processing或matrix乘法这样的事情,尽pipe作者特别说明了这一点。

这真的很糟吗? Erlang的实力是否克服了当地速度的不足? 正在采取什么措施来处理速度?

要清楚:我不是想开始辩论, 我只是想知道。

把并行性看作只是对原始数据进行处理是错误的。 Erlang更接近集群计算机的工作方式,比如GPU或传统的超级计算机。

在现代GPU和旧式超级计算机中,性能都是关于vector化algorithm,专用计算硬件和处理单元之间的低延迟通信。 由于通信延迟很低,每个计算单元都非常快,所以理想的使用模式是将数据加载到机器的RAM中,并一次性完成。 这个处理可能涉及大量的数据在节点之间传递,就像在image processing或者3D中那样,在那里有很多CPU绑定的任务要把数据从input表单转换成输出表单。 如果您经常需要访问磁盘,networking或其他一些较慢的I / O通道以获取数据,则这种types的机器是不好的select。 这样至less有一个昂贵的专用处理器闲置,也可能扼杀数据处理pipe道,所以没有别的办法。

如果您的程序需要大量使用缓慢的I / O通道,那么更好的一种机器就是具有许多便宜的独立处理器的机器,如集群。 您可以在单台机器上运行Erlang,在这种情况下,您可以在该机器中获得类似于群集的内容,也可以在实际的硬件群集上轻松运行它,在这种情况下,您将拥有一个群集群集。 在这里,通信开销仍然是空闲的处理单元,但是因为在计算硬件的每一位上运行着许多处理单元,Erlang可以瞬间切换到其他进程之一。 如果整个机器正在等待I / O,那么硬件集群中的其他节点仍然可以独立运行。 当通信开销如此之高以至于每个节点都在等待其他节点,或者对于一般的I / O,这种情况下,这种模式只会崩溃,在这种情况下,您需要更快的I / O或更多的节点,而Erlang自然会占据优势的。

通信和控制系统是Erlang的理想应用,因为每个单独的处理任务只占用很less的CPU,只偶尔需要与其他处理节点通信。 大多数情况下,每个进程都是独立运行的,每个进程只占用CPU的一小部分。 这里最重要的是能够有效地处理数以千计的这些数据。

绝对需要经典超级计算机的经典案例是天气预报。 在这里,你将大气分成多维数据集,并进行物理模拟以找出每个多维数据集中发生的事情,但是由于空气在每个多维数据集之间移动,所以不能使用一个聚类,因此每个多维数据集都与其相邻的6个邻居保持通信。 (空气不通过立方体的边缘或angular落,无限精细,因此不会与其他20个相邻的立方体对话)。在集群上运行它,无论是运行Erlang还是其他系统,以及它立即成为I / O限制。

Erlang的实力是否克服了当地速度的不足?

那当然有。 例如,当试图find一个万亿数字的中位数:):

http://matpalm.com/median/question.html

就在你发布之前,我碰巧注意到这是erlang.reddit.com上的第一个post。

几乎所有的语言都可以并行化。 在某些语言中,这很简单,而在另一些语言中,这是一个痛苦的屁股,但是可以做到。 如果你想在一个网格中的8000个CPU上运行一个C ++程序,请继续! 你可以做到这一点。 这是以前完成的。

Erlang不会做任何其他语言中不可能的事情。 如果运行Erlang程序的单个CPU效率低于运行C ++程序的CPU,那么运行Erlang的两百个CPU也会比运行C ++的两百个CPU慢。

Erlang所做的就是使这种并行性易于使用 。 这节省了开发人员的时间,并减less了错误的机会。

所以我要说的是,Erlang的并行性使其超越了另一种语言的数字计算能力,没有任何引爆点。

Erlang的分数正在使它更容易扩展并正确地执行。 但是,如果你愿意花费额外的开发时间,它仍然可以用其他语言更好的数字处理来完成。

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

有迫使Erlang更快地执行数字代码。 HiPe编译器编译为本地代码,而不是BEAM字节码,例如,它可能对浮点上的代码进行最有效的优化,从而避免装箱。 这对浮点代码非常有用,因为它可以直接在FPU寄存器中存储值。

对于Erlang的大部分用法来说,Erlang已经足够快了。 他们使用Erlang编写总是控制系统,其中最重要的速度测量是低延迟响应。 负载下的性能倾向于IO限制。 这些用户倾向于远离HiPe,因为它在debugging现场系统方面不够灵活/可塑。

现在,128Gb内存的服务器并不less见,而且没有理由获得更多的内存,有些IO限制的问题可能会转移到CPU限制的地步。 这可能是一个驱动程序。

你应该遵循HiPe的发展。


尽pipe如此,你的图像操作和matrix乘法的例子在我看来是Erlang非常糟糕的匹配。 这些都是从vector / SIMD操作中受益的例子。 Erlang并不擅长并列(一个人同时对多个值做同样的事情)。

Erlang进程是MIMD,多重指令多个数据。 Erlang在模式匹配和recursion循环背后有很多分支。 这杀死了CPU指令stream水线。

针对严重并行问题的最佳架构是GPU。 对于function语言中的GPU编程,我认为使用Haskell创build针对它们的程序是最好的。 GPU基本上是从input数据到输出数据的纯粹function。 查看Haskell中用于创buildFPGA电路的Lava项目,如果可以在Haskell中如此干净地创build电路,那么为GPU创build程序数据就不会更困难。

Cell架构对于可vector化的问题也非常好。

我认为更广泛的需要是指出并行性不一定是甚至是典型的速度。

它是关于如何expressionalgorithm或程序,其中活动序列是偏序的。