MatlabとPCTがインストールされたLinuxクラスター(Torque Managerで128人のワーカー)があり、計算を並列化するための良い方法を探しています。
時系列の軌道データ(100k x 2)マトリックスがあります。行列の対角化、べき乗、乗算を含む最尤(ML)計算を実行します。これは、小さい行列に対して高速に実行されます。軌道データを小さなチャンクに分割し、多くのワーカーで計算を実行し(粗い並列化)、正常に動作するため、ここでは問題はありません(30秒以内に完了します)
ただし、計算は、MLへの影響を変更およびテストするために必要ないくつかのパラメーターにも依存します。(パラメータスイープに似たもの)。
ループを使用してこれを実行しようとすると、計算が徐々に非常に遅くなり、何らかの理由で理解できなくなります。
%%%%%%% Pseudo- Code Example:
% a [100000x2], timeseries data
load trajectoryData
% p1,p2,p3,p4 are parameters
% but i want to do this over a multiple values fp3 & fp4 ;
paramsMat = [p1Vect; p2Vect;p3Vect ;p4Vect];
matlabpool start 128
[ML] = objfun([p1 p2 p3 p4],trajectoryData) % runs fast ~ <30s
%% NOTE: this runs progressively slow
for i = 1:length(paramsMat)
currentparams = paramsMat(i,:);
[ML] = objfun(currentparams,trajectoryData)
end
matlabpool close
objFunc関数は次のとおりです。
% objFunc.m
[ML] = objFunc(Params, trajectoryData)
% b = 2 always
[a b] = size(trajectoryData) ;
% split into fragments of 1000 points (or any other way)
fragsMat = reshape(trajectoryData,1000, a*2/1000) ;
% simple parallelization. do the calculation on small chunks
parfor ix = 1: numFragments
% do heavy calculations
costVal(ix) = costValFrag;
end
% just an example;
ML = sum(costVal) ;
%%%%%%
奇妙なことに、1回の計算で(クラスター全体を使用して)約30秒かかりますが、forループ内では、奇妙な理由で速度が減衰し、100回目の計算でも非常に遅くなります。ワーカーはCPUの10〜20%しか使用していません。
代替の並列化の提案を含む提案がある場合は、非常に役立ちます。