2

MPIを使用して2番目の実行可能ファイル(「スレーブ」)を「生成」するプログラム(「ランチャー」と呼びます)をC++で作成しています。クラスターがランチャーに使用できるノードの数に応じて、各ノードでスレーブが起動され、スレーブは MPI を介してランチャーとも通信します。スレーブが計算を完了すると、ノードが使用可能になったことをランチャーに通知し、ランチャーは空いているノードに別のスレーブを生成します。ポイントは、2 番目の実行可能ファイルに依存する 1000 の独立した計算を、マシンの異種グループで実行することです。

これは自分のコンピューターで機能しており、「偽の」マシンファイル (またはホストファイル) を作成して、プログラムに 2 つのノード (localhost と localhost) を提供しています。ランチャーは 2 つのスレーブを生成し、そのうちの 1 つが終了すると、別のスレーブが起動されます。これは、Spawn プロセスが正しく機能していることを示しています。

それをラボのクラスターに移動すると (torque/maui を使用して管理します)、1 つのノードを要求しても機能します。さらに要求すると、ライブラリが見つからないというエラーが表示されます (正確には、libimf.so。Intel コンパイラのライブラリ)。ライブラリはそこにあり、ノードはそれを見ることができます。これは、ノードを 1 つだけ要求するとプログラムが実行されるためです。

動作する私の PBS は次のようになります。

#!/bin/bash
#PBS -q small 
#PBS -l nodes=1:ppn=8:xeon
#PBS -l walltime=1:00:00
#PBS -N MyJob
#PBS -V 

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpich2.shared.exec/lib/:/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/:/usr/local/boost/lib/

log_file="output_pbs.txt"

cd $PBS_O_WORKDIR

echo "Beginning PBS script." > $log_file

echo "Executing on hosts ($PBS_NODEFILE): " >> $log_file
cat $PBS_NODEFILE >> $log_file

echo "Running your stuff now!" >> $log_file

# mpiexec is needed in order to let "launcher" call MPI_Comm_spawn.
/usr/local/mpich2.shared.exec/bin/mpiexec -hostfile $PBS_NODEFILE -n 1 /home/user/launhcer --hostfile $PBS_NODEFILE -r 1 >> $log_file 2>&1

echo "Fim do pbs." >> $log_file

2 つ以上のノードを試してみると、ランチャーは実行可能ファイルを生成しません。次のような出力が得られます。

Beginning PBS script.
Executing on hosts (/var/spool/torque/aux//2742.cluster): 
node3
node3
node3
node3
node3
node3
node3
node3
node2
node2
node2
node2
node2
node2
node2
node2
Running your stuff now!

(Bla bla bla from launcher initialization)

Spawning!
/usr/local/mpich2.shared.exec/bin/hydra_pmi_proxy: error while loading shared libraries: libimf.so: cannot open shared object file: No such file or directory

メーリングリストで私のような問題を抱えている別の人を見つけましたが、解決策はありません。( http://lists.mcs.anl.gov/pipermail/mpich-discuss/2011-July/010442.html )。唯一の答えは、ノードが lib を参照できるかどうかを確認することを提案した (lib が格納されているディレクトリがノードにマウントされている場合)。

ssh node2 ls /opt/intel/composerxe-2011.3.174/compiler/lib/intel64/libimf.so >> $log_file

私のPBSスクリプト内にあり、libはノードが見ることができるフォルダーに存在します。

私の意見では、torque/maui は環境変数をすべてのノードにエクスポートしていないようです (理由はわかりませんが)。そのため、MPI_Spawn を使用して別のノードで別の実行可能ファイルを実行しようとすると、ライブラリが見つかりません。それは意味がありますか?もしそうなら、解決策を提案できますか?誰でも他のアイデアを提供できますか?前もってありがとう、マルセロ

編集:

回答の1つの提案に従って、OpenMPIをインストールして、オプション「-x VARNAME」をmpiexecでテストしました。PBS スクリプトで、実行行を次のように変更しました。

/usr/local/openmpi144/bin/mpiexec -x LD_LIBRARY_PATH -hostfile $PBS_NODEFILE -n 1 /var/dipro/melomcr/GSAFold_2/gsafold --hostfile $PBS_NODEFILE -r 1 >> $log_file 2>&1

しかし、次のエラーメッセージが表示されました:

[node5:02982] [[3837,1],0] ORTE_ERROR_LOG: A message is attempting to be sent to a process whose contact information is unknown in file rml_oob_send.c at line 105
[node5:02982] [[3837,1],0] could not get route to [[INVALID],INVALID]
[node5:02982] [[3837,1],0] ORTE_ERROR_LOG: A message is attempting to be sent to a process whose contact information is unknown in file base/plm_base_proxy.c at line 86

インターネットから、このエラーは通常、私の場合のように、mpiexec を複数回実行したことが原因であることがわかりまし/path/to/mpiexec mpiexec -n 2 my_programた。

生成された「スレーブ」プログラムは、ポートを使用して「ランチャー」プログラムと通信することを追加する必要があると思います。ランチャーは、MPI_Open_port と MPI_Comm_accept でポートを開き、スレーブが MPI_Comm_connect を実行すると、スレーブ プログラムが接続するのを待ちます。

上で述べたように、ノードを 1 つだけ要求すると、これらすべてが (MPICH2 で) 機能します。OpenMPI では、ノードを 1 つだけ要求しても上記のエラーが発生します。

4

2 に答える 2

2

あなたは正しいです。クラスタリングソフトウェアのはるか下にあるリモート呼び出しは、環境変数を転送しません。

于 2012-09-03T18:28:35.030 に答える
1

-x オプションを mpiexec に使用して、環境変数を他のノードに渡すことができます。

于 2012-09-06T13:57:34.563 に答える