在使用matlab处理大数据,编程需要注意两个问题:并行运算和释放内存。matlab也提供了并行计算的功能,甚至能用GPU加速。并行计算工具箱,叫做parallel computing toolbox.它的使用方法,可以从matlab的帮助获得。
Parallel Computing Toolbox(并行计算工具箱)中加入了并行循环parfor-loops,对于每一步可以独立于其他步的循环,计算效率可以有较大幅度的提高。以前简单的for循环for-loop是顺序的(sequentially)执行每一步循环体(statement),parfor-loop是通过将各个循环体分配到不同的节点上进行并行计算。所以parfor的要求是循环体之间相互独立,结果各不影响,Matlab的编辑器会自动帮你检查循环体的结果是否影响。
当你初始化一个matlab进程时,这个进程被称为Matlab Client,它起着和用户交互和调度的作用。在并行计算工具箱中,通过matlabpool可以打开多个matlab进程,这些进程被称为Matlab Worker。并行循环parfor-loop的各个循环就是随机的分配到这些Matlab Worker上进行同时的计算。最后再返回给Matlab Client. 在一个多核桌面上可以本地同时运行四个 worker ,如果与 MATLAB Distributed Computing Server 集成,就可以使用集群中任意数量的机器作为worker了。
parfor就是paralle+for,也就是并行的for循环,怎么个并行法?简单理解就是,matlab会弄出几个虚拟的小pc,比如一个算i=1:50部分循环,一个算i=51:90部分循环,再来一个算i=91:100部分循环,当然数字是瞎编的,这主要想说matlab将一个大循环分成小块,然后这些小块并行计算,最后再合在一起。这样有一个问题,因为普通的循环是从i=1算到i=100,一个接一个算,如果下一次循环要依赖上一次循环怎么办?如果出现这种情况,那就不能用matlab的parfor了。用parfor的前提条件就是,循环的每次迭代独立,不相互依赖。
parfor关键字的使用
(1). 由于for关键字引导的循环通常为串行运行,如果改为parfor则可以由多个worker以并行方式执行。
(2). parfor可以将n次循环分解为独立不相关的m部分,然后将各部分分别交给一个worker执行。
(3). 循环执行的结果应该与n次循环执行的顺序无关。
parfor中的变量类型
(1). 简约变量
一般parfor中各次循环对应的运算应该相互独立,但简约操作可以在多次循环内同时对一个变量操作。这种变量称为简约变量。例如下方代码中a就是简约变量。
a = 0;
for i = 1:1000
a = a+i;
end
简约操作包括+ - * .* & | [,] [;] {,} {;} min max union intersect。
同一个parfor循环对简约变量的操作必须一致,即必须是同一种简约操作符。而且与操作符的相对位置也必须一致。
简约变量赋值表达式应该满足结合律和交换律。* [] {}底层有特殊处理保证结果的正确性。
(2). 切片变量
parfor中可能需要读取或写入parfor之外的矩阵,读取写入位置与循环变量相关。这样就需要向worker传输大量的数据。
矩阵如果被Matlab识别为切片变量,则数据可以分段传输到各worker,提高传输效率。
切片变量矩阵的大小是不可在parfor中改变的,且为了保证Matlab识别正确,每次循环中只能读取由同一个索引值索引的切片,如a[i] a[i+1]同时出现则a不被识别为切片变量。
(3). 临时变量
作用域局限于parfor内,parfor结束后不存在。不影响parfor之前声明的同名变量。
(4). 循环变量
如上例中的i,表示当前循环的id。
(5). 广播变量
在parfor之前赋值,在parfor内只进行读取操作。
(6). 各种变量区分的例子
下例中,parfor中的tmp是临时变量,parfor结束后tmp的值依然是5,不受临时变量的影响。
broadcast是广播变量,每次循环中的值不变。
redued是简约变量,Matlab对其的值将分段由各worker计算后送回主进程处理。
sliced为切片变量,数据传输有优化提升。
i为循环变量
tm