首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab Parfor循环不工作

Matlab Parfor循环不工作
EN

Stack Overflow用户
提问于 2015-11-22 03:22:49
回答 2查看 1.2K关注 0票数 4

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

我运行在带有4个核心的本地集群上,从matlabpool 4开始,它似乎启动得很好。我在Ubuntu14.04.3上运行Matlab R2014b 64位,8核i7-3770K @ 3.50GHz,24 course(当然大部分是未使用的)。

编辑

这里是再现问题的代码!

文件matlab_parfor_test_2

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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的时间是

代码语言:javascript
运行
复制
returning 400 functions: 20 sec
          500 functions: 32 sec
          600 functions: 45 sec
          700 functions: 64 sec

这很奇怪,因为在test_1中,除了两个函数之外,我放弃了所有这些函数!为什么被丢弃的函数会导致减速?

我想,也许matlab实际上并没有删除f中不需要的函数。所以我试着用

代码语言:javascript
运行
复制
f={f{1}, f{2}}; 

但这也无济于事。

如果我用parfor替换for,那么当然需要1ms以下的时间才能执行。

有什么主意吗?

旧版本的问题

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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等列表。我得到的输出是

代码语言:javascript
运行
复制
model 1

然后事情就停止了:没有提示,matlab说“忙”,UI和OS像往常一样响应。系统监视器显示只有一个核心处于活动状态。它从来没有进入parfor。如果我在此时按ctrl+C键,经过3分钟的延迟,我得到

代码语言:javascript
运行
复制
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);

如果我注释掉所显示的行,它就能工作--所以问题似乎是当我访问模型函数时.类似地,如果我将模型更改为

代码语言:javascript
运行
复制
 models={@sum,@sum}

也就是说,当我使用另一个文件的函数句柄时.

EN

回答 2

Stack Overflow用户

发布于 2016-01-21 20:53:57

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

FYI,你应该使用共享池而不是匹配池。也许拉格西匹配池的代码在创建池时有问题?另外,确保每次都不会关闭您的并行池。

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

票数 0
EN

Stack Overflow用户

发布于 2022-09-27 09:37:39

我以前也遇到过同样的情况。请注意,在使用并行计算时,我们的用户通常无法看到每个工作人员的程序的实时操作。也就是说,只要您的代码尚未完成,当您暂停脚本时,您将始终看到指向parfor循环的第一行的指针,这意味着正在执行参数传递和计算。请减少循环周期的数量,您可能会在短时间内看到预期的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33851270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档