2010-01-13 27 views
0

我想在Windows上使用MPI(MPICH2)。我寫這個命令:MPI Barrier C++

MPI_Barrier(MPI_COMM_WORLD); 

而且我希望它阻止所有處理器,直到所有組成員都調用它。但這不會發生。我添加一個示意性的我的代碼:

int a; 
if(myrank == RootProc) 
    a = 4; 
MPI_Barrier(MPI_COMM_WORLD); 
cout << "My Rank = " << myrank << "\ta = " << a << endl; 

(帶2處理器:)根處理器(0)正確地起作用,但與秩1的處理器不知道a變量,所以它顯示-858993460代替4

任何人都可以幫助我嗎?
Regards

回答

6

你只有在過程中0分配a MPI不共享內存,所以如果你想在進程1的a拿到4的值,你需要調用從進程0 MPI_SendMPI_Recv從過程1

+0

謝謝。這是真的,但我有另一個問題。據我所知,在所有組成員調用它之前,屏障阻止調用者,但是我測試並看到進程1傳遞此函數(通過編寫句子cout)和根進程(0)在屏障之前。有什麼問題?謝謝 – aryan 2010-01-13 21:35:15

+0

你不能相信來自不同進程的輸出語句的順序。如果您不確定,請確保您的時鐘同步並在屏障之前和之後輸出'time()'。 – eduffy 2010-01-14 01:57:54

+0

不要指望不同處理器上的時鐘處於如此接近的同步狀態,以至於它們報告的時間允許您正確地對輸出語句進行排序。 MPI_Barrier同步進程,而不是時鐘。 – 2010-01-14 02:31:20

1

變量a未初始化 - 這可能是它顯示該數字的原因。在MPI中,變量a在進程之間重複 - 因此a有兩個值,其中之一未初始化。你想寫:

int a = 4; 
if (myrank == RootProc) 
... 

,或者,做根(ID 0)的MPI_send,並在從(ID 1),所以在根值的MPI_recv也被設置在從。

注意:該代碼會在我的腦海中觸發一個小警報,所以我需要檢查一些內容,然後使用更多信息編輯它。但在此之前,未初始化的值對你來說肯定是一個問題。 好的我檢查了事實 - 你的代碼沒有正確縮進,我錯過了缺失的{}。現在屏障看起來很好,儘管您發佈的代碼段並沒有做太多的工作,並且不是一個很好的屏障示例,因爲從屬服務器直接輸入它,而根目錄會將該變量的值設置爲4,然後輸入它。爲了測試它是否真正起作用,您可能需要某個進程中的某種睡眠機制 - 這會讓另一個進程產生(希望這是正確的術語),從而阻止它在打印完睡眠之前打印cout

1

阻塞是不夠的,你必須發送數據到其他進程(內存在進程之間不共享)。

在所有進程共享數據使用

你的情況
int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) 

這樣:

MPI_Bcast(&a, 1, MPI_INT, 0, MPI_COMM_WORLD); 

在這裏你發送一個整數由&形式進程0所有其他指出。 // MPI_Bcast爲根過程發送器和非根進程接收機

您還可以通過一些數據發送到specyfic過程:

int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, 
       int tag, MPI_Comm comm) 

,然後通過接收:

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)