我有一个带有Matlab和Linux的Linux集群。 PCT安装(128名工人使用扭矩管理器),我正在寻找一种平行计算的好方法。
我有一个时间序列轨迹数据(100k x 2)矩阵。我执行最大似然(ML)计算,涉及矩阵对角化,取幂和&乘法,对于较小的矩阵运行速度很快。我将Trajectory数据分成小块并对许多工人进行计算(粗略并行化),这里没有任何问题,因为它工作正常(在~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) ;
%%%%%%
只有一次计算奇怪地需要〜30s(使用完整的簇)但在for循环内,由于一些奇怪的原因,存在速度和阻尼的阻尼。即使在第100次计算中,它也变得非常慢。工人只使用10-20%的CPU。
如果您有任何建议,包括其他并行化建议,那将是非常有帮助的。
答案 0 :(得分:1)
如果我读得正确,每个参数集完全独立于所有其他参数集,并且您拥有的参数集多于工作人员。
简单的解决方案是使用批处理作业而不是parfor。
job_manager = findresource( ... look up the args that fit your cluster ... )
job = createJob(job_manager);
for i = 1:num_param_sets
t = createTask(job, @your_function, 0, {your params});
end
submit(job);
通过这种方式,您可以避免从内部函数的parfor中获得任何通信开销,并将matlabs保持独立。你甚至可以告诉它在任务之间自动重启工人(我认为),作为工作参数之一。
答案 1 :(得分:0)
numFragments
的价值是多少?如果这并不总是大于你的工人数量,那么你会看到事情变慢。
我建议您尝试将外部for
循环设为parfor
。通常最好在最外层应用并行性。