本文讲的Matlab并行编程包括并行for循环和数据并行(同一个程序运行在不同的数据上),分别对应于parfor、spmd方法
1. 并行方法
parpool %开启并行池(parallel pool)
%parallel program
delete(gcp('nocreate')) % 关闭并行池
上面就是Matlab并行编程的形式。你的计算机有几个核,parpool就会开启几个worker
当然,你也可以设定worker的数目,如这样,开启2个worker
parpool('local',2)
至于中间的并行程序就要由parfor和spmd完成。
PS:Matlab之前的并行方法 matlabpool local 2 已经过时,现在新版的Matlab要用parpool
2. parfor
parfor(parallel for-loop)用于将for循环并行处理,当你的for循环每次迭代计算量很大,并且每次迭代都是独立的话,就可以用parpool来加速,下面是一个例子:
普通for循环
tic
n = 200;
A = 500;
a = zeros(n);
for i = 1:n
a(i) = max(abs(eig(rand(A))));
end
toc运行时间为:时间已过 25.428548 秒。
若是改用parfor
tic
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
a(i) = max(abs(eig(rand(A))));
end
toc运行时间为:时间已过 8.801395 秒。
注意,当for循环中每次迭代不独立,即某次迭代需要其它迭代的结果,以及嵌套的for循环都是不能改为parfor的。
更多内容见Matlab文档
3. spmd
spmd(single program multiple data)使多个worker运行同一段代码(single program),但是不同的worker处理不同的数据(multiple data),所以spmd适用于处理很大的数据。常见的情形如:
Programs that take a long time to execute — spmd lets several workers compute solutions simultaneously.
Programs operating on large data sets — spmd lets the data be distributed to multiple workers. 一个例子:在3个worker上分别创建一个随机矩阵
spmd (3)
R = rand(4,4);
end
返回的R是一个Composite对象,大小为1*3,R(1)即worker 1上创建的矩阵,R(2)即worker 2上创建的矩阵,依次类推。
其实每个worker都有一个下标labindex,范围从1到n(n为worker数目),通过labindex可以指定特定的worker。(这里插一句,下标为什么是labindex,而不是workerindex呢,因为Matlab运行并行程序时,每个worker叫做lab),又一个例子:
spmd (3)
if labindex==1
R = rand(9,9);
else
R = rand(4,4);
end
end
此外,我们可以
通过labindex指定不同的worker处理不同的数据:
spmd (3)
labdata = load(['datafile_' num2str(labindex) '.mat'])
result = MyFunction(labdata)
end终于到了重点,这种形式应该是我们经常要用到的,每个worker load不同的data,运行同一段代码。稍微注意的一点是,这里的labdata是一个struct,不是mat矩阵,所以要用字段名称引用。当时在这纠结了好久。。。同样的,返回的result是一个
Composite对象,result(i)为第i个worker的返回值。
更多详细信息请看Matlab文档: