【问题标题】:Parfor on a cluster : failure to recognize a function集群上的 Parfor:无法识别功能
【发布时间】:2012-02-14 17:10:41
【问题描述】:

我尝试在集群的不同机器上运行一个简单的任务。 我的配置已经过验证(没关系)。当我运行代码时 在“本地”配置上,它可以工作。但是当我使用集群时 配置,我收到以下错误:

使用 parallel_function 时出错(第 598 行) 'double' 类型的输入参数的未定义函数 'lafunc'。 错误堆栈:(无远程错误堆栈) petittest 中的错误(第 6 行)--»(petittest 是我的程序的名称) parfor it=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

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

非常感谢,每一条信息都对我有用!

【问题讨论】:

  • 您的集群大致是如何安排的?您是否在头节点上运行此代码?如果您放置内置函数而不是 lafunc,parfor 是否有效?
  • @IanHincks 是的,我们正在集群的头节点上运行程序。 parfor 确实可以使用内置函数,所以我认为这与其他工作人员看不到位于主节点上的手工制作函数这一事实有关。附言我发现使用 dfeval 的“FileDependencies”选项可以做类似的事情,但我想知道是否可以用 parfor 来做。非常感谢!
  • 我猜你的节点不共享一个公共文件系统,所以在他们的路径中没有函数 lafunc 。因此,您需要以某种方式将该函数放到每个节点的文件系统上,或者将函数声明为内联(parfor 循环上方的lafunc=@(x) x*x;)。或者将 parfor 循环放在函数内部,并将 lafunc 作为子函数。这些是我现在能想到的所有选项。
  • @IanHincks :最后在另一个答案中给出的建议奏效了!感谢您的帮助!

标签: matlab parallel-processing cluster-computing


【解决方案1】:

确保您的 MATLAB 脚本在同一工作目录中运行的所有工作程序节点上运行,并且包含您需要的函数的其他目录包含在路径中。所以你可以在你的脚本中专门设置工作目录和路径:

matlabpool open
cd workdir
addpath funcdir
...

在您运行matlabpool open 后,它将在所有工作人员上运行所有与路径相关的命令。见here

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

【讨论】:

  • matlabpool 中的 'FileDependencies' 是成功的。非常感谢,它将帮助这里大学里的很多人!
  • 抱歉提醒您,但请不要忘记接受/点赞您认为有帮助的答案。
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2014-12-03
  • 2021-01-22
  • 2019-08-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多