2012-01-11 5 views
0

質問が2つあります。最初の1つは:MPIを使用するクライアント/サーバーアプリケーション

私はmsmpiを使用するつもりです。私はソケットを使用してはならない "mpi"を意味します。私のアプリケーションはスケーラブルな分散データ構造です。最初に、サーバーには可変サイズのファイルが含まれています(サイズは挿入によって増加し、削除によって減少する可能性があります)。ファイルのサイズが一定の制限を超えると、ファイルは分割され、最初のサーバーに残ります後半は新しいサーバーに移動します。クライアントは、ファイルの分割操作のイメージを持つように、検索するデータのアドレスによって常にクライアントに通知する必要があります。最後に、私はそれをより明確にすることを望む。

2つ目は、次のとおりです。私は単純なクライアント/サーバーアプリケーションをコンパイルしようとした

MS-MPIやMPICH2で(コードソースは怒鳴るです)、それは動作しませんし、「致命的な私にエラーメッセージを表示しますmpi_open_port()や他のスタックエラー "でubunto 11.10にopen mpiをインストールし、サーバー側で動作していた同じ例を実行しようとしましたが、ポート名がわかりましたが、クライアント側でエラーが出ましたメッセージ:

[user-Compaq-610:03833] [[39604,1],0] ORTE_ERROR_LOG: Not found in file ../../../../../../ompi/mca/dpm/orte/dpm_orte.c at line 155 
[user-Compaq-610:3833] *** An error occurred in MPI_Comm_connect 
[user-Compaq-610:3833] *** on communicator MPI_COMM_WORLD 
[user-Compaq-610:3833] *** MPI_ERR_INTERN: internal error 
[user-Compaq-610:3833] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 
-------------------------------------------------------------------------- 
mpirun has exited due to process rank 0 with PID 3833 on 
node toufik-Compaq-610 exiting without calling "finalize". This may 
have caused other processes in the application to be 
terminated by signals sent by mpirun (as reported here). 

ので、私は素晴らしいことだ、私は問題が何であるか困惑している、と私はそれを修正しようとしているときを過ごし、 体があればそれで私を助けてくれるでしょうし、事前にuに感謝します。

ソースコードはここにある:

/* the server side */ 
#include <stdio.h> 
#include <mpi.h> 

main(int argc, char **argv) 
{ 
    int my_id; 
    char port_name[MPI_MAX_PORT_NAME]; 
    MPI_Comm newcomm; 
    int passed_num; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 

    passed_num = 111; 

    if (my_id == 0) 
    { 
    MPI_Open_port(MPI_INFO_NULL, port_name); 
    printf("%s\n\n", port_name); fflush(stdout); 
    } /* endif */ 

    MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm); 

    if (my_id == 0) 
    { 
    MPI_Send(&passed_num, 1, MPI_INT, 0, 0, newcomm); 
    printf("after sending passed_num %d\n", passed_num); fflush(stdout); 
    MPI_Close_port(port_name); 
    } /* endif */ 

    MPI_Finalize(); 

    exit(0); 

} /* end main() */ 

と、クライアント側で:

#include <stdio.h> 
#include <mpi.h> 

int main(int argc, char **argv) 
{ 
    int passed_num; 
    int my_id; 
    MPI_Comm newcomm; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 

    MPI_Comm_connect(argv[1], MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm); 

    if (my_id == 0) 
    { 
    MPI_Status status; 
    MPI_Recv(&passed_num, 1, MPI_INT, 0, 0, newcomm, &status); 
    printf("after receiving passed_num %d\n", passed_num); fflush(stdout); 
    } /* endif */ 

    MPI_Finalize(); 

    return 0; 
    //exit(0); 

} /* end main() */ 
+0

なぜ戻り値をチェックしていませんか? –

+0

私はbegginer以来、私はよくUをundersatndしていない、あなたにもっと、そして感謝を説明してください。 –

+0

@ iMade575:すべてのC MPI関数呼び出しは、ステータスコードを整数として返します。エラーが発生したかどうかを確認するには、コードごとにチェックする必要があります。 'MPI_Error_string'はエラーコードを人間が読める文字列に変換して出力します。 – talonmies

答えて

0

アプリケーションを実行するにはどうすればよい正確?提供されたクライアントコードとサーバーコードは同じようです。

通常、コードはすべてのMPIプロセスで同じで、プログラムはこのスニペットif (my_id == 0) { ... }のようにランクに基づいて何を実行するかを決定します。アプリケーションはmpiexecで実行されます。例えば、mpiexec -n 2 ./applicationは、MPI_COMM_WORLDコミュニケータにランク12を持つ2つのMPIプロセスを実行します。正確にどこで実行されるのか(同じノード上で、あるいは別のノード上で)は設定に依存します。

それにもかかわらず、ポートをMPI_Open_portで作成し、それをMPI_Comm_connectに渡す必要があります。 MPI_Comm_connect

また、MPI_RecvためMPI_Sendが対応しなければならない。ここでこれらの関数を使用する方法の例です。さもなければ受信プロセスは永遠に待つでしょう。

+0

申し訳ありませんが、私の悪い、私は、サーバー側で間違ったコードをcoppiedしました。もう一度それを確認してください –

+0

@ iMade575:どのように正確にサーバーとクライアントの両方を実行しますか? –

+0

mpirun -n 1 mserverはポート名を表示し、クライアントを次のように他のコンソール端末で実行します:mpirun -n 1 mclient "port_name" –

関連する問題