2012-02-14 93 views
2

我尝试在群集的不同机器上运行简单任务。 我的配置已经过验证(没关系)。当我在'本地'配置上运行代码 时,它可以工作。但是,当我使用群集 配置,我得到以下错误:群集上的Parfor:无法识别功能

错误使用parallel_function(线598) 未定义功能“lafunc”类型“双”的输入参数。 错误堆栈:(无远程错误堆栈) 错误petittest(6号线) - »(petittest是我的程序的名字) PARFOR吧= 1:200

我尝试修改使用的代码 “dfeval”而不是parfor循环, 但我得到了同样的结果(无法识别函数lafunc)。

如何让群集中的其他工作人员识别我手动定义的函数 lafunc?

的代码如下:

%%%%%%%%%%%%% 
laconfig='/home/matlab/fred/LACED_DC1.mat'; 
setmcruserdata('ParallelConfigurationFile',laconfig); 

matlabpool open 

parfor it=1:200 

yo=lafunc(it); 
disp(yo) 

end 

matlabpool close 

%%%%%%%%%%% 

其中lafunc功能

%%%%%%%%%%%%%% 

function [y]=lafunc(x) 
y=x*x; 
end 

%%%%%%%%%%%%%%%%%%%%%% 

非常感谢,每一块信息是对我来讲很有用!

+0

大致上,您的集群如何安排?你在头节点上运行这个代码吗?如果您将内置函数替换为lafunc,parfor是否可以工作? – 2012-02-14 17:21:31

+0

@IanHincks是的,我们正在集群头节点上运行程序。 parfor可以使用内置函数,所以我相信这与其他工作人员看不到位于主节点上的手工功能有关。 P.S.我发现使用dfeval的'FileDependencies'选项可以做类似的事情,但我想知道是否可以使用parfor来完成。非常感谢! – 2012-02-14 18:24:04

+1

我猜你的节点不共享一个通用的文件系统,所以在他们的路径中没有函数lafunc。因此不知何故,您需要将该函数放到每个节点的文件系统上,或者在parfor循环之上声明函数内联('lafunc = @(x)x * x;')。或者将parfor循环放入函数中,并将lafunc作为子函数。这些都是我现在可以想到的所有选项。 – 2012-02-14 19:09:09

回答

7

确保您的MATLAB脚本在所有工作节点上运行在相同的工作目录中,并且其他具有所需功能的目录都包含在路径中。运行matlabpool open后,它可以运行在所有工人的相关命令所有的路径

matlabpool open 
cd workdir 
addpath funcdir 
... 

:所以,你可以专门设置在脚本的工作目录和路径。请参阅here

您也可以使用'FileDependencies'参数打开matlabpool,以便所有工作人员知道在哪里查找所需的文件。请参阅MATLABPOOL的文档。

+0

matlabpool中的'FileDependencies'成功。 非常感谢,这将有助于很多人在这里的大学! – 2012-02-17 16:56:46

+0

很抱歉提醒您,但请不要忘记接受/ upvote您发现有帮助的答案。 – yuk 2012-03-21 19:52:52