我知道MPI_SENDRECV
可以解決死鎖問題(當我們使用經典的MPI_SEND
和MPI_RECV
函數時)。MPI - 具有異步功能的MPI_SENDRCV的等效
我想知道,如果MPI_SENDRECV(sent_to_process_1, receive_from_process_0)
等同於:
MPI_ISEND(sent_to_process_1, request1)
MPI_IRECV(receive_from_process_0, request2)
MPI_WAIT(request1)
MPI_WAIT(request2)
異步MPI_ISEND
和MPI_RECV
功能?
從我所看到的,MPI_ISEND
和MPI_RECV
創建了一個fork(即2個進程)。所以如果我遵循這個邏輯,MPI_ISEND
的第一個調用會生成2個進程。其中一個進行通信,另一個呼叫MPI_RECV
,其自身分出2個進程。
但是一旦第一個MPI_ISEND
的通信完成後,第二個過程再次調用MPI_IRECV
?有了這個邏輯,上述的等效似乎並沒有有效...
也許我應該改成這樣:
MPI_ISEND(sent_to_process_1, request1)
MPI_WAIT(request1)
MPI_IRECV(receive_from_process_0, request2)
MPI_WAIT(request2)
但我認爲,它可以同時創建死鎖。
任何人都可以給我另一種解決方案,使用MPI_ISEND
,MPI_IRECV
和MPI_WAIT
獲得相同的行爲MPI_SEND_RECV
?
好的,謝謝。我認爲第一個MPI_ISEND之後有兩個進程,一個處理通信(發送到上面例子中的進程1),另一個傳遞給MPI_IRECV函數。這樣,我認爲MPI_IRECV應該被調用兩次(在fork之後和第一次調用完成時)。在我的例子中,MPI_WAIT只是阻塞,直到request_1完成爲止:我們不能說每個MPI_ISEND和MPI_IRECV都執行fork(創建2個進程,如POSIX pthread的觀點),是嗎? MPI_WAIT的底層實現是什麼(它是POSIX「pthread_join」?)? – youpilat13
因爲您已經在使用MPI流程(或排名)分解問題,所以稱它們爲流程是不好的。然而,如果你真的想這樣想,那麼是的,有一個分叉,其中1個「進程」處理通信,1個「進程」在代碼中繼續。請注意,只要通信結束,通信「進程」就會死亡。所以你的'waitall'只適用於每個MPI進程 - 而不是從fork創建的每個「進程」。 – NoseKnowsAll
至於'mpi_wait'的底層實現,它依賴於你正在使用的MPI實現。 MPI標準並沒有規定如何實現功能,而只是MPI兼容實現的結果。最後,pthread和MPI是兩種不同的思想流派,所以我不會對它們進行比較。這就像試圖比較OpenMP和MPI一樣......它們只是創建並行代碼的根本不同的方法。 – NoseKnowsAll