如果没有,可以"主页–>附加功能–>获取附加功能",下载一下就好了。
parpool
% 这样就可以了,或者
parpool(num)
% num 为 workers 的个数
% 两种环境
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:相比较,内存少,速度快
c = parcluster % 创造一个默认配置的集群
parpool(c)
p = parpool('local);
delete(p) %删除
另外,如果有并行池在运行,Matlab 左下角会有
否则,状态是
跟 for 循环用法相似。有很多循环,或者一个循环需要很长时间就可以用 parfor 了。
parfor loopVar = initVal:endVal
statements;
end
【Tips:】
a.)因为是分块运算,所以 parfor 中的循环要独立。(不能有类似‘ num=num+1;’ 这种了)
b.)需要所有循环结束才能得到结果。
不用等循环跑完就能得到已经完成的项目的结果
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 的结果先出来,是根据计算速度输出的。