2012-02-08 176 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 2012-02-08 20:46:36

回答

3

无论MPI_Type_struct()也不MPI_Type_commit()做任何通信(例如,有没有沟通作为参数列表的一部分);他们纯粹是本地运营。所以每个使用该类型的进程都必须创建它。 (这很有道理;任何接收数据的进程都需要了解其布局)。

因此,在摆脱了if (rank == 0)测试(因此,障碍)周围的类型创建和释放操作后,您的代码的作品。顺便说一句 - 实际测量偏移量总是最安全的(例如,使用offsetof或类似的),而不是假设他们;编译器可以自由插入(例如)填充到结构中以帮助对齐。