Matlab 的并行计算

作者: , 共 2929 字 , 共阅读 0

1、并行计算

以下对并行计算的个人理解受到较多质疑,删除之。

~~1、并行计算是指将计算任务分成几块,分别让多个 CPU 同时跑,这样运行时间就能缩短若干倍。在一个多核的电脑上,要想看计算是不是并行的,只需看 CPU 占用是不是 100%。如果两个 CPU ,串行的任务至多占用 50%的 CPU。~~

~~2、如果并行计算用到的 CPU 属于不同的服务器时,有另一个称呼——分布式计算。~~

~~3、要让多线程并行计算效率更高,电脑的 CPU 必须在物理上是多核的,单核 CPU 搞多线程,只不过在线程之间跳来跳去,不会算得更快(单核的多线程技术只要是让用户体验更好)。~~

~~4、如果任务可以分为独立的几块,将任务并行化和分布式化都是不难的。但如果任务块之间存在数据交换,那么将任务并行化需要很多干预,因为有些任务计算地快、有些计算慢,这样任务之间需要互相等待对方的数据。~~通信复杂性理论的起源之一就是从并行计算任务之间调度数据的优化。

2、Matlab 自动使用多核 CPU

根据Is it possible for one session of MATLAB to take advantage of multiple processors/cores?里的描述:

从 MATLAB 7.3 (R2006b)开始,不需要用户干涉, Matlab 的某些矩阵操作会自动使用多个 CPU ,主要是 Matlab 所采用的 BLAS (Basic Linear Algebra Subroutines)开始支持多线程。BLAS 里的操作包括矩阵乘法、求特征根等。

从 MATLAB 7.4 (R2007a)开始, Matlab 开始提供对某些操作的多线性支持,主要是 element-wise 的数值计算,比如 sin(A)、A.*log(A)。

3、什么函数和操作会自动使用多线程

根据文档Which MATLAB functions benefit from multithreaded computation?,在 Matlab 决定是否使用多线程计算时,主要基于以下考虑:

1、任务可以被分解为若干可同时计算的任务块,并且任务之间不需要进行通讯或者通讯量很小。

2、数据量较大。

3、任务不会被内存吞吐速度所限制。比如 eigs 函数就不会分解为多线程,因为它的计算更多受制于内存吞吐速度( via Why is EIGS not multithreaded in MATLAB 7.8 (R2009a)?)。

具体说来下列操作和函数将使用多线程(不完全)

Element Wise Functions and Expressions:

  • Functions that speed up for double arrays > 20k elements
    1. Trigonometric: ACOS(x), ACOSH(x), ASIN(x), ASINH(x), ATAN(x), ATAND(x), ATANH(x), COS(x), COSH(x), SIN(x), SINH(x), TAN(x), TANH(x)
    2. Exponential: EXP(x), POW2(x), SQRT(x)
    3. Operators: x.^y : For Example: 3*x.^3+2*x.^2+4*x +6, sqrt(tan(x).*sin(x).*3+8);
  • Functions that speed up for double arrays > 200k elements
    1. Trigonometric: HYPOT(x,y), TAND(x)
    2. Complex: ABS(x)
    3. Rounding and remainder: UNWRAP(x), CEIL(x), FIX(x), FLOOR(x), MOD(x,N), ROUND(x)
    4. Basic and array operations: LOGICAL(X), ISINF(X), ISNAN(X), INT8(X), INT16(X), INT32(X)

Linear Algebra Functions:

  • Functions that speed up for double arrays > 40k elements (200 square)
    1. Operators: X*Y (Matrix Multiply), X^N (Matrix Power)
    2. Reduction Operations : MAX and MIN (Three Input), PROD, SUM
    3. Matrix Analysis: DET(X), RCOND(X), HESS(X), EXPM(X)
    4. Linear Equations: INV(X), LSCOV(X,x), LINSOLVE(X,Y), A\b (backslash)
    5. Matrix Factorizations: LU(X), QR(X) for sparse matrix inputs
    6. Other Operations: FFT and IFFT of multiple columns of data, FFTN, IFFTN, SORT, BSXFUN, GAMMA, GAMMALN, ERF,ERFC,ERFCX,ERFINV,ERFCINV, FILTER
    7. FFT, FFT2, FFTN, IFFT, IFFT2, IFFTN, PROD, SUM, MAX, MIN ( Functions that have been multithreaded in MATLAB 7.8 (R2009a))
    8. SORT, BSXFUN, MLDIVIDE for sparse matrix input, QR for sparse matrix input,FILTER, GAMMA, GAMMALN, ERF, ERFC,ERFCX,ERFINV, ERFCINV (Functions that have been multi-threaded in MATLAB 7.9(R2009b))

4、编写并行程序

除了上面提到的内置函数和表达式的并行计算外,其余用户代码都是串行的,除非用户使用 Parallel Computing Toolbox (在 R2008a 之前也叫做 Distributed Computing Toolbox ,当时只支持分布式计算)。下面是一个简单的并行程序

Matlabpool 2
A = cell(1, 10);
parfor i = 1:10
    A{i} = eigs(rand(1000));
end
Matlabpool close

需要注意,除非循环内计算量较大,不要使用 parfor ,否则会得不偿失。

而且 parfor 有比较多的限制条件,并不是所有 parfor 里的 statement 都会并行计算,具体情况可 docs parfor。

Q. E. D.

类似文章:
编程 » Matlab, 并行计算
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错:
编程 » Matlab, 并行计算
parfor适用于
本文结论:不要过度担心 Matlab 的传值调用的效率问题。
编程 » Python, 并行计算
核心就是threading.Thread
相似度: 0.102
最近写了一些 Matlab 程序,想起以前想过的一个东西,记录一下。
编程 » C++, Python, 并行计算
我们知道, Python 程序有全局锁,任何时候都只有一个 Python 语句在执行。在 Python 中,这通过全局的 GIL 锁来控制。当 C++和 Python 混合编程,且使用多线程时,也必须考虑到 GIL 锁(单线程无需考虑)。
假设你有多个很耗时的任务,比如训练多个神经网络模型:
编程 » Matlab, 编译器
现在比较新的电脑基本上都是 64 位的 CPU , Matlab 也是 64 位的版本,但 64 位的 Matlab 没有自带编译器,需另行安装编译器。下面是方法之一:
上次大规模使用 Matlab 还是本科的时候,当时还是 5.3 版,现在重新尝试它,已经是 7.8 ( R2009a ),而且 R2010b 版都已经发售。而这些版本引入的一个新玩意儿便是面向对象化编程( object-oriented programming , OOP )。
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
最近用 Matlab 写了个东西,运行效率不如我意。用 Profiler 跟踪了一下,结果让我大吃一惊。其中三分之一的时间花费在 datestr 这个函数上,六分之一的时间花费在 save 和 load 数据上。这里先谈前一个问题,关于 save 和 load 的效率以后再谈。
资源 » 机械原理, GIF
来自Complex Stuff Explained in Simple Animations,原文处还有物品原图、文字和视频解释(视频都是 Youtube 上的,需翻墙)。