2014-03-27 67 views
0

我使用OpenMPI和OpenMP(共享內存)來並行化一段代碼。我正在嘗試爲基準測試和加速目的計算代碼,但我不明白omp_get_wtime()和mpi_wtime()之間的差異。當同時使用MPI和共享內存時,omp_get_wtime()和mpi_wtime()之間的區別

這裏是我的代碼不會隨着架構在運行上的輪廓:

我有8個節點,每個有16個處理器。我有128個任務要運行。

我正在測試兩種情況,我想知道哪種情況更快。

第一種場景: 我給每個節點1/8的任務(使用OpenMPI),並且對於每個任務,節點使用其16個處理器(使用OpenMP)來完成任務。所以Node0會做Task0,當Task0完成時它會做Task8,當Task8完成時它會做Task16;同時節點1將執行任務1,然後任務9,然後任務15等,直到每個任務完成。我想知道整個過程需要多長時間,並且知道每個任務需要多長時間才能完成(平均而言)會很高興。

第二個場景:我將128個任務中的每個任務放在單個處理器上(使用MPI)。我只想知道這需要多長時間才能運行,並且再次瞭解每個處理器完成其工作需要多長時間會很高興。

基本上我在這裏做的是比較MPI + OpenMP與使用MPI進行比較的方式。

我應該使用哪個計時器,兩者之間有什麼區別?

謝謝!

回答

2

omp_get_wtime()MPI_WTIME之間沒有本質區別。兩者都是亞秒級的精確掛鐘定時器,可以返回自過去某點以來的時間。

double tmr = MPI_Wtime(); 
... 
// routine to be timed 
... 
tmr = MPI_Wtime() - tmr; 
// tmr now holds the elapsed time in seconds 

兩個功能是局部的,例如:二者也通過反覆調用它們,減去值,例如:

double tmr = omp_get_wtime(); 
... 
// routine to be timed 
... 
tmr = omp_get_wtime() - tmr; 
// tmr now holds the elapsed time in seconds 

或使用相同的方法他們測量調用代碼執行的節點上的時間。允許跨所有節點同步MPI_WTIME,但很少有實現可以這樣做。它們在所有其他方面應該相當一致,並提供相似的精度(並且在大多數平臺上通常都使用相同的OS特定的定時器例程來實現)。絕對不能保證兩個定時器在過去具有相同的參考點,因此不應該混合它們,例如,以下是無效代碼:

double tmr = MPI_Wtime(); 
... 
tmr = omp_get_wtime() - tmr; 
// tmr now holds the elapsed time in seconds + possibly a constant difference 

我會用最好的MPI_WTIME取決於omp_get_wtime()在具有啓用OpenMP的。如果您允許您的程序編譯爲純MPI和混合MPI + OpenMP,那麼最好不要對OpenMP運行時庫進行很多(或任何)調用,或者您必須爲該案例提供存根實現當OpenMP未啓用時。當然,用於混合代碼的存根omp_get_wtime()需要一個預處理器宏:

#define omp_get_wtime MPI_Wtime 
相關問題