gpt4 book ai didi

Matlab Parfor 循环不工作

转载 作者:太空宇宙 更新时间:2023-11-03 20:08:19 27 4
gpt4 key购买 nike

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

我在具有 4 个内核的本地集群上运行,从 matlabpool 4 开始,它似乎启动正常。我在 Ubuntu 14.04.3 上运行 Matlab R2014b 64 位,八核 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 中,除了其中的 2 个函数,我放弃了所有函数!为什么丢弃的函数会导致速度变慢?

我想也许 matlab 实际上并没有删除 f 中不需要的函数。所以我尝试将 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 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}

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

最佳答案

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

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

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

关于Matlab Parfor 循环不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com