29

我正在 MPI 中实现一个程序,其中主进程(rank=0)应该能够接收来自其他进程的请求,这些进程要求只有根知道的变量值。如果我将 MPI_Recv(...) 设为 0 级,我必须指定向根发送请求的进程的等级,但我无法控制它,因为进程不按 1、2、3 的顺序运行,.... 我怎样才能接收来自任何级别的请求并使用发送进程的编号向它发送必要的信息?

4

2 回答 2

57

这假设您使用的是 C。C++ 和 Fortran 中有类似的概念。您只需MPI_ANY_SOURCEMPI_recv(). status 结构包含消息的实际来源。

int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);
于 2010-12-03T19:59:51.053 回答
3

MPI_ANY_SOURCE 是显而易见的答案。

但是,如果所有等级都将发送请求到等级 0,那么 MPI_Irecv 与 MPI_Testall 结合也可以作为一种模式工作。这将允许 MPI_Send 调用以任何顺序执行,并且可以按照 MPI_Irecv 调用匹配的顺序接收和处理信息。

于 2010-12-04T16:29:59.697 回答