Процессы вращаются, ожидая синхронизации MPI-IO на MPI_File_open

У меня есть некоторая настройка, в которой все процессы получают последовательный кусок работы, и я хочу сохранить весь вывод вместе в конце как один файл, например следующий:

int start_ind = split_work(mpi_rank, mpi_size), end_ind = split_work(mpi_rank+1, mpi_size);
vector<double> results;
for(int i=start_ind; i<end_ind; i++){
    results[i] = do_work(i);
}

MPI_File handler;
MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &handler);
MPI_Status status;
MPI_File_write_at(handler, start_ind*sizeof(double), results.data()+start_ind,
                  end_ind - start_ind, MPI_DOUBLE, &status);
MPI_File_close(&handler);

Однако иногда работа не сбалансирована, и половина процессов может закончить свое рабочее время раньше другой половины. Насколько я могу судить, эти процессы продолжают вращаться, используя 100% ЦП в течение нескольких часов, пока все процессы не достигнут MPI_File_open. Это явно нежелательно. Какова наилучшая практика для такого случая, если я хочу, чтобы вывод был одним файлом?


person aCheese    schedule 21.11.2019    source источник


Ответы (1)


Я нашел ответ на этот вопрос, который решает мою проблему. С OpenMPI работает

mpirun -np N --mca mpi_yield_when_idle 1 ./a.out

дает любой процесс, ожидающий блокирующего действия. Это происходит за счет увеличения задержки для межпроцессного взаимодействия, но это не проблема для моего варианта использования, который не отправляет никаких сообщений во время выполнения вычислений.

person aCheese    schedule 03.12.2019