如何从MPI\U Irecv消息中检索标记?
我知道我可以使用如何从MPI\U Irecv消息中检索标记?,c,mpi,C,Mpi,我知道我可以使用status.MPI\u tag获取MPI\u Recv消息的标记,如下所示: MPI_Recv(&buffer, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, globalComm, &status); printf("The tag I received is %d\n",status.MPI_TAG); 现在,如何获取MPI\u Irecv消息的标记 int buffer[2]; MPI_Request request;
status.MPI\u tag
获取MPI\u Recv
消息的标记,如下所示:
MPI_Recv(&buffer, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, globalComm, &status);
printf("The tag I received is %d\n",status.MPI_TAG);
现在,如何获取MPI\u Irecv
消息的标记
int buffer[2];
MPI_Request request;
MPI_Irecv(&buffer[0], 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, globalComm, &request);
我尝试使用
request.MPI_标记
,但它不起作用,而是给了我一条错误消息。该标记仅在收到消息时可用,
因此,当MPI\u Irecv()
返回时,它可能不可用
完整的序列是
MPI_Irecv(&buffer[0], 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, globalComm, &request);
// whatever you have to do
MPI_Wait(&request, &status);
// now the tag is in status.MPI_TAG
注意,您可以使用其他子例程来检查消息是否已收到(主要示例是
MPI\u Test()
和MPI\u Probe()
)Hi,如果使用MPI\u Wait(&request,&status),它基本上会等待消息被接收。如果我在循环中使用了MPI_Irecv和MPI_Wait,那么在收到消息之前,代码不会退出循环。我该如何预防呢?深呼吸,后退一步。除非你有一个水晶球,否则你无法猜测下一条消息的标签是什么。有道理吗?如果最后你认为你需要一个水晶球,那么你的算法有问题。MPI_-Irecv()
填充一个请求数组和循环外部的单个MPI_-Waitall()
会起作用吗?应该注意的是,MPI_-Request
是一个不透明的句柄,您无法直接访问它。也就是说,请不要问它不起作用/给了我一个没有包括具体错误的错误。