MPI_Irecv没有通过此简单代码接收消息

时间:2019-05-27 18:57:46

标签: c++ c mpi

我有用于测试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,有时则什么也不打印。

这很有意义,因为可以在进程1完成之后执行进程0。

但是,如果让进程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,但不会。

如果我在进程1中插入MPI_Wait(),似乎进程1每次都会将cc从1打印到9。但是,如果其他进程没有发送任何消息,并且我实际上希望进行非阻塞通信,它也会永远等待。

回复评论:

1。关于版本: mpiexec-版本 mpiexec(OpenRTE)2.1.1

2。我不明白“ MPI进度线程”是什么意思。

实际上,我希望每个进程都可以彼此通信而不会阻塞,并且每次接收时都在缓冲区中获取信息。

以下3.executable代码

#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 个答案:

答案 0 :(得分:1)

您的程序不正确。

例如,如果排名1比排名0快,则第一个MPI_Test()将不匹配任何消息,然后直接转到MPI_Finalize()

最底行,此程序可能在0到10行之间打印。 如果排名1落后于排名0,该程序将仅打印10行,但是由于两个排名都不同步,因此这种情况极不可能发生。