2012-04-17 25 views
1

是否有可能拥有传递给MPI_Recv(或等效)调用的源的列表?目前,我的代码看起来像这样:带有源列表的MPI_Recv

do i=nod1,nod2 
    call mpi_recv(tmp,n,MPI_REAL,MPI_ANY_SOURCE,tag,MPI_COMM_WORLD,status,ierr) 
    ... do stuff with tmp here 
    call mpi_send(tmp,n,MPI_REAL,status(MPI_SOURCE),tag,MPI_COMM_WORLD,ierr) 
enddo 

当然,这并不能保证它做我想要的。 (如果在nod2可以发送一条消息之前nod1发送两条消息,那么在此迭代过程中不会收到nod2的消息,这将会很糟糕。)在我的应用程序中,由于nod1和nod2有其他约束迫使它们与对方同步(足够)......但它让我想知道是否有办法指定允许从中接收的特效列表。

回答

1

不一样。但是,您可以使用MPI_Probe()MPI_ANY_SOURCE,然后将status对象的MPI_SOURCE字段与您希望从中接收的进程列表进行比较。如果有匹配,则可以继续从该源接收并定期阻止接收。

+0

我想知道...... MPI_Probe保证只返回一次有关消息的信息吗?如果它探测并收到“坏消息”会发生什么?然后,我必须再次进行调查,直到找到“良好”的消息,但它是否不会返回有关“不良”消息的信息? – mgilson 2012-04-17 16:11:05

+0

基本上,Probe做的是告诉你如果你叫Recv会发生什么。但是,它不会丢弃消息,并且因为MPI中的消息不超车,所以重复的探测器会一遍又一遍地探测同一消息。如果这是一个问题,您可以随时循环访问您希望收到的所有等级,并单独进行探测。 – suszterpatt 2012-04-17 17:37:04

+0

是的,我意识到我可以做到这一点,但是自从MPI_Probe被阻塞后,就出现了问题 - 如果我在MPI_Probe中指定了一个proc编号,我又一次强制接收到消息的顺序。我想唯一的解决方案是发布N个MPI_Iprobes(每个proc都有一个)并测试这些探测是否已经回来 - 看起来这是一个简单/常见的情况,以至于会有一种更简单的方法来实现它。 – mgilson 2012-04-17 17:42:53