Как запустить одну и ту же программу MPI несколько раз

У меня есть программа MPI для расчета времени сортировки. Я запускаю его с помощью mpirun -np 2 mpiSort. Так что это дает мне время сортировки по 2 процессам.

Я хочу получить время сортировки в 5 раз, чтобы усреднить их. Как мне сделать это автоматически?

Если я делаю цикл в программе mpiSort. На самом деле он выполняется 5 (раз) x 2 (процессы) = 10 раз.

Редактировать: mpiSort выполняет сортировку параллельно. По сути, я пытаюсь сделать mpirun -np 2 mpiSort, не набирая его 5 раз. Потому что я хочу сделать то же самое для 4 ядер, 8 ядер.


person lucahuy    schedule 04.11.2016    source источник


Ответы (2)


Вы можете работать на пяти ядрах, используя 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 — время сортировки каждого процесса.

person Ed Smith    schedule 04.11.2016
comment
Да, в начале стоит MPI_init. Я думаю, что ваш код либо выполняет сортировку по одному ядру 5 раз, либо по 5 ядрам одновременно? Но я хочу, чтобы время сортировки выполнялось 2 ядрами 5 раз. - person lucahuy; 04.11.2016
comment
Извините, я не уверен, что понимаю, можете ли вы опубликовать минимальный код, чтобы это было понятно? Они сортируются параллельно? С MPI каждое ядро ​​работает как отдельный экземпляр одновременно, а связь между ними становится возможной с помощью команд MPI. Вышеприведенный код моделирует запуск 5 отдельных экземпляров сортировки (замените время = 0,5 на функцию), которые будут выполняться одновременно на 5 ядрах с последующим обменом данными, чтобы получить среднее значение по всем пяти. - person Ed Smith; 04.11.2016
comment
Почему бы просто не запустить mpirun -np 2 mpiSort пять раз и взять среднее время выполнения исполняемого файла, если это то, что вам нужно? Обратите внимание, что весь исполняемый файл MPI будет работать одновременно на количестве ядер, указанном вами с помощью mpirun -np, в отличие, скажем, от openMP, где вы просто выполняете многопоточность в разделе. - person Ed Smith; 04.11.2016
comment
Я отредактировал вопрос. Я постараюсь опубликовать упрощенный код позже. - person lucahuy; 04.11.2016

Положить в петлю - это путь. Я был сбит с толку, потому что у меня было 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();
person lucahuy    schedule 09.11.2016