我有一个安装了 Matlab 和 PCT 的 linux 集群(128 个使用 Torque Manager 的工作人员),我正在寻找一种并行计算的好方法。
我有一个时间序列轨迹数据 (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) ;
%%%%%%
奇怪的是,一次计算需要大约 30 秒(使用完整的集群),但在 for 循环中,由于某种奇怪的原因,速度会有所衰减,即使在第 100 次计算中,它也会变得非常慢。工作人员仅使用 10-20% 的 CPU。
如果您有任何建议,包括替代并行化建议,那将有很大帮助。