MPI从未知源接收

31

我正在使用MPI实现一个程序,其中主进程(rank=0)应该能够接收其他进程的请求,这些请求是要求根节点知道的变量值。 如果我通过rank 0进行MPI_Recv(...),则必须指定发送请求到根节点的进程的rank,但我无法控制这一点,因为进程不按顺序运行1,2,3...。 如何接收任何rank的请求,并使用发射进程的数字发送必要的信息?

2个回答

57

假设您正在使用C语言。 C ++和Fortran中有类似的概念。您只需在MPI_recv()中指定MPI_ANY_SOURCE作为来源即可。状态结构包含消息的实际来源。

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);

在我看来,修改后的代码似乎无法使用。status 结构确实用于 MPI_Send 操作以识别原始消息的来源:status.MPI_SOURCE - Marius
1
@Marius 谢谢,我已经回滚到原始版本,并添加了一些注释以使事情更清晰。 - KeithB

3

MPI_ANY_SOURCE是显而易见的答案。

然而,如果所有的进程都将向rank 0发送请求,则MPI_Irecv与MPI_Testall结合可能也可以作为一种模式。这将允许MPI_Send调用以任意顺序执行,并且信息可以按照MPI_Irecv调用匹配的顺序接收和处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接