我使用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);
}
雖然運行2個進程明顯較慢。 MPI_Wtime報告的執行時間遠遠小於實時匹配的感知執行時間。 – bwdm
你在代碼中集體操作嗎?因爲在忙碌的等待中我無法重現您的問題:https://pastebin.com/vzA8qUL7 – Taknok
是的,但即使在刪除集體後,我也遇到了問題。 – bwdm