2013-11-27 6 views
3

를 수집 나는 내가 다른 프로세스에서 데이터를받을하려면 다음 코드를 사용하려고 시도하고반환 MPI 데이터 형식은

typedef struct resultset { 
    int rank, totalProcessed, bracket1, bracket2, bracket3, bracket4; 
    float bracket1percent, bracket2percent, bracket3percent, bracket4percent; 
} resultset; 

MPI_Datatype createResultType() 
{ 
    // Set-up the arguments for the type constructor 
    MPI_Datatype new_type; 

    int count = 2; 

    int blocklens[] = { 6, 4 }; 

    MPI_Aint indices[2]; 
    indices[0] = 0; 
    MPI_Type_extent(MPI_FLOAT, &indices[1]); 
    indices[1] *= 4; // There are 4 float 

    MPI_Datatype old_types[] = { MPI_INT, MPI_FLOAT }; 

    // Call the data type constructor 
    MPI_Type_struct(count, blocklens, indices, old_types, &new_type); 
    MPI_Type_commit(&new_type); 

    return new_type; 
} 

다음 MPI_DataType 코드를 가지고있다. rank는 프로세스의 순위를 정의하는 정수입니다.

for(int i = 0; i < numProcs; ++i){ 
    std::cout << all_results[i].rank << " processed " << all_results[i].totalProcessed <<std::endl; 
} 

나는 문제가 내 데이터 형식에있다 생각하지만, 나는 확실하지 않다 :

MPI_Datatype resType = createResultType(); 
if(rank != 0){ 
    MPI_Gather(&results, sizeof(resultset), resType, NULL, 1, resType, 0, MPI_COMM_WORLD); 
} 
else { 
    resultset* all_results = new resultset[numProcs]; 
    MPI_Gather(&results, sizeof(resultset), resType, all_results, sizeof(resultset), resType, 0, MPI_COMM_WORLD); 
} 

문제는 내가이 방법을 사용하여 all_results을 통해하지 루프 수 있다는 것입니다. 어떤 조언을 주시면 감사하겠습니다.

편집 : 나는 그것을 통해 반복의 문제가있어, 지금 나는 불완전한 데이터를 얻고있다. 나는 gather 기능 안에서 sizeof(resultset)1으로 바 꾸었습니다. 이제 올바른 데이터를받습니다. 마지막 두 개의 부동 소수점은 0.0022234327654가 아닌 -431602080입니다.

MPI_Datatype resType = createResultType(); 
if(rank != 0){ 
    MPI_Gather(&results, 1, resType, NULL, 1, resType, 0, MPI_COMM_WORLD); 
} 
else { 
    resultset* all_results = new resultset[numProcs]; 
    MPI_Gather(&results, 1, resType, all_results, 1, resType, 0, MPI_COMM_WORLD); 
} 

답변

1

플로트는 "6"

int blocklens[] = { 6, 4 }; 

int blocklens[] = { 6, 6 }; 
에 있어야합니다
관련 문제