Как запустить одну и ту же программу MPI несколько раз
У меня есть программа MPI для расчета времени сортировки. Я запускаю это с mpirun -np 2 mpiSort
, Так что это дает мне время сортировки по 2 процессам.
Я хочу получить время сортировки в 5 раз, чтобы усреднить их. Как мне сделать это автоматически?
Если я сделаю цикл в mpiSort
программа. На самом деле он выполняется 5(раз) х 2(процессы) = 10 раз.
Изменить: mpiSort
делает сортировку параллельно. В основном я пытаюсь сделать mpirun -np 2 mpiSort
без ввода 5 раз. Потому что я хочу сделать то же самое для 4 ядер, 8 ядер.
2 ответа
Цикл это путь. Я был смущен, потому что я получил 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();
Вы можете работать на пяти ядрах, используя 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
каждый процесс сортирует время.