Matlab并行编程

本文讲的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文档

parfor

Decide When to Use parfor



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文档:

Run Single Programs on Multiple Data Sets

spmd

Composite


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页