2017-08-14 65 views
0

我使用C和OpenMPI實現了MIMD遺傳算法,其中每個進程都照顧獨立的子羣(島模型)。因此,對於規模爲200的人口,1個過程運行在整個人口中,而2個過程演變100個人口。MPI_Wtime與實際掛牆時間之間的區別

因此,通過使用MPI_Wtime來測量執行時間,我得到了預期的執行時間通過使用ubuntu運行在2核機器上。然而,它並不同意ubuntu的時間命令和感知:很明顯,由於某種原因,運行2個進程需要更長的時間。

$time mpirun -n 1 genalg 
execution time: 0.570039 s (MPI_Wtime) 

real 0m0.618s 
user 0m0.584s 
sys  0m0.024s 


$time mpirun -n 2 genalg 
execution time: 0.309784 s (MPI_Wtime) 

real 0m1.352s 
user 0m0.604s 
sys  0m0.064s 

對於較大的人口(4000),我得到如下:

$time mpirun -n 1 genalg 
execution time: 11.645675 s (MPI_Wtime) 

real 0m11.751s 
user 0m11.292s 
sys  0m0.392s 


$time mpirun -n 2 genalg 
execution time: 5.872798 s (MPI_Wtime) 

real 0m8.047s 
user 0m11.472s 
sys  0m0.380s 

我得到了類似的結果是否有進程或不之間的通信,並且還試圖MPI_Barrier。也得到了與gettimeofday相同的結果,並打開或關閉gcc優化沒有太大的區別。

可能發生了什麼?它應該運行2個進程更快,如MPI_Wtime暗示,但實際上它運行速度較慢,匹配實時

更新:我在另一臺PC上運行它,並沒有這個問題。

代碼:

void runGA(int argc,char* argv[]) 
{ 
    (initializations) 

    if(MYRANK == 0) 
     t1 = MPI_Wtime(); 

    genalg(); 
    Individual* ind = best_found(); 
    MPI_Barrier(MPI_COMM_WORLD); 
    if(MYRANK != 0) 
     return; 

    t2 = MPI_Wtime(); 
    exptime = t2-t1; 

    printf("execution time: %f s\n",exptime); 
} 

回答

0

升級Ubuntu Mate 15.10到16.04之後,OpenMPI版本1.10.2(前一版本是1.6.5)出現了問題。

0

我的猜測(和her/his)是time給由所有內核使用時間的總和。這更像是一種成本:你在2個核心上有2個進程,所以成本時間是time1 + time2,因爲第二個核心可以用於另一個進程,所以這次在這個第二個核心上「丟失」了。 MPI_Wtime()顯示人類的實際花費時間。

這也許可以解釋爲什麼在第二種情況下,實際時間低於用戶時間。 real時間更接近MPI時間總和用戶 ans sys。在第一種情況下,初始化時間花費很多時間,可能會導致結果錯誤。

+0

雖然運行2個進程明顯較慢。 MPI_Wtime報告的執行時間遠遠小於實時匹配的感知執行時間。 – bwdm

+0

你在代碼中集體操作嗎?因爲在忙碌的等待中我無法重現您的問題:https://pastebin.com/vzA8qUL7 – Taknok

+0

是的,但即使在刪除集體後,我也遇到了問題。 – bwdm

相關問題