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
- 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)
- Exponential: EXP(x), POW2(x), SQRT(x)
- 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
- Trigonometric: HYPOT(x,y), TAND(x)
- Complex: ABS(x)
- Rounding and remainder: UNWRAP(x), CEIL(x), FIX(x), FLOOR(x), MOD(x,N), ROUND(x)
- 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)
- Operators: X*Y (Matrix Multiply), X^N (Matrix Power)
- Reduction Operations : MAX and MIN (Three Input), PROD, SUM
- Matrix Analysis: DET(X), RCOND(X), HESS(X), EXPM(X)
- Linear Equations: INV(X), LSCOV(X,x), LINSOLVE(X,Y), A\b (backslash)
- Matrix Factorizations: LU(X), QR(X) for sparse matrix inputs
- Other Operations: FFT and IFFT of multiple columns of data, FFTN, IFFTN, SORT, BSXFUN, GAMMA, GAMMALN, ERF,ERFC,ERFCX,ERFINV,ERFCINV, FILTER
- FFT, FFT2, FFTN, IFFT, IFFT2, IFFTN, PROD, SUM, MAX, MIN ( Functions that have been multithreaded in MATLAB 7.8 (R2009a))
- 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.