Matlab Parfor循环不工作

Matlab Parfor循环不工作,matlab,parfor,Matlab,Parfor,我正在使用fminsearch将一个模型与多个数据集进行拟合,并尝试并行进行。我的代码一直运行到parfor循环的开始,但是parfor循环似乎要花很长时间才能开始!(parfor中的第一行未执行)。没有错误,matlab只是保持“忙碌” 我在本地集群上运行,有4个内核,从matlabpool 4开始,它似乎启动得很好。我在Ubuntu 14.04.3上运行MatlabR2014B 64位,8核i7-3770K@3.50GHz,24GiB内存(当然大部分都没有使用) 编辑 下面是重现问题的代码

我正在使用
fminsearch
将一个模型与多个数据集进行拟合,并尝试并行进行。我的代码一直运行到
parfor
循环的开始,但是parfor循环似乎要花很长时间才能开始!(parfor中的第一行未执行)。没有错误,matlab只是保持“忙碌”

我在本地集群上运行,有4个内核,从
matlabpool 4
开始,它似乎启动得很好。我在Ubuntu 14.04.3上运行MatlabR2014B 64位,8核i7-3770K@3.50GHz,24GiB内存(当然大部分都没有使用)

编辑 下面是重现问题的代码

文件
matlab\u parfor\u test\u 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\u parfor\u test\u 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
I中,除了2个函数外,我放弃了所有函数!为什么丢弃的函数会导致速度减慢

我想也许matlab实际上并没有删除
f
中不需要的函数。因此,我尝试将
f=f(1:2)
替换为

f={f{1}, f{2}}; 
但这也无济于事

如果我将
parfor
替换为
for
,那么执行当然需要不到1ms的时间

有什么想法吗

问题的旧版本 模型函数在另一个文件中创建

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\u all
,我希望看到
model 1
data 1
data 2
model 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}

i、 只是当我使用另一个文件的函数句柄时…

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

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


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

我正在Windows上运行Matlab 2014a 64位,无法重现您的问题(工作正常)。我会尝试两件事:(1)把parfor放在外循环中。(2) 尝试在没有单元阵列的情况下实现它。(2) 更像是在黑暗中拍摄,但我过去在struct array和parfor方面遇到过问题,所以也许……嗯,你是对的。这一定与函数本身有关。如果我用一个非常简单的外部函数替换它,就没有问题了。我将进行试验。我的意思是,我用你的函数进行了试验(只需设置
L=0
),效果很好。我已经运行了一些新的试验!结果出乎意料。问题编辑。谢谢
 models={@sum,@sum}