2010-12-03 91 views
24

我在MPI中实现了一个程序,其中主进程(rank = 0)应该能够接收来自其他进程的请求,这些进程请求仅由根。 如果我使MPI_Recv(...)的级别为0,我必须指定向root发送请求的进程的级别,但我无法控制它,因为进程没有按1,2的顺序运行, 3,.... 如何接收来自任何等级的请求并使用发送过程的号码向其发送必要的信息?来自未知源的MPI recv

回答

44

这里假定您使用的是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); 
+0

非常感谢!我不知道它,但非常有用 – shkk 2010-12-03 20:09:55

2

MPI_ANY_SOURCE是显而易见的答案。

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

相关问题