Matlab中的并行运算经常使用的有 parfor-loop代替for-loop加速计算,这里parfor就是parallel的意思。
client把任务分配给多个workers,在一个循环中同时运行,等全部workers运行完返回结果,而后对结果进行整合。
一个迭代就是指执行一次循环体。每个worker独立地按照必定的次序迭代。html
官方原图:
canvas
每个迭代是独立的,就是说上一个循环的结果对下一个循环的结果没有影响。下面给出的例子就不行,在计算 时要用到上一次迭代的结果 .函数
tic
ntasks = 200;
A = 500;
a = zeros(ntasks);
for i = 1:ntasks
a(m) = max(abs(eig(rand(A))));
if i > 2
b(i) = a(i)+a(i-1);
end
end
toc
改为parfor时出错oop
tic
ntasks = 200;
A = 500;
a = zeros(ntasks);
for i = 1:ntasks
a(i) = max(abs(eig(rand(A))));
if i > 2
b(i) = a(i)+a(i-1);
end
end
toc
这里介绍parfor这个函数的参数ui
parfor loopVar = initVal:endVal; statements; end
parfor (loopVar = initVal:endVal,M); statements; end
这里M指定多少个worker,通常系统默认把能够使用的都用上。spa
loopVar,initVal,endVal与for循环同样的。
endVal 能够理解为把整个任务分为几个部分去运行,endVal 能够大于电脑的核数或者说worker。
因此这个函数并无说明是怎么拆分数据的。
官方的说法:Loop iterations are executed in parallel in a nondeterministic order.
能够理解为随机拆分执行吗?code
tic
n = 200;
A = 500;
a = zeros(n);
for i = 1:n
a(i) = max(abs(eig(rand(A))));
end
toc
tic
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
a(i) = max(abs(eig(rand(A))));
end
toc
查看给每个worker分配的数据:server
tic
ticBytes(gcp);
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
a(i) = max(abs(eig(rand(A))));
end
tocBytes(gcp)
toc
参考:
https://ww2.mathworks.cn/help/distcomp/interactively-run-a-loop-in-parallel.html#responsive_offcanvas
https://ww2.mathworks.cn/help/distcomp/parfor.html
https://ww2.mathworks.cn/help/distcomp/interactively-run-a-loop-in-parallel.html#responsive_offcanvasxml