我有一個MPI程序來計算排序時間。我用mpirun -np 2 mpiSort
運行它。所以這給了我2個過程的排序時間。如何多次運行相同的MPI程序
我想要5次的排序時間來平均它們。我該如何自動做到這一點?
如果我在mpiSort
程序中做循環。它實際執行5(次)×2(進程)= 10次。
編輯:mpiSort
並行排序。基本上,我試圖做mpirun -np 2 mpiSort
而不輸入5次。因爲我想爲4核心,8核心做同樣的事情。
我有一個MPI程序來計算排序時間。我用mpirun -np 2 mpiSort
運行它。所以這給了我2個過程的排序時間。如何多次運行相同的MPI程序
我想要5次的排序時間來平均它們。我該如何自動做到這一點?
如果我在mpiSort
程序中做循環。它實際執行5(次)×2(進程)= 10次。
編輯:mpiSort
並行排序。基本上,我試圖做mpirun -np 2 mpiSort
而不輸入5次。因爲我想爲4核心,8核心做同樣的事情。
您可以使用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
其中在每個進程的排序時間。
放入循環是要走的路。我很困惑,因爲我得到了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();
是的,它在開頭有MPI_init。我認爲你的代碼要麼通過不同的單核進行5次排序,要麼通過5次核心進行排序?但是我想用5個核心完成排序時間。 – lucahuy
對不起,我不確定我是否理解,你可以發佈一個簡單的代碼來清楚說明嗎?他們平行排列嗎?使用MPI,每個內核作爲一個單獨的實例運行,同時使用MPI命令進行通信。上面的代碼模擬了5個獨立的排序實例(用函數替換時間= 0.5)的運行,它將在5個內核上同時運行,然後進行通信以獲得所有5個內核的平均值。 –
爲什麼不運行mpirun -np 2 mpiSort五次,如果這是您想要的,則取可執行文件的平均時間?請注意,整個MPI可執行文件將同時在您用'mpirun -np'指定的核心數量上運行,與openMP不同的是,您只需簡單地在一個節中多線程。 –