概述
CoreNum=6; %设定机器CPU核心数量
parpool(CoreNum);
Starting parallel pool (parpool) using the 'local' profile ... connected to 6 workers.
测试:竟然快了接近20倍!!!
tic
parfor i=1:3, c(:,i) = eig(rand(1000)); end
toc
tic
for i=1:3, c(:,i) = eig(rand(1000)); end
toc
Starting parallel pool (parpool) using the 'local' profile ... connected to 6 workers.
时间已过 20.193056 秒。
时间已过 1.230642 秒。
parfor 是并行循环计算
多重循环的嵌套,只能在其中一层循环使用parfor并行计算,因为parfor就是让几个worker同时干活,比如一个循环中,i=1:30,那么一个worker做i=1:5,一个做i=6:10····不同的循环变量之间完全独立,所以当然可以一起干活,在里面在嵌套parfor,相当于把里面的工作还要分给6个人,很容易混乱不清,出现问题,如果再继续嵌套就更没法独立地界限清晰地并行工作了
但是一个parfor执行结束之后,后面地循环还可以再用parfor,即:
poolobj = gcp('nocreate');
if isempty(poolobj) % If no pool, create new one.
poolsize = 0;
CoreNum=6; %设定机器CPU核心数量
parpool(CoreNum);
else
poolsize = poolobj.NumWorkers;
disp('Already initialized'); %说明并行环境已经启动
end
parfor i=1:100
function1;
end
···
parfor i=1:100
function2;
end
通常将parfor放到最外层的循环, 也不是一定要放在最外面,如果里面那层运算量很大,外面那层基本没什么运算,放在里面也可以的,总之哪里运算量大并且可以不交叠地的分开,就在哪里用
parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代,但是当你的CPU的利用率如果已经达到了100%,此时你这种并行是没有意义的,速度不会加快的。另外这个博客上指出了Matlab的parfor的使用条件即:
大量的简单计算的循环。
大量或少量的复杂计算的循环
各个任务之间不会出现数据的依赖,比如说循环内部的变量之间不要存在数据传递等等。
应该是一个项目中只用一个parfor,一般是最外面那个,子函数里面的循环千万不要也写parfor哦,不然会报错,并行计算的原理是循环之间是没有任何重叠的,,没有数据传递和交叠。所以本质上是把parfor end之间的所有代码打包成了一个没有返回值的函数!!
最后
以上就是俊秀西装为你收集整理的matlab并行计算 parfor的全部内容,希望文章能够帮你解决matlab并行计算 parfor所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复