我想运行一个程序来了解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/