2013-11-27 5 views
3

У меня есть следующий код MPI_Datatypeвозвращение MPI DataType к 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; 
} 

Я пытаю использовать следующий код, чтобы получать данные от других процессов. rank - целое число, определяющее, в каком ранге находится процесс.

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, используя этот метод:

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

Я считаю, что проблема лежит с моим типом данных, но я не уверен. Любой совет будет принят во внимание.

EDIT: У меня возникла проблема с этим, теперь я получаю неполные данные. Я изменил sizeof(resultset) на 1 внутри функции сбора. Теперь я получаю правильные данные, ЗА ИСКЛЮЧЕНИЕМ последних 2 поплавков - -431602080, а не 0,0022234327654, которые они должны быть.

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 };