1

我有一个安装了 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。

如果您有任何建议,包括替代并行化建议,那将有很大帮助。

4

2 回答 2

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 带来的任何通信开销,并且您可以将 matlab 分开。您甚至可以告诉它在任务之间自动重启工作人员(我认为),作为工作参数之一。

于 2013-03-27T18:46:01.480 回答
0

的价值是numFragments多少?如果这并不总是大于您的工人数量,那么您会看到事情变慢了。

我建议尝试使您的外for循环成为parfor. 通常最好在最外层应用并行性。

于 2012-09-17T12:03:18.393 回答