并行MATLAB:多处理器多核

克利夫·莫尔(Cleve Moler), MathWorks出版社


并行MATLAB:多处理器多核

12年前,1995年春天,我写了一篇名为《克利夫角》的文章“为什么没有并行的MATLAB。”那篇一页的文章已经成为我最常被引用的论文之一。当时,我认为大多数当代并行计算机的分布式内存模型与MATLAB内存模型,MATLAB仅将其执行时间的一小部分用于可以自动并行化的任务,并且没有足够的潜在客户来证明进行重大开发的合理性。

今天的情况大不相同。首先,MATLAB已经从一个简单的“矩阵实验室”发展成为一个成熟的技术计算环境,它支持的大型项目远远不止涉及数值线性代数。其次,今天的微处理器有两个或四个计算核心(我们可以预期未来会有更多),而现代计算机有复杂的分层存储结构。第三,大多数MATLAB用户现在可以访问集群和机器网络金宝app,不久将拥有个人并行计算机。

由于所有这些变化,我们现在有了平行MATLAB

MATLAB支金宝app持三种并行:多线程、分布式计算和显式并行。这些不同的类型可以共存—例如,一个分布式计算作业可以在每台机器上调用多线程函数,然后使用一个分布式数组来收集最终结果。对于多线程并行,线程的数量可以在MATLAB Preferences面板中设置。我们使用英特尔数学内核库,其中包括BLAS(基本线性代数子例程)的多线程版本。对于向量参数,MATLAB基本函数库(包括指数函数和三角函数)是多线程的。

选择使用哪种形式的并行是很复杂的。克里夫角描述了一些结合多线程和分布式并行的实验。

三种类型的并行计算


多线程并行。在多线程并行中,MATLAB的一个实例自动生成多个并发指令流。多个处理器或内核共享一台计算机的内存,执行这些流。一个例子是对矩阵的元素求和。

分布式计算在分布式计算中,MATLAB的多个实例在不同的计算机上运行多个独立的计算,每个实例都有自己的内存。几年前,我把这种非常常见和重要的并行称为“尴尬的并行”,因为不需要新的计算机科学。在大多数情况下,单个程序使用不同的参数或不同的随机数种子运行多次。

显式并行。在显式并行中,多个MATLAB实例在多个处理器或计算机上运行,通常具有单独的内存,同时执行单个MATLAB命令或M函数。新的编程结构,包括并行循环和分布式阵列,描述了并行性。

并行计算集群

图1是一个典型示例的示意图并行计算集群。灰盒是独立的计算机,每个都有自己的机箱、电源、磁盘驱动器、网络连接和内存。浅蓝色的盒子是微处理器。每个微处理器内部的深蓝色方框是计算核心。绿色的盒子是主要的记忆。有几种不同的内存模型。在某些设计中,每个核心都可以统一访问整个内存。在其他情况下,内存访问时间是不统一的,我们的绿色存储盒可以分为两个或四个连接到每个处理器或核心。

图1.一个典型的并行计算集群。

在MathWorks,我们有几个这样的集群,运行Linux和Windows操作系统。其中一台有16台双处理器、双核计算机。每台机器有两个AMD Opteron 285处理器,每个处理器有两个内核。每台计算机也有4G的内存,由该计算机上的四个内核共享。因此,我们有多达64个独立的计算流,但只有16个主存储器。我们称这些集群为HPC实验室,用于高性能或高生产率计算,尽管它们肯定不是超级计算机。

与顶级超级计算机相比,我们的高性能计算实验室有一个重要的优势:一个人可以接管整个机器进行交互使用。但这是一种奢侈。当几个人共享一个并行计算设备时,他们通常必须将作业提交到一个队列中,以便在机器允许的时间和空间内进行处理。大规模交互计算是罕见的。

第一版分布式计算工具箱,于2005年发布,提供了在这种环境中管理多个独立MATLAB作业的能力。2006年发布的第二个版本添加了MPI的MATLAB绑定,MPI是作业间通信的行业标准。由于MATLAB代表“矩阵实验室”,我们决定将MATLAB的每个实例称为“实验室”,并介绍了numlabs,一项工作涉及的实验室数量。

从分布式计算工具箱的3.0版开始,MathWorks增加了对新编程结构的支持,使MATLAB超越了第一个基准所涉及的令人尴尬的并行、多任务计算风格。金宝app

在多个MATLAB任务中使用多线程数学库

这个实验的出发点是长凳,的源代码长凳示例。我删除了图形任务和所有报告生成代码,只剩下四个计算任务:

  • 颂诗-使用ODE45在长时间间隔内求解范德波尔常微分方程
  • 快速傅里叶变换-使用FFTW计算长度为2的向量的傅里叶变换20
  • -使用LAPACK将1000×1000实密度矩阵因子化
  • 稀疏的-使用A\b求解具有331823个非零的66603阶稀疏线性系统

我使用分布式计算工具箱和MATLAB分布式计算引擎要运行此精简版本的多个副本长凳. 计算是令人尴尬的并行的,一旦启动,任务之间就没有通信,直到在运行结束时收集执行时结果。计算也是多线程的。

图2到图5中的曲线图显示了一个实验室中一个单线程任务的执行时间与多个实验室中多个多线程任务的执行时间的比率。水平线代表完美的效率-P任务可以在计算机上完成P第一点也是最重要的一点是,对于所有四项任务,蓝色曲线与水平线无法区分,最多16个实验室。这表明,如果每台计算机最多有一个任务,单线程任务将获得完美的效率。这并不奇怪。如果这些令人尴尬的并行任务不是真的,那将是硬件、软件或测量中存在严重缺陷的迹象。但是,由于有16个以上的实验室,或者每个实验室有一个以上的线程,因此性能更加复杂。要了解原因,我们需要分别查看每个计算。

ODE任务(图2)是许多MATLAB任务的典型:它涉及解释的m代码、重复的函数调用、适度的数据量、适度的ODE求解器每一步的算术量,以及许多步骤。通过这项任务,我们获得了完美的效率,甚至高达64个实验室。每个单独的核可以处理一个实验室的所有计算。内存需求并不占主导地位。使用多个线程没有效果,因为任务不访问任何多线程库。事实上,还不清楚如何使用多线程。

图2。ODE任务的执行速度比。

FFT任务(图3)涉及一个长度向量n=220.的n o (log n)复杂性意味着对于每个向量元素只有少量的算术运算。该任务在16个实验室中获得了近乎完美的效率,但当超过16个实验室时,由于多核无法足够快地从内存中获取数据,比率就会下降。64个实验室完成64项任务的时间比一个实验室完成一项任务的时间多40%左右。同样,多线程没有效果,因为我们没有使用多线程FFT库。

图3。FFT任务的执行速度比。

LU图中的蓝线(图4)显示,每个实验室只有一个线程,我们可以获得很好但不是很完美的效率,最多64个实验室。64个实验室完成64项任务所需的时间仅比一个实验室完成一项任务所需的时间多6%左右。矩阵的顺序是n=1000.的N2.存储与FFT任务大致相同,但是N3.复杂性意味着每个元素被多次重用。底层的LAPACK分解算法有效地利用了缓存,因此只有16个主存储器的事实不会对计算时间产生不利影响。

图4。LU任务和不同级别多线程的执行速度比。

LU图中的绿色和红色线表明,只要线程数乘以实验室数不超过内核数,每个实验室使用两个或四个线程是一种优势。有了这个限制,每个实验室两个线程的运行速度比一个线程快20%,每个实验室四个线程的运行速度比一个线程快60%。矩阵越大,这些百分比越大;矩阵越小,这些百分比越小。如果有超过64个线程,也就是说,超过32个实验室每个实验室使用两个线程,或者超过16个实验室每个实验室使用四个线程,那么多线程将适得其反。

稀疏任务的结果(图5)是最不典型但可能最令人惊讶的。蓝线再次表明,每个实验室只有一个线程,我们获得了很好的效率。然而,红色和绿色线表明,多线程总是适得其反,至少对于这个特定的矩阵。CHOLMOD,Tim Da开发的超节点稀疏Cholesky线性方程求解器vis最近被引入MATLAB,但在我们关注多线程之前。当每个非零矩阵元素的浮点运算数超过指定阈值时,该算法从不使用BLAS的稀疏数据结构切换到密集数据结构和多线程BLAS。超节点算法hm涉及对高度矩形矩阵的操作。BLA似乎不能很好地处理此类矩阵。我们需要重新检查CHOLMOD和BLA,使它们更有效地协同工作。

图5。稀疏任务和不同级别多线程的执行速度比。

2007年出版-91467v00

下载188bet金宝搏使用的产品

了解更多

    查看相关功能的文章

    查看相关行业的文章