我想运行一个程序来了解MPI_Isend和MPI_Irecv的工作方式。等级0的Isend和Irecv正常工作,但等级5的Irecv采用默认值。有人可以向我解释吗?

#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
#include<string.h>
int main(int argc , char *argv[])
  {
    int rank;
    int size;
    int i;
    int index;
    int ph_number[10] ={1,2,3,4,5,6,7,8,9};
    int recv_numb[10];
    MPI_Status status;
    MPI_Request request;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if(rank ==0)
    {

        MPI_Isend(&ph_number,8,MPI_INT,0,10,MPI_COMM_WORLD, &request);
        MPI_Isend(&ph_number,8,MPI_INT,5,11,MPI_COMM_WORLD, &request);
        MPI_Irecv(&recv_numb,9,MPI_INT,0,10,MPI_COMM_WORLD, &request);

        printf("recv number[7] = %d \n \n ", recv_numb[7]);
    }

        if(rank==5)
        {

            MPI_Irecv(&recv_numb,9,MPI_INT,0,11,MPI_COMM_WORLD,&request);
            printf("recv number[5] = %d in rank %d\n \n ",recv_numb[5],rank);
        }

        MPI_Finalize();
    }

最佳答案

MPI_Wait(&request, &status);


关键是等级> 1在非阻塞模式下正在接收,并且您错过了数据。您必须检查MPI_Irecv的返回值,或在接收后调用MPI_Wait(但这是没有用的,因为您可以简单地使用阻塞MPI_Recv)。

rank 0 Isend() --                    rank x Irecv()
                 \----                      printf()
                      \-------------> //data are received now, but output is already printed

关于c - 我正在学习MPI编程,并被MPI_Isend和MPI_Irecv震惊,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28753914/

10-11 04:02