matlabparfor不能⽤,MatlabParfor循环不起作⽤
我正在使⽤fminsearch将模型拟合到⼏个数据集,我正在尝试并⾏执⾏它们.我的代码运⾏到parfor循环的开始,但parfor循环似乎需要永远开始! (parfor中的第⼀⾏未执⾏).没有错误,matlab只是“忙”.
我正在运⾏4核⼼的本地集,从matlabpool 4开始,看起来很好.我在Ubuntu 14.04.3上运⾏Matlab R2014b 64bit,8核i7-3770K @ 3.50GHz,24GiB RAM(当然⼤部分未使⽤).
编辑
fprintf作用
这是重现问题的代码!
⽂件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中不需要的功能.所以我尝试⽤f替换f = f(1:2)
f={f{1}, f{2}};
但这也没有帮助.
如果我⽤for替换parfor,那么当然执⾏时间不到1ms.
有任何想法吗??
旧版本的问题
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,我希望看到模型1,数据1,数据2,模型2等的列表.我得到的输出是
model 1
事情就此停⽌:没有提⽰,matlab说“忙”,UI和操作系统像往常⼀样响应.系统监视器仅显⽰1个核⼼处于活动状它永远不会成为parfor.如果我此时按ctrl C,我会得到3分钟的延迟
Operation terminated by user during parallel.internal.pool.serialize (line 21)
parfor (line 69)
serializedInitData = parallel.internal.pool.serialize(varargin);
In parallel_function>iMakeRemoteParfor (line 1060)
P = parfor(pool, W, @make_channel, parfor_C);
In parallel_function (line 444)
[P, W] = iMakeRemoteParfor(pool, W, parfor_C);
如果我注释掉指⽰的⾏,它就可以了 – 所以问题似乎是当我访问模型函数时…同样,如果我将模型更改为
models={@sum,@sum}
也就是说,当我使⽤其他⽂件的函数句柄时……

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。