2010-11-01 109 views
1

考慮配置是在消息傳遞(MPI)MPI_SEND和recv 「什麼等待」

第一:

不進行緩衝,阻塞(同步)

據我所知MPI是一個API,所以當我們做mpi_send阻塞函數調用時,發送函數/程序是否被阻塞?

OR

是否MPI API函數mpi_send被阻塞,從而使直至發送郵件程序可以繼續工作?

二:

類似的困惑,莫非mpi_recv被阻塞或從它被調用的函數被封鎖?

之所以這麼愚蠢的問題:

它的並行處理,爲什麼會有人做的東西會阻止誰想要的一些信息的過程?

另一個原因:

這可能是當mpi_send通過這個過程被稱爲,沒有其他進程可以使用mpi_send功能,因爲它的工作?

回答

8

首先:是的,調用程序被「阻塞」,因爲直到消息被「發送」,MPI_Send調用纔會返回。

第二:MPI_Recv也是一個「阻塞」調用,並且直到消息被「接收」纔會返回。

一些額外的信息:

MPI_SEND是一種「堵」的呼叫,因爲直到該消息已發送的通話將無法控制返回給調用者。而「發送」的定義是保存消息的用戶緩衝區可以安全地重用。不能保證已收到該消息,或者甚至在遠程排名中已經達到了MPI_Recv呼叫。 (確切的行爲是依賴於實現的RDMA樣式互連導致大多數問題與「黑盒子內部」行爲的確切問題有關。)

MPI_Isend是一個「非阻塞」調用。控制將立即返回到調用程序...但是在程序調用MPI_Test或MPI_Wait來確認消息已被「發送」之前,緩衝區不能被重用。

「阻塞」調用的目的是爲調用程序提供一個肯定的確認,即持有該消息的緩衝區可以被重用(在MPI_Send的情況下)或可靠地讀取和修改(在MPI_Recv的情況下) 。如果使用「非阻塞」(例如MPI_Isend,MPI_Irecv)調用,調用程序可以繼續執行計算,但不能可靠地(或合法地)更改消息緩衝區,直到調用MPI_Wait或MPI_Test來完成消息事務。

3

對上一個問題的回答是否定的:某些進程可能被阻塞,等待發送或接收完成而其他進程正在執行。阻止呼叫僅在調用它們的進程中阻塞。