并行MATLAB:多处理器多核

由克莱尔,Mathworks

并行MATLAB:多处理器多核

12年前,在1995年的春天,我写了一篇克里夫角的文章,标题是《为什么没有并行的MATLAB》那篇一页纸的文章成为我引用次数最多的论文之一。当时,我认为大多数当代并行计算机的分布式内存模型与MATLAB内存模型,MATLAB只把一小部分执行时间花在可以自动并行化的任务上,并且没有足够的潜在客户来证明大量的开发工作是合理的。

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

由于所有这些变化,我们现在有平行Matlab.

Matlab支金宝app持三种并行性:多线程,分布式计算和明确的并行性。这些不同类型可以共存 - 例如,分布式计算作业可能会在每台计算机上调用多线程功能,然后使用分布式阵列收集最终结果。对于多线程并行性,可以在MATLAB首选项面板中设置线程数。我们使用Intel Math Kernel库,其中包括BLA的多线程版本(基本线性代数子程序)。对于矢量参数,Matlab基本函数库包括指数和三角函数,是多线程的。

选择要使用的平行形式可能是复杂的。这个Cleve的角落描述了一些与多线程和分布式并行性相结合的实验。

三种类型的并行计算


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

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

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

并行计算群集

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

图1所示。典型的并行计算集群。

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

我们的HPC实验室拥有一流的超级计算机上的一个重要优势:一个人可以接管整个机器进行交互式使用。但这是一种奢侈品。当几个人共享并行计算设施时,它们通常必须将作业提交给队列,以便在机器许可证上作为时间和空间处理。大型互动计算很少见。

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

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

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

这个实验的起点是bench.m的源代码板凳上的例子。我删除了图形任务和所有生成报告的代码,只留下四个计算任务:

  • 颂歌-用ODE45求解长时间段范德堡尔常微分方程
  • FFT-使用FFTW计算长度为2的向量的傅里叶变换20.
  • -使用LAPACK分解1000 × 1000的真实密度矩阵
  • 用A\b解一个66603阶的稀疏线性方程组,其中331823个非零

我使用了分布式计算工具箱和MATLAB分布式计算引擎来运行这个精简版的多份拷贝板凳上。计算是令人尴尬的并行的——一旦启动,任务之间就没有通信,直到运行结束时收集到执行时间结果。计算也是多线程的。

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

ode任务(图2)是许多MATLAB任务的典型:它涉及解释的M代码,重复函数调用,颂歌求解器的每个步骤的适度数据量,以及许多步骤。通过这项任务,我们可以获得完美的效率,甚至最多64个实验室。每个核心都可以处理一个实验室的所有计算。内存需求不占主导地位。使用多个线程没有效果​​,因为任务没有访问任何多线程库。实际上,目前尚不清楚可以使用多线程。

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

FFT任务(图3)涉及长度的向量n = 220.。这n log n.复杂性意味着每个矢量元素只有少数算术运算。该任务几乎具有16个实验室的完美效率,但超过16个比率恶化,因为多个核心无法从内存中获取数据。64个实验室完成64个任务需要的时间约为40%,超过一个实验室完成一个任务的时间。同样,多个线程没有效果​​,因为我们不使用多线程FFT库。

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

LU图中的蓝线(图4)显示,在每个实验室只有一个线程的情况下,我们获得了很好的但不是很完美的效率,最多达到64个实验室。64个实验室完成64项任务的时间只比一个实验室完成一项任务的时间多6%。矩阵顺序为n = 1000。这n2存储和FFT任务差不多,但是n3.复杂性意味着每个元素都要重复使用很多次。底层的LAPACK分解算法有效地利用了缓存,因此只有16个主内存的事实并不会对计算时间产生不利影响。

图4。逻辑单元任务的执行速度比和不同层次的多线程。

逻辑单元图中的绿色和红色线表明,只要线程数乘以实验室数不超过核数,每个实验室使用两个或四个线程是有好处的。有了这个限制,每个实验室两个线程的运行速度比一个线程快20%,每个实验室四个线程的运行速度比一个线程快60%。矩阵越大,这个百分比越大,矩阵越小,这个百分比越小。如果有超过64个线程——也就是说,超过32个实验室每个实验室使用两个线程,或者超过16个实验室每个实验室使用四个线程——多线程就会适得其反。

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

图5。执行速度比适用于稀疏任务和不同层次的多线程。

出版于2007 - 91467v00


下载188bet金宝搏产品使用

查看相关功能的文章

查看相关行业的文章