Matlab 并行
初学,肯定有理解不够的地方。看官方文件更靠谱。
1. 检查是否有并行附加功能
如果没有,可以"主页–>附加功能–>获取附加功能",下载一下就好了。
2. 创建和删除并行
2.1 创建默认的并行池
parpool
% 这样就可以了,或者
parpool(num)
% num 为 workers 的个数
2.2 在本地创建
% 两种环境
parpool('process')
parpool('local')
%Start a parallel pool of process workers. 这两个是一样的,process based 是默认环境。
parpool('thread') %Start a parallel pool of thread workers.
怎么选择这两种环境? 官方文件给了下面的的流程图。
process based:支持完整的并行语言;版本兼容;更稳健
thread based:相比较,内存少,速度快
2.3 在集群创建
c = parcluster % 创造一个默认配置的集群
parpool(c)
2.4 删除
p = parpool('local);
delete(p) %删除
另外,如果有并行池在运行,Matlab 左下角会有
否则,状态是
3. Parallel pool 包含的一些函数
3.1 parfor
跟 for 循环用法相似。有很多循环,或者一个循环需要很长时间就可以用 parfor 了。
parfor loopVar = initVal:endVal
statements;
end
【Tips:】
a.)因为是分块运算,所以 parfor 中的循环要独立。(不能有类似‘ num=num+1;’ 这种了)
b.)需要所有循环结束才能得到结果。
c.) 进度条 :并行的缺点是没法用 ‘withbar’ 写进度条。但是 Matlab 有第三方工具,直接搜 “Progress monitor (progress bar) that works with parfor”。
3.2 parfeval
不用等循环跑完就能得到已经完成的项目的结果
F = parfeval(pool,fcn,numout,X1,...,Xm) % 'pool' is optional
fcn: 是要运行的 function;
numout: function 运行完后输出的结果数量。可以是向量 [ y 1 , y 2 , . . . , y n ] [y_1,y_2,...,y_n ] [y1,y2,...,yn],这属于输出结果数量为1;
X1,…,Xm: 是 function 运行的输入变量;
F: 是一个未来变量,将 function 还没运行结束的对象赋给 F。
a) 在 运行中, 可以通过 F 得到每个并行状态。
p = parpool(2);
for n = 1:5
if n == 3
f(n) = parfeval(@pause,0,1);
else
f(n) = parfeval(@pause,0,Inf);
end
end
{f.State}
% ans = 1×5 cell
% {'running'} {'running'} {'queued'} {'queued'} {'queued'}
设定了 2 个 workers,因此有三个循环在排队等待。
b) 运行结束,获得运行结果。
用 fetchOutputs 函数得到输出值。
f = parfeval(@magic,1,10);
value = fetchOutputs(f);
如果在 for 循环里,可以提交多个未来请求,得到向量 f 。 并用 fetchNext 提取结果。
f(1:10) = parallel.FevalFuture; % 预先分配空间
for idx = 1:10
f(idx) = parfeval(@magic,1,idx);
end
% 提取结果
magicResults = cell(1,10);
for idx = 1:10
[completedIdx,value] = fetchNext(f);
magicResults{completedIdx} = value;
fprintf('Got result with index: %d.\n', completedIdx);
end
completedIdx 代表原来循环计算的压入 f 的索引号。parfeval 计算输出的结果并不按照顺序,也就是 idx 为 1 的结果并不一定比 idx 为 2 的结果先出来,是根据计算速度输出的。