2012-07-04 64 views
-1

我試圖使用MPI(MPMD通信)來溝通兩個不同的進程。其中一個使用GLUT來渲染一些基於另一個進程發送的數據而生成的數據。Glut + MPI_Send,實際上並沒有阻止

我的問題是,在初始化階段,「消費者」(使用GLUT的人)將某些配置數據發送到「生產者」,但似乎MPI_Send調用沒有被阻止。例如,我從消費者向生產者發送4條不同的消息,每條消息都有不同的標籤。它似乎工作正常。然後我評論第一個MPI_Send,而不改變另一個進程的代碼(這意味着它們都不應該分別超過第一個MPI_Send和MPI_Recv)。問題在於發送者發送了所有這三個消息,並且似乎每個MPI_Send都返回MPI_SUCCESS,因爲在每個MPI_Send打印消息對應的正確進化之後我做了測試。同時,接收器不會進步。

我試圖在簡單的應用程序中重現此行爲,沒有GLUT,他們的工作。但與此同時,我認爲沒有理由讓GLUT引起這個問題。你有什麼建議嗎?

在此先感謝。

回答

1

我剛剛發現MPI_Send不能保證阻塞,如1所述,所以爲了獲得所需的行爲,我應該使用MPI_Ssend來代替。

+0

您錯誤地將_synchronous behaviour_與_blocking_相混淆。 –

1

您誤讀了阻塞MPI發送模式的語義。這裏的阻塞意味着操作塊直到消息數據及其信封已被安全地存儲並且數據緩衝區可自由修改。相反,非阻塞操作(MPI_I...)立即返回控制權,但要求在操作仍在進行中時不要修改數據緩衝區。

MPI_Send是標準的阻塞發送操作。它可以被實施爲同步阻塞發送(MPI_Ssend)不返回,直到接收操作已經開始或作爲內部緩衝阻塞發送(類似於MPI_Bsend),該消息數據複製到一個小的內部緩衝器並返回控制。標準沒有定義標準發送是如何實現的。大多數實現緩衝幾條短消息。

相關問題