MPI_Irecv не получает сообщения в этом простом коде - PullRequest
0 голосов
/ 27 мая 2019

У меня есть этот код для тестирования MPI_Irecv и MPI_Isend

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } while(flag != 0);

    }
    if(rank==0){
        int cc=0;
        MPI_Request request;
        for(int i=1;i<10;i++){
            cc+=1;
            MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
        }
    }

Если я выполняю этот код, иногда он печатает cc от 1 до 9, а иногда ничего не печатает.

Это имеет смысл, поскольку процесс 0 может быть выполнен после завершения процесса 1.

Однако, если я позволю процессу 1 быть бесконечным циклом, подобным этому:

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } while(true);

    }

Я думаю, что процесс 1 выведет cc из1–9 каждый раз, но это не так.

Если я вставлю MPI_Wait () в процесс 1, кажется, что процесс 1 будет печатать cc от 1 до 9 каждый раз.Но он также будет ждать вечно, если другой процесс не отправит ничего, и я на самом деле хочу неблокирующую связь.

Ответ на комментарий:

1.О версии: mpiexec --version mpiexec (OpenRTE) 2.1.1

2.Я не понимаю, что означает «поток прогресса MPI».

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

3. Исполняемый код, следующий за

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <unistd.h>

int main(void)
{
    MPI_Comm allcomm;
    int i;
    int size, rank, irank;
    int tablesize, localtablesize;
    int *table,*table2;

    allcomm = MPI_COMM_WORLD;
    MPI_Init(NULL, NULL);
    MPI_Comm_size(allcomm, &size);
    MPI_Comm_rank(allcomm, &rank);

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } //while(flag!=0);
        while(true);

    }
    if(rank==0){
        int cc=0;
        MPI_Request request;
        for(int i=1;i<10;i++){
            cc+=1;
            MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
        }
    }
    MPI_Finalize();
}

1 Ответ

1 голос
/ 28 мая 2019

Ваша программа неверна.

Например, если ранг 1 быстрее, чем ранг 0, первый MPI_Test() не будет соответствовать ни одному сообщению, а затем сразу перейдет к MPI_Finalize()

В итоге, эта программа может печатать от 0 до 10 строк. Эта программа будет печатать только 10 строк, если ранг 1 как-то отстает от ранга 0, но, поскольку оба ранга не синхронизированы, это вряд ли произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...