2012-02-14 11 views
2

クラスタの異なるマシンで簡単なタスクを実行しようとしています。 設定が有効になっています(問題ありません)。 「ローカル」設定でコード を実行すると、そのコードは機能します。しかし、クラスタ の設定を使用すると、次のエラーが発生します。クラスタ上のParfor:関数の認識に失敗しました

parallel_function(行598)を使用しているエラー 入力引数 'double'の未定義関数 'lafunc'。 エラー・スタック:(なしリモートエラー・スタック)petittestで エラー(ライン6) - »(petittestは私のプログラムの名前です) それは1 =のparfor:200

を私は "dfeval" を使用してコードを変更してみてくださいparforループの代わりに しかし、私は同じ種類の結果を得ました(関数lafuncを認識できません)。

手動で定義した関数 関数をクラスター内の他のワーカーに認識させるにはどうすればよいですか?

コードは以下の通りである。lafunc機能が

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

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

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

おかげでたくさんある

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

matlabpool open 

parfor it=1:200 

yo=lafunc(it); 
disp(yo) 

end 

matlabpool close 

%%%%%%%%%%% 

、情報のすべての部分が私には便利です!

+0

おおよそのクラスターはどのように整理されていますか?ヘッドノードでこのコードを実行していますか? lafuncの代わりに組み込み関数を置くと、parforは機能しますか? –

+0

@IanHincksはい、クラスタのヘッドノードでプログラムを実行しています。 parforは組み込み関数で動作するので、他の作業者がメインノードにある手作業の関数を見ないという事実に関連していると私は信じています。 S.私はdfevalで 'FileDependencies'オプションを使って同様のことをすることが可能であることを発見しましたが、parforでそれを行うことが可能かどうかを知りたいと思います。どうもありがとう! –

+1

私はあなたのノードが共通のファイルシステムを共有していないので、そのパスに関数lafuncがないと推測しています。ですから、何らかの形で各ノードのファイルシステムにその関数を渡すか、inline関数を宣言する必要があります(parforループの上に 'lafunc = @(x)x * x;')。あるいは、parforループを関数の中に置き、lafuncをサブ関数として持つことができます。それらは私が今考えることができるすべてのオプションです。 –

答えて

7

同じ作業ディレクトリで実行されているすべてのワーカーノード上のMATLABスクリプトと、必要な機能を持つ他のディレクトリがパスに含まれていることを確認してください。だから、特にスクリプト内の作業ディレクトリとパスを設定することができます:あなたはmatlabpool openを実行

matlabpool open 
cd workdir 
addpath funcdir 
... 

後は、すべての労働者のすべてのパス関連のコマンドを実行します。 hereを参照してください。

'FileDependencies'パラメータでmatlabpoolを開いて、すべてのワーカーが必要なファイルの場所を知るようにすることもできます。 MATLABPOOLのドキュメントを参照してください。

+0

matlabpoolの 'FileDependencies'は成功しました。 ありがとう、それはここに大学の多くの人々を助ける! –

+0

あなたに思い出させることはできますが、助けてくれた/ upvoteの回答を受け入れることを忘れないでください。 – yuk

関連する問題