Mathematica 的并行计算
在 80 年代,我参加了一个科学演讲,是关于一种相当麻烦的方法来并行化当时存在的一个符号计算系统,我很快意识到我可以更优雅地为 Mathematica 带来并行性,这要归功于它的符号通信协议 MathLink。这个协议让我不仅可以在同时运行的 Mathematica 内核之间交换数据,还可以交换程序。
结果是一个完全用Mathematica编写的包,称为 Parallel Computing Toolkit (https://wolfr.am/10mMRZwRh)。当时,并行计算意味着昂贵的大型机器、FORTRAN 和批处理作业,在交互式的 Mathematica 笔记本上实验不同的并行模式是相当令人满意的,在本地网络上的多台机器进行计算, 能够并行地进行函数编程,并并行地使用符号表达式和任意精度的算法。很多人对此表示很惊讶,他们认为并行化是一件非常复杂的事情,需要超级计算机和大量资金,以及相当大的问题,才值得。事实是,人们解决的大多数问题都很容易并行化。
与此同时,并行计算机的格局已经稳定并演变为三种架构:多核机器、托管集群和 PC 的自组织网络。Mathematica 在所有这些方面的工作方式都相同,但查找资源和启动流程的方式却大不相同;Mathematica 非常适合与现有环境交互,并且通过一些额外的 Java 代码,现在可以直接在所有三种架构中使用。
为了应对多核机器的广泛可用性,Wolfram Research 决定在 Mathematica 的每个软件中包含我的 Parallel Computing Toolkit 的功能。此时(对于第 7 版)我们还彻底修改了并行命令的设计。
因此,Mathematica 现在知道它运行的计算机的处理器内核数量,并在需要时自动使用它们。
只要您使用其中一个并行命令(例如并行计算表的元素),Mathematica 就会在每个内核上启动一个额外的内核并分配工作。为了让自己相信计算确实发生在这些额外的内核上,我们可以要求一个计算来告诉我们每个元素的计算位置。
每个正在运行的内核都有一个唯一的 ID 值,可以帮助调度更复杂的分布式算法。
本周 (2009/3/18) 发布的 gridMathematica Server (https://wolfr.am/10mM353BQ) 是迈向无障碍并行计算的又一重要步骤。在早期,人们必须收集网络中所有可用机器的主机名,并使用远程登录技术在这些机器上启动 Mathematica。如今,您网络上的 gridMathematica 安装将自我宣传,就像您的打印机、多媒体播放器和其他共享资源一样。
可用的机器将显示在控制面板中,您只需选择要使用的机器即可。在这里,我的小网络由两台双核机器组成,其中一台可用。
现在,我总共有六个内核可用。
Mathematica 也是分析并行计算性能的最佳工具。在这里,我们测量了两个远程内核的基本延迟。延迟只是简单计算的往返时间。
并非所有计算都受益于并行化。例如,内核计算 Sin[1.0] 所花费的时间比将这个命令发送到另一个内核并接收结果所花费的时间要少。
新的并行状态窗口使用动态更新来显示每次并行计算后的基本性能数据。它可以让您一目了然地看到调度对不均匀问题的影响。在第一次运行中,我们将一系列素性测试单独安排到两个可用的内核上。从状态窗口的快照可以看出,这两个内核都执行了相当一部分工作。
现在我们预先在每个内核上安排一半的测试。其中一个不走运,得到了所有困难的情况(素性测试的时间变化很大),因此,另一个内核基本上处于空闲状态——这在并行计算中不是您想要的。
您还可以看到,在执行所有调度和通信的主内核中花费的时间在第一种情况下要高一些;这是您为更精细的调度付出的代价,在这种情况下非常值得(但并非总是如此)。
Mathematica 适用于多核桌面 PC, gridMathematica Server 适用于网络上的所有其他计算机,为并行计算提供了一个易于使用、功能强大的交互式系统。 在第一次考虑 Mathematica 中的并行性将近 20 年后,我的早期开发现在已成为 Mathematica 的标准部分,这是一个越来越全面的系统,可以在任何可用的计算机上进行计算。