Matlab Parfor循环不起作用

时间:2015-11-22 03:22:50

标签: matlab parfor

我正在使用fminsearch将模型拟合到几个数据集,我正在尝试并行执行它们。我的代码一直运行到parfor循环的开头,但 parfor循环似乎需要永远才能启动! (parfor中的第一行未执行)。没有错误,matlab只是“忙”。

我正在使用4个核心的本地群集上运行,从matlabpool 4开始,似乎启动正常。我在Ubuntu 14.04.3上运行Matlab R2014b 64bit,8核i7-3770K @ 3.50GHz,24GiB RAM(当然大部分未使用)。

修改

以下是重现问题的代码!

档案matlab_parfor_test_2

function f=matlab_parfor_test_2
f={}; 
for i=1:400
  a=@(p)i*p;             % make some functions depending on i
  b=@(p)a(p)+0;          % a function depending on this
  f=[f { @(p)b(p) }];    % create a list of i functions using this
end

档案matlab_parfor_test_1

function matlab_parfor_test_1
f=matlab_parfor_test_2(); % create the functions
f=f(1:2);       % discard all but two functions
for i=1:2       % for each function                ('A')
  parfor j=1    % dummy parfor 
    tmp=f{i}; % just read a function from the cell ('B')
  end
end

在我的机器上从“A”到第一个“B”(即“输入”parfor所花费的时间)所需的时间是

returning 400 functions: 20 sec
          500 functions: 32 sec
          600 functions: 45 sec
          700 functions: 64 sec

这很奇怪,因为在test_1我丢弃了其中的所有功能!为什么丢弃的功能会导致减速?

我想也许matlab实际上并没有删除f中不需要的功能。所以我尝试用{/ 1>替换f=f(1:2)

f={f{1}, f{2}}; 

但这也没有帮助。

如果我将parfor替换为for,那么当然执行时间不到1毫秒。

任何想法??

问题的旧版本

function fit_all
  models = createModelFunctions();  % creates cell of function handles
  data   = { [1 2 3], [1 2 3] };    % create 2 data sets
  for i = 1:length(models)
    fprintf('model %g\n',i);
    parfor j = 1:length(data)
      fprintf('data %g\n',j);
      tmp = models{i};  % if I comment this line out, it runs fine!
      % p(j) = fminsearch(@(p)models{j}(p,data{j}), [0 0]);
    end
  end

模型函数在另一个文件中创建,

function models = createModelFunctions()
  models{1} = @(p,d) likelihoodfun(0,0,p,d);
  models{2} = @(p,d) likelihoodfun(1,0,p,d); 

function L = likelihoodfun(a,b,p,d)
  L = some maths here;

正在运行fit_all,我希望看到model 1data 1data 2model 2等列表。我得到的输出是

model 1

然后事情就此停止:没有提示,matlab说“忙”,UI和操作系统像往常一样响应。系统监视器仅显示1个核心处于活动状它永远不会进入parfor。 如果我此时按ctrl+C,延迟3分钟后我就会

Operation terminated by user during parallel.internal.pool.serialize (line 21)
In distcomp.remoteparfor (line 69)
                serializedInitData = parallel.internal.pool.serialize(varargin);
In parallel_function>iMakeRemoteParfor (line 1060)
P = distcomp.remoteparfor(pool, W, @make_channel, parfor_C);
In parallel_function (line 444)
        [P, W] = iMakeRemoteParfor(pool, W, parfor_C);

如果我注释掉指示的行,它就可以了 - 所以问题似乎是当我访问模型函数时......同样,如果我将模型更改为

,它也能正常工作
 models={@sum,@sum}

即。就在我从另一个文件中使用函数句柄的时候...

1 个答案:

答案 0 :(得分:0)

当我在我的机器上运行你的代码时它运行正常。在我的Windows和Linux上都有。但是,第一次运行总是花费一些时间,因为你必须打开一个并行池,这是你所指的?如果是这样,这是正常的和预期的行为。

仅供参考,您应该使用parpool而不是matlabpool。也许延迟matlabpool代码在创建池时遇到问题?另外,确保每次都没有关闭并行池。

如果这些都不起作用,请尝试其他人计算机上的代码,看看是否可以重新创建问题。