2012-02-08 6 views
1

次のMPIプログラムは、単にメッセージのMPIタイプを定義し、プロセス0からプロセス1にメッセージを送信します。ただし、非常に情報のないエラーメッセージでクラッシュします。どうしたの?このMPIコードで何が問題になっていますか?

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

struct P { 
    char choices[64]; 
    int next_choice; 
}; 

typedef struct P Packing; 

int main(int argc,char** argv) { 
    int rank; 
    MPI_Datatype PACKING_TYPE; 
    MPI_Init(&argc,&argv); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 

    if (rank == 0) { 
     /*Defines a new MPI datatype tag for Packings.*/ 
     int field_count = 2; 
     int field_lengths[2] = {64,1}; 
     MPI_Aint field_offsets[2] = {0,64 * sizeof(char)}; 
     MPI_Datatype field_types[2] = {MPI_CHAR,MPI_INT}; 
     MPI_Type_struct(field_count,field_lengths, 
      field_offsets,field_types,&PACKING_TYPE); 
     MPI_Type_commit(&PACKING_TYPE); 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 

    if (rank == 0) { 
     Packing pack; 
     MPI_Status status; 
     MPI_Send(&pack,1,PACKING_TYPE,1,0,MPI_COMM_WORLD); 
     puts("Process 0 sent message."); 
    } 

    if (rank == 1) { 
     Packing pack; 
     MPI_Status status; 
     MPI_Recv(&pack,1,PACKING_TYPE,MPI_ANY_SOURCE, 
      MPI_ANY_TAG,MPI_COMM_WORLD,&status); 
     puts("Process 1 recieved message."); 
    } 

    MPI_Barrier(MPI_COMM_WORLD); 
    if(rank == 0) { 
     MPI_Type_free(&PACKING_TYPE); 
    } 
    MPI_Finalize(); 
    return 0; 
} 
+2

エラーメッセージは何ですか? – suszterpatt

答えて

3

MPI_Type_struct()MPI_Type_commit()どちらも任意の通信(例えば、引数リストの一部として、何のコミュニケータはありません)を行います。それらは純粋にローカルな操作です。したがって、型を使用するすべてのプロセスがそれを作成する必要があります。 (これは理にかなっており、データを受け取るすべてのプロセスはそのレイアウトを理解する必要があります)。

したがって、タイプの作成と解放操作に関するif (rank == 0)テスト(と障壁)を取り除いた後で、コードは機能します。

ちなみに、実際にはオフセットを測定するのではなく、オフセットを測定することが常に安全です(たとえば、offsetofなどを使用)。コンパイラは自由に構造体にパディングを挿入してアライメントを支援します。

関連する問題