Matlab的并行计算

系列:编程和算法效率
查看该系列所有文章

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., ©zhiqiang, 2010.11.4。请参考右边的相关文章列表。


  1. 不能这么简单的说:

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

    SMT的主要原因是CPU core 访问memory的速度远远慢于访问寄存器的速度。多线程的原理是一个线程在等待访问memory的时候其他线程可以继续运行,不用等待memory返回的结果。
    基于同样的原因,SMP比SMT的处理速度优势并不是表面上那么大。
    至于用户体验,恰恰相反,最早的SMT是用在服务器的。

  2. 来了个高手 :-D 我其实不太了解这些过于底层的东西。

    之前我理解的多线程技术主要是为了在多个进程之间调度,不要让一个线程独占CPU,否则其它线程可能要等很久,这也是我说的用户体验。这样用在服务器上也很正常,比如web服务器,肯定要在多个用户之间平均分配CPU,否则有个用户占用全部资源岂不是把别人的请求都锁死了。

    这样没考虑到你说的在等待访问memory的时候其他线程可以继续运行的多线程优势。不过我还是没想通比如使用多线程(1个CPU)可以加快矩阵乘法吗?

  3. 关于并行计算,我需要大量的随机数参与运算。。重复计算若干次后,发现随机数都变的固定。。因此我的计算结果也变得固定。挺苦恼的。。parfor里面rand函数变得不能用了么?盼回复。。谢谢

  4. 没有。并行计算我也很少涉及,尝试过,结果做出来的东西并行后比不并行还慢。。。

  5. 我来挖个坟,cpu对不同指令的处理速度是不一样的,比如算加法可能很快,但是从memory提取数据到寄存器可能就要慢好多。后来cpu采用了一种流水线技术,前一条指令没结束就可以继续执行下一条指令,这样可以充分利用cpu内不同模块并行工作。但是如果前一条指令是提取memory到寄存器,下一条指令是使用这个寄存器运算,那结果就会错误。所以这个时候会在提取memory那条指令后面插入若干空指令,专门为了等待提取memory结束(因为一般流水线下一条指令占的周期是固定的)。
    再后来出现了一种超线程技术,核心思想就是为了减少流水线中插入空指令的数目,把一个cpu模拟成两个,交替执行。对于支持超线程的cpu,单个cpu使用双线程运算会比不开超线程时单线程运算还要快。
    我的理解是大概这样,我也不是搞硬件的,具体有没有错误还要求证一下。。。

  • 评论由多说提供支持。该系统支持使用微薄、人人网和QQ的账户登陆,由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论无法修改。如需修改,请删除原评论重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。
Loading...
Loading...
Loading...