我想在Matlab中使用并行计算工具箱,我搜索了很多以了解这方面的知识,我看到了一个关于parfor
和for
循环比较的常见查询,这parfor
很慢,但是,我得到了用/不开始的常见原因matlabpool/parpool
。
到这里我总结了最后的代码,但是还是太慢了,不知道是什么原因。我很奇怪Mathswork没有很好地记录这个问题。关于特别是启动PCTparfor
以及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