4

Windows(1.4.1p1)でMPICHを使用してMPIを学習しているときに、ここでサンプルコードを見つけました。元々、サーバーを実行したときに、生成されたものをコピーして、port_nameそれを使用してクライアントを起動する必要がありました。そうすれば、クライアントはサーバーに接続できます。MPI_Publish_name()代わりにサーバーに含めるように変更しました。の名前でサーバーを起動した後、失敗しaaaaたクライアントを起動しますMPI_Lookup_name()

Invalid service name (see MPI_Publish_name), error stack:
MPID_NS_Lookup(87): Lookup failed for service name aaaa

コードの一部を次に示します。

server.c

MPI_Comm client; 
MPI_Status status; 
char port_name[MPI_MAX_PORT_NAME];
char serv_name[256];
double buf[MAX_DATA]; 
int size, again; 
int res = 0;

MPI_Init( &argc, &argv ); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Open_port(MPI_INFO_NULL, port_name);
sprintf(serv_name, "aaaa");
MPI_Publish_name(serv_name, MPI_INFO_NULL, port_name);

while (1) 
{ 
    MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client );
    /*...snip...*/
}

client.c

MPI_Comm server; 
double buf[MAX_DATA]; 
char port_name[MPI_MAX_PORT_NAME]; 
memset(port_name,'\0',MPI_MAX_PORT_NAME);
char serv_name[256];
memset(serv_name,'\0',256);

strcpy(serv_name, argv[1] )
MPI_Lookup_name(serv_name, MPI_INFO_NULL, port_name);
MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server ); 
MPI_Send( buf, 0, MPI_DOUBLE, 0, tag, server ); 
MPI_Comm_disconnect( &server ); 
MPI_Finalize(); 
return 0; 

それが問題でさえあるとしても、公開された名前の可視性を変更することについての情報を見つけることができません。MPICHはMPI_INFOで何も実装していないようです。openMPIを試してみますが、ビルドするだけで問題が発生します。助言がありますか?

4

3 に答える 3

1

ここで、ompi-serverネームサーバーを使用するUbuntu上のCのクライアントとサーバーのOpenMPI1.6.5を使用して動作するバージョンをアップロードしました。

CでのOpenMPIネームサーバークライアントサーバーの例

于 2016-12-17T04:11:11.010 に答える
1

(古いものを掘り起こす)
MPICHの場合、@daemondaveによるコードも実際に機能するはずです。ただし、ネームサーバーを実行する必要があります。MPICHの場合、ompi-serverを使用する代わりに、hydra_nameserverを使用してこれを行うことができます。次に、を使用してすべてのmpirun/mpiexec呼び出しに対してホストを指定する必要があります-nameserver HOSTNAME

githubで実用的な例を作成しました。これは、例をビルドして実行するためのシェルスクリプトも提供します。

PS:ompi-serverバリアントはやや時代遅れのようです(そしていくつかのバグが含まれています)。
更新されたが、まだ文書化されていない代替案については、このコメントを参照してください。

于 2021-03-30T12:19:38.910 に答える
-5

名前を公開し、検索し、接続するというこのアプローチは、通常のMPIの使用法に比べて風変わりです。

標準パターンはmpirun、特定の数のプロセスを起動するノードのセットを指定するために使用されます。実装の一般的な実装の操作は、別の質問mpirunで説明されています

プロセスがすべて単一の並列ジョブの一部として起動されると、MPIライブラリは、MPI_Initセットアップ中にランチャーが提供した情報、MPI_COMM_WORLDつまりジョブ内のすべてのプロセスのグループに対するコミュニケーターを読み取ります。

そのコミュニケータを使用して、並列アプリケーションは作業の配布、情報の交換などを行うことができます。これは、共通MPI_SendおよびMPI_Recvルーチン、それらのすべてのバリアント、集合操作などを使用して行われます。

于 2013-08-15T17:28:12.977 に答える