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 또는 그 유사). 컴파일러는 정렬을 돕기 위해 구조체에 패딩을 자유롭게 삽입 할 수 있습니다 (예 :).

관련 문제