我想在 Matlab 中使用并行计算工具箱,我搜索了很多以获得相关知识,我看到了关于parfor
和for
循环比较的常见查询,parfor
很慢,但是,我得到了开始使用/不使用matlabpool/parpool
的常见原因。
在这里我总结了最终的代码,但它仍然太慢,我无法知道这个的原因。我很奇怪, Mathswork 已经很好地记录了这个问题。
通过启动和停止parfor
条件来启动 PCT 尤其是Batch Processing
和pool
的任何建议,以及有多少关于操作的工作人员
我的代码:
matlabpool open
tic ; parfor i=1:4, disp(['myid is ' num2str(labindex) '; i = ' num2str(i)]),end
toc;
tic ; for i=1:4, disp(['myid is ' num2str(labindex) '; i = ' num2str(i)]),end
toc;
matlabpool close
Starting matlabpool using the 'local' profile ... connected to 2 workers.
myid is 1; i = 2
myid is 1; i = 1
myid is 1; i = 3
myid is 1; i = 4
Elapsed time is 2.974505 seconds.
myid is 1; i = 1
myid is 1; i = 2
myid is 1; i = 3
myid is 1; i = 4
Elapsed time is 0.010254 seconds.
Sending a stop signal to all the workers ... stopped.
编辑1:
我也看到了嵌套循环的线性化,我检查了但是它与普通for
循环相比也很慢
tic;
for a=1:4
for b=1:5
f(a)=sum(a,b);
end
end
toc;
tic;
iterations=[5,4];
for ix=1:prod(iterations)
[b,a]=ind2sub(iterations,ix);
f(a)=sum(a,b);
end
toc;
Elapsed time is 0.013108 seconds.
Elapsed time is 0.017800 seconds.
编辑2:
我想要并行运行的代码。
parfor ii = 1:1000
p{ii,1}= [2 5 4; 5 4 6;]; %suppose very big matrix
pp{ii,1}=p{ii,1}*2;
for jj = 1:100
p1{jj,1} = p{ii}* pp{ii};
p2{jj} = p{ii}* pp{ii}*p1{jj};
p3{jj} = p{ii}* pp{ii}*p1{jj}*p2{ii};
end
Data(ii).data=([pp(ii,:),p1{:,1},p2,p3;])' ; %#'
Data(ii).label=cellfun(@(x) ['label' num2str(ii)] , num2cell(1:length(pp)+length(p1)+length(p2)+length(p3))', 'UniformOutput', false);
end
答案 0 :(得分:1)
parfor
的时间有关...... 3秒非常慢。您应该尝试多次运行此代码以查看第一次是否特别长(与常规for
循环相比,我希望看到.1或.05秒或更短)。
但是,我主要担心的是你真的需要在循环中做大量工作才能从parfor
获得任何加速。考虑做一个非常大的fft(...)
或矩阵分解,每个分解大约需要0.5-3.0秒。然后你应该开始看到一些改进。对于2名工人来说,1.5-1.75的改进会很好。
您也可以考虑在disp
内限制parfor
的使用,以避免可能对控制台产生竞争。
最后,在做基准测试时,确保在工作时不要运行很多其他程序。我注意到一些网页可能会因为需要相当多的CPU而大大降低基准性能。但总的来说,这些时间真的很慢 - 但尤其是parfor
。