4

別々に起動されるサーバーとクライアントの部分で構成されるOpenMPIアプリケーションを作成します。

me@server1:~> mpirun server

me@server2:~> mpirun client

serverを使用してポートを作成しますMPI_Open_port。問題は次のとおりです。OpenMPIにはポートを通信するメカニズムがありますclientか?他のどのコンピュータに情報を送信すべきかわからないため、ここでは機能しないMPI_Publish_nameと思います。MPI_Lookup_nameserver

私には、シングルを使用して開始されたプロセスのみmpirunがと通信できるように見えMPI_Publish_nameます。

ompi-serverも見つけましたが、ドキュメントがミニマルすぎて理解できません。誰かがこれがどのように使用されるか知っていますか?

関連:MPICH:クライアントアプリケーションがlookup_nameできるようにpublish_nameする方法は?およびhttps://stackoverflow.com/questions/9263458/client-server-example-using-ompi-does-not-work

4

1 に答える 1

9

MPI_Publish_nameには、Open MPI 固有のブール値 key を持つことができる MPI 情報オブジェクトが付属していますompi_global_scope。このキーが true に設定されている場合、名前はグローバル スコープ、つまり既に実行中の のインスタンスに公開されますompi-serverMPI_Lookup_nameデフォルトでは、 の URI が指定されている場合、最初にグローバル名のルックアップompi-serverが行われます。

専用の Open MPI サーバーを使用

このプロセスには、いくつかの手順が含まれます。

1)ompi-serverすべてのノードからアクセスできるクラスター内のどこかで開始します。--no-daemonize -r +デバッグ目的で、引数を渡すことができます。これは、次のような URI を開始して標準出力に出力します。

$ ompi-server --no-daemonize -r +
1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351

2) サーバーで、MPI 情報オブジェクトを作成し、ompi_global_scopeキーを trueに設定します。

MPI_Info info;

MPI_Info_create(&info);
MPI_Info_set(info, "ompi_global_scope", "true");

次に、info オブジェクトを に渡しますMPI_Publish_name

MPI_Publish_name("server", info, port_name);

3) クライアントでは、 への呼び出しはMPI_Lookup_name最初にグローバル コンテキストで自動的にルックアップを実行します (これは、MPI 情報オブジェクトに適切なキーを指定することで変更できますが、この場合はデフォルトの動作で十分です)。

クライアント コードとサーバー コードの両方が の場所を認識できるようにするには、オプションを使用ompi-serverして両方のmpirunコマンドにその URI を指定する必要があり--ompi-server 1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351ます。

もう 1 つのオプションはompi-server、URI をファイルに書き込んで、 を実行するノードで読み取ることができるmpirunようにすることです。たとえば、両方のmpirunコマンドが実行される同じノードでサーバーを起動すると、 /tmp. 別のノードでを起動する場合ompi-serverは、共有ファイル システム (NFS、Lustre など) で十分です。いずれにせよ、一連のコマンドは次のようになります。

$ ompi-server [--no-daemonize] -r file:/path/to/urifile
...
$ mpirun --ompi-server file:/path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client

サーバーレス方式

両方mpirunを同じノードで実行する場合--ompi-server、 はすでに実行中のインスタンスの PID をmpirunネーム サーバーとして使用するように指定することもできます。サーバーでローカル名の発行を使用できます (つまり、「ompi サーバーの実行」と「情報オブジェクトの作成」の部分をスキップします)。コマンドのシーケンスは次のようになります。

head-node$ mpirun --report-pid server
[ note the PID of this mpirun instance ]
...
head-node$ mpirun --ompi-server pid:12345 client

12345、サーバーの実際の PID に置き換える必要がありますmpirun

また、サーバーmpirunに URI を印刷させ、その URI をクライアントの に渡すこともできmpirunます。

$ mpirun --report-uri + server
[ note the URI ]
...
$ mpirun --ompi-server URI client

オプションの後に指定するのでは/path/to/fileなく (注:file:ここでは接頭辞なし)を指定すると、URI をファイルに書き込むこともできます。+--report-uri

$ mpirun --report-uri /path/to/urifile server
...
$ mpirun --ompi-server file:/path/to/urifile client

によって返される URI はmpirunのフォーマットと同じであることに注意してくださいompi-server。つまり、ホストの IP アドレスが含まれているため、2 番目mpirunのノードが別のノードで実行された場合にも機能します。このノードは、TCP/IP 経由で最初のノードと通信できます。 (そして/path/to/urifile共有ファイルシステムに住んでいます)。

上記のすべてを Open MPI 1.6.1 でテストしました。一部のバリアントは、以前のバージョンでは機能しない可能性があります。

于 2013-02-21T17:35:22.670 に答える