2012-04-17 68 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