Что не так с этим кодом MPI? - PullRequest
       28

Что не так с этим кодом MPI?

1 голос
/ 09 февраля 2012

Следующая программа MPI просто определяет тип MPI для сообщения, а затем отправляет сообщение из процесса 0 в процесс 1. Однако происходит сбой с очень неинформативным сообщением об ошибке.Что с ним не так?

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

1 Ответ

3 голосов
/ 09 февраля 2012

Ни MPI_Type_struct(), ни MPI_Type_commit() не общаются (например, коммуникатор не является частью списка аргументов);это чисто локальные операции.Таким образом, каждый процесс, который использует тип, должен создать его.(Это имеет смысл; любой процесс, получающий данные, должен понимать его структуру).

Итак, после избавления от теста if (rank == 0) (и, следовательно, от барьеров) вокруг операции создания и освобождения типа ваш код работает.фактически измерять смещения (например, используя offsetof или подобное), а не предполагать их;компилятор может свободно вставлять (например) отступы в структуру, чтобы помочь с выравниванием.

...