2016-11-04 48 views
0

我有一個MPI程序來計算排序時間。我用mpirun -np 2 mpiSort運行它。所以這給了我2個過程的排序時間。如何多次運行相同的MPI程序

我想要5次的排序時間來平均它們。我該如何自動做到這一點?

如果我在mpiSort程序中做循環。它實際執行5(次)×2(進程)= 10次。

編輯:mpiSort並行排序。基本上,我試圖做mpirun -np 2 mpiSort而不輸入5次。因爲我想爲4核心,8核心做同樣的事情。

回答

0

您可以使用mpirun -np 5 mpiSort在五個內核上運行,並在最後添加一個MPI_gather。實際使用MPI的排序代碼(即在開始時調用MPI_init?)。假設你是,可以在5個核上運行並簡單地平均在端部具有減小,

# include <mpi.h> 
#include <iostream> 
using namespace std; 

int main (int argc, char *argv[]) 
{ 

    int ierr, rank, nprocs, root=0; 
    double time, buf; 
    ierr = MPI_Init (&argc, &argv); 
    ierr = MPI_Comm_rank (MPI_COMM_WORLD, &rank); 
    ierr = MPI_Comm_size (MPI_COMM_WORLD, &nprocs); 
    time = 0.5; 
    ierr = MPI_Reduce (&time, &buf, 1, MPI_DOUBLE_PRECISION, 
          MPI_SUM, root, MPI_COMM_WORLD); 
    if (rank == root){ 
     buf = buf/nprocs; 
     cout << buf << "\n"; 
    } 

    MPI_Finalize (); 

} 

time其中在每個進程的排序時間。

+0

是的,它在開頭有MPI_init。我認爲你的代碼要麼通過不同的單核進行5次排序,要麼通過5次核心進行排序?但是我想用5個核心完成排序時間。 – lucahuy

+0

對不起,我不確定我是否理解,你可以發佈一個簡單的代碼來清楚說明嗎?他們平行排列嗎?使用MPI,每個內核作爲一個單獨的實例運行,同時使用MPI命令進行通信。上面的代碼模擬了5個獨立的排序實例(用函數替換時間= 0.5)的運行,它將在5個內核上同時運行,然後進行通信以獲得所有5個內核的平均值。 –

+0

爲什麼不運行mpirun -np 2 mpiSort五次,如果這是您想要的,則取可執行文件的平均時間?請注意,整個MPI可執行文件將同時在您用'mpirun -np'指定的核心數量上運行,與openMP不同的是,您只需簡單地在一個節中多線程。 –

0

放入循環是要走的路。我很困惑,因爲我得到了10個值endTime = MPI_Wtime(),而我只使用了根進程中的5個值。感謝@EdSmith的MPI_Reduce代碼,正確的計算時間是使用MPI_Reduce的兩個進程的平均值。

MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &nProcs); 

for (int run=0; run<5; run++) { 
    ... 
    endTime = MPI_Wtime(); 
    totalTime = endTime - startTime; 
    MPI_Reduce (&totalTime, &workTime, 1, MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD); 
    if (rank == root) { 
    paraTime = workTime/nProcs; 
    } 
    ... 
} 

MPI_Finalize(); 
相關問題