4

データのさまざまな部分を分析するために、大規模なコンピューター クラスターでコードを実行しようとしています。

ジョブを異なるノードとノードに含まれる cpu に割り当てるために 2 つのループを作成しました。私が書いた分析関数「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 インスタンスに渡される値は最後の値のみです。

それを回避する方法はありますか?関数を呼び出すときに、その変数の値を「ベイク」できますか?

それとも、問題はまったく別のものですか?

4

3 に答える 3

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

somehost をsshd実行中のホストに置き換えます。echo result: '$cnt'これにより、リモートで実行されてから戻ってきた番号 0 ~ 3 が出力されます。したがって、実行自体は問題なく動作します。

私が提案できることの 1 つは、コマンド ( matlab ...) を既知のフォルダー内のスクリプトに移動し、そのスクリプトへのフル パスを指定して、上記のループでそのスクリプトを実行することです。何かのようなもの:

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

スクリプトで$1は、必要な値が得られます (つまり$cnt、ループから)。スクリプトの先頭で使用echo $1 >> /tmp/valuesして、 file 内のすべての値を収集できます/tmp/values。もちろん、rm /tmp/values始める前に。これにより、すべての値が希望どおりに取得されているかどうかが確認されます。

于 2010-11-20T00:33:07.933 に答える
2

Bash は中かっこの範囲式で変数を処理できません。それらはリテラルでなければなりません: {1..10}. 現在の方法により、内側のループは、外側のループの反復ごとに 8 回 (または値が何であれPROCS_PER_NODE) ではなく、常に 1 回だけ実行されます。その結果、は からに移動する必要があるときにchn、初期値からそのプラスに移動します。NODESOriginal_chnNODES * PROCS_PER_NODE

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

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

との両方job_idxをインクリメントすることができます(それでオフバイワンの問題が発生しない場合):chnfor

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++))
于 2010-11-20T07:40:20.470 に答える
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

于 2013-02-03T15:39:44.003 に答える