2012-06-13 43 views
2

我有一個程序,其中有一個主/從設置,並且我有一些功能實現了向主設備發送不同類型的數據到從設備。有些功能會發送給各個從站,但有些功能會通過MPI_Bcast向所有從站發送信息。MPI_Bcast或MPI_Send的探測器

我想在從站只有一個接收函數,所以我想知道我是否可以探測一條消息,並知道它是作爲普通阻塞消息廣播還是發送,因爲有不同的方法來接收被播出,並正常發送。

回答

4

不,您無法決定是否根據探測呼叫調用Bcast或Recv。

MPI_Bcast調用是一個集體操作 - 所有MPI任務都必須參與。因此,這些不像點對點的交流;他們利用所有進程都參與進行更高階優化的事實。

由於集體操作意味着如此多的同步,所以只允許其他任務檢查是否應該開始參與集體是沒有意義的;這是必須構建到程序邏輯中的東西。

  • 根進程在廣播中的角色不像發送;一般來說,它不能通過調用MPI_Bcast然後繼續。實施幾乎肯定會阻止,直到其他一些進程參與廣播;和

  • 其他進程在廣播中的角色不像接收消息;一般來說,它將同時接收和發送信息。因此參與廣播與進行簡單的Recv呼叫不同。

所以探頭將無法工作; the documentation for MPI_Probe相當清楚,它返回關於下一個MPI_Recv會發生什麼的信息,並且Recv是與Bcast不同的操作。

您可以在MPI 3.0中獲得一些您想要的內容,現在正在定稿,這允許非阻塞集體 - 例如MPI_Ibcast。在這種情況下,您可以啓動廣播並調用MPI_Test來檢查請求的狀態。然而,即使在這裏,每個人都需要先打電話給MPI_Ibcast;這只是允許集體和點對點通信更容易交錯。

+0

感謝您的迴應!我想我可以通過發送一個阻止信息給廣播前的所有從屬設備來解決這個問題,這個標記告訴接收功能「準備」廣播。我正在將一個項目從PVM遷移到MPI,並且在PVM中他們有一個名爲pvm_mcast的函數,它的行爲與MPI_Bcast類似,但您可以通過非阻塞接收來接收它,只是在MPI中出現類似情況時纔會流浪。我會讀一些關於無阻塞的集體。 – Gumeo

+1

'pvm_mcast'與'MPI_Bcast'不同。它是一個多播操作,而不是廣播操作,其語義與發出多個MPI_Send操作時的相似。它允許您將數據發送到任意子進程,而'MPI_Bcast'將數據發送到_all_進程並允許進行更高級別的優化。如果原始代碼沒有使用'pvm_mcast'來執行完整的廣播,那麼最好使用一堆'MPI_Isend',然後是'MPI_Waitall'。然後你就可以探索。 –

+0

謝謝,我想我已經完全理解了pvm_mcast的概念,並且它的功能與MPI_Bcast相比。 – Gumeo