在matlab中并行计算时间序列数据的最佳方法

时间:2012-09-17 10:44:49

标签: matlab parallel-processing distributed-computing mathematical-optimization

我有一个带有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。

如果您有任何建议,包括其他并行化建议,那将是非常有帮助的。

2 个答案:

答案 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。通常最好在最外层应用并行性。