Как запустить одну и ту же программу 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 каждый процесс сортирует время.

Другие вопросы по тегам