Matlabで並列計算ツールボックスを使用したいのですが、これについての知識を得るために多くのことを検索しました。parfor
とfor
ループの比較に関する一般的なクエリを見ました。parfor
matlabpool/parpool
ここで最終的なコードをまとめましたが、それでも遅すぎて、その理由がわかりませんでした。Mathsworkがこの問題を十分に文書化していないのは奇妙です。特にPCTを開始するための提案、parfor
および条件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