Отправка и получение данных другого типа с использованием MPI_Isend - PullRequest
1 голос
/ 15 октября 2019

Я хочу отправить другой тип данных с одного узла на другой. Например, у меня есть 2 данных с разными типами: int и double. Однако после их отправки узел, который получает данные, получает неправильное значение, даже если я указываю тип. Из приведенного ниже примера кода второй узел получает 0,00000 и 0 значений для обоих приемов. Как я могу это исправить и заставить второй узел получить правильное значение, в этом случае значение для двойного должно быть 1,2 и 5 для целого.

include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

/* Main function */
int main(int argc, char *argv[]) {
    int rank, numberOfProcesses;

    MPI_Init( &argc, &argv );
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &numberOfProcesses);
    MPI_Status status[5];
    MPI_Request req[5];     //request array

    int nreq = 0;
    int tag = 0;

    if (rank == 0){
        double sendDouble = 1.2;
        int sendInteger = 5;

        MPI_Isend(&sendInteger, 1, MPI_INT, 1, 100, MPI_COMM_WORLD,&req[nreq++]);
        MPI_Isend(&sendDouble, 1, MPI_DOUBLE, 1, 222, MPI_COMM_WORLD,&req[nreq++]);
    }
    MPI_Waitall(nreq,req,status);

    if (rank ==1) {
        MPI_Status status;

        double recvDouble;
        int recvInt;
        MPI_Irecv(&recvDouble,1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&req[nreq++]);
        MPI_Irecv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&req[nreq++]);

        printf("receive double %lf\n", recvDouble);
        printf("receive integer %d\n", recvInt);

    }


    MPI_Finalize();
    return 0;
}

получать двойное 0,000000

получить целое число 0

1 Ответ

0 голосов
/ 15 октября 2019

Я не уверен, что это ответ, но у меня есть некоторые замечания:

Видимо, вы запускаете программу дважды, и в зависимости от ее ранга она является отправителем или получателем.

Если это отправитель, вы отправляете и целое число. Затем вы отправляете двойной.

Если это получатель, вы хотите получить двойной.

Но при асинхронном обмене данными вы должны прочитать, что находится в канале, поэтому первое, что нужно сделать вканал будет целым числом. Прочитав целое число, вы можете прочитать двойной. (Я не могу найти никакой информации о том, что получатель выбрал бы удвоение из потока, игнорируя int.)

Обратите внимание, что ваш MPI_Waitall(nreq,req,status); также выполняется для rank==1, хотя это не имеет значения, потому что nreq - ноль.

Вам также следует проверить возвращаемые значения вызовов MCI.

...