2010-11-19 3 views
4

私は大規模なコンピュータクラスタ上でデータのさまざまな部分を分析するためにコードを実行しようとしています。bashでのmatlabバッチ並列化

私は2つのループを作成して、異なるノードにジョブを割り当て、ノードに含まれるCPUを割り当てました。私は 'chnJob()'と書いた解析関数は、解析する必要があるデータの部分を知るためにインデックスを取る必要があります(この場合、chnというシェル変数です)。

ループは、このようなものです:

for NODE in $NODES; do # Loop through nodes 
    for job_idx in {1..$PROCS_PER_NODE}; do # Loop through jobs per node (8 per node) 
     echo "this is the channel $chn" 
     ssh $NODE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob($chn); quit'" & 
     let chn++ 
     sleep 2 
    done 
done 

私はCHN変数が適切にインクリメントされていることを見ていても、MATLAB関数に渡されCHNの値が常にCHNの最後の値です。

これはおそらく、各ノードでmatlabを開くのに多くの時間がかかり、それまでにbashがループを終了したためです。したがって、各MATLABインスタンスに渡される値は最後の値だけです。

これを回避する方法はありますか?関数を呼び出すときにその変数の値を「焼く」ことができますか?

問題は全く異なりますか?

答えて

2

Bashは、中括弧の範囲式の変数を処理できません。彼らはリテラルでなければなりません:{1..10}。現在の方法のため、内部ループは、8回ではなく(またはPROCS_PER_NODEの値が何であれ)常に外部ループの反復ごとに1回実行されます。その結果、chnは、Original_chnからNODES * PROCS_PER_NODEになるべきときに、その初期値からそれに加えて、NODESになります。

代わりにC-スタイルforループを使用します。

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++)) 

を(それはあなたのオフずつ問題を与えていない場合)あなたはforjob_idxchnの両方をインクリメントすることができます:

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++)) 
3

私はそれが起こっているとは思わない。

cnt=0 
for a in 1 2; do 
    for b in 1 2; do 
    echo --- $cnt 
    ssh somehost "echo result: '$cnt'" & 
    let cnt++ 
    done 
done 

sshdを実行しているホストにsomehostを置き換えてください。リモートから実行されるecho result: '$cnt'から戻ってくる数字0〜3が表示されます。したがって、実行自体はOKです。

私が示唆できるひとつのことは、あなたのコマンド(matlab ...)を既知のフォルダ内のあるスクリプトに移動し、そのスクリプトへの完全なパスを与えて上記のループでそのスクリプトを実行することです。ような何か:スクリプトで

ssh $NOTE "/path/to/script.sh $cnt" 

は、$1は、あなたがしたい値(ループからすなわち$cnt)を得ます。スクリプトの冒頭でecho $1 >> /tmp/valuesを使用して、ファイル/tmp/valuesのすべての値を収集することができます。もちろん、開始する前にrm /tmp/values。これは、あなたが望むようにすべての値を取得しているかどうかを確認します。

0

$ PBS_NODEFILEにノードのリスト(1行に1つ)のファイル名が含まれている場合、これはうまくいくはずです:

seq 1 100 | parallel --slf $PBS_NODEFILE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob({}); quit'" 

詳細:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

関連する問題