2013-07-10 48 views
1

據我所知,這是用來使所有的進程在同一水平。 我需要找到一個openMPI程序的總體處理時間(所有處理完成的時間),所以我認爲最後放置一個MPI_Barrier(),然後在最後打印MPI_Wtime()-t將打印所有處理的時間完成。MPI_Barrier()的行爲?

 MPI_stuff;//whatever i want my program to do 
     MPI_Barrier(MPI_COMM_WORLD); 
     cout << "final time ::: :: " << MPI_Wtime()-t << rank << endl; 
     MPI_Finalize(); 

但時間時,我使用MPI_Barrier()比個別處理的情況下非常不同MPI_Wtime()-t

+0

時代有多少?你能向我們展示你正在討論的其他版本的代碼嗎? –

回答

3

這是很容易爲MPI進程在時間變得desynchronised,特別是如果涉及的算法MPI_stuff不是全局同步的。對於大多數集羣MPI實施來說,非常典型的情況是,由於啓動時間不同以及事實上可能需要不同的時間,所以從一開始就進程非常不同步。另一個去同步的來源是OS噪聲,即偶爾與MPI作業中的某些進程共享CPU時間的其他進程。

這就是爲什麼來衡量並行算法的執行時間,正確的做法是把一個屏障以前後測量塊:

MPI_Barrier(MPI_COMM_WORLD); // Bring all processes in sync 
t = -MPI_Wtime(); 
MPI_stuff; 
MPI_Barrier(MPI_COMM_WORLD); // Wait for all processes to finish processing 
t += MPI_Wtime(); 

如果第一MPI_Barrier缺失和MPI_stuff做不同步不同的流程,可能會發生這樣的情況:其中一些很早就到達下一個屏障,而另一些則很晚纔到達,然後早期的屏障必須等待後者。

另請注意,MPI_Barrier不保證所有進程都同時退出屏障。它只能保證當所有進程中的執行流程都在MPI_Barrier調用內時有一個時間點。其他一切都依賴於實現。在一些平臺上,特別是IBM Blue Gene,使用特殊中斷網絡實現全球障礙,並實現幾乎完美的同步。在集羣上,障礙通過消息傳遞來實現,因此障​​礙退出時間可能會有很大差異。

+0

http://stackoverflow.com/questions/17820445/openmpi-hello-world-on-cluster –

+0

嘿,關於MPI_Barrier,你有任何想法爲什麼它的行爲如此http://stackoverflow.com/questions/ 29757817 /阻擋-MPI壘時 - 無規 - 從-LXC的容器 – AlexandruC