Изящный выход с MPI

Я пытаюсь изящно выйти из своей программы после того, как Rdinput вернет ошибку.

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

#define MASTER 0
#define Abort(x) MPI_Abort(MPI_COMM_WORLD, x)
#define Bcast(send_data, count, type) MPI_Bcast(send_data, count, type, MASTER, GROUP) //root --> MASTER
#define Finalize() MPI_Finalize()

int main(int argc, char **argv){

  //Code

  if( rank == MASTER ) {
    time (&start);
    printf("Initialized at %s\n", ctime (&start) );      
    //Read file
    error = RdInput();
  }

  Bcast(&error, 1, INT); Wait();

  if( error = 1 ) MPI_Abort(1);

  //Code

  Finalize();
}

Вывод программы:

mpirun -np 2 code.x 
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD 
with errorcode 1.

NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.
--------------------------------------------------------------------------
Initialized at Wed May 30 11:34:46 2012
Error [RdInput]: The file "input.mga" is not available!
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 7369 on
node einstein exiting improperly. There are two reasons this could occur:

//More error message.

Что я могу сделать, чтобы изящно выйти из программы MPI, не печатая это огромное сообщение об ошибке?


person Fabricio    schedule 30.05.2012    source источник
comment
Где вы спрятали mpi_init?   -  person High Performance Mark    schedule 30.05.2012
comment
Весь код, которым вы поделились, не имеет отношения к проблеме. Весь код, который имеет отношение к проблеме, отсутствует. Мы не знаем, как вы инициализируете или завершаете MPI, и мы даже не знаем, где определяется rank или как вы его заполняете. Сейчас похоже, что MPI даже не инициализирован.   -  person ArjunShankar    schedule 30.05.2012
comment
Совершенно не по теме предложение: подумайте о том, чтобы отказаться от большого баннера. У вас может быть такой переключатель, как --help, и вы можете включать список авторов при печати справочной информации, или вы можете включить список авторов на страницу man вашей программы. Кто-то может захотеть использовать вывод вашей программы в сценарии, и тогда баннер будет головной болью. - В качестве примера представьте, что произойдет, если программа cat начнет печатать баннер всякий раз, когда вы просите ее cat файл.   -  person ArjunShankar    schedule 30.05.2012
comment
Баннер довольно распространен в начале работы научного программного обеспечения, особенно если он печатает номера версий или подробности запуска, чтобы эта информация затем сохранялась в выводе программы.   -  person Jonathan Dursi    schedule 30.05.2012


Ответы (1)


Если у вас есть эта логика в вашем коде:

Bcast(&error, 1, INT);
if( error = 1 ) MPI_Abort(1); 

тогда вы почти закончили (хотя вам не нужно ждать после трансляции). Хитрость, как вы обнаружили, заключается в том, что MPI_Abort() не делает "изящный"; в основном он предназначен для того, чтобы закрыть все любым возможным способом, когда что-то пошло не так.

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

   MPI_Bcast(&error, 1, MPI_INT, MASTER, MPI_COMM_WORLD);
   if (error != 0) {
       if (rank == 0) {
           fprintf(stderr, "Error: Program terminated with error code %d\n", error);
       }
       MPI_Finalize();
       exit(error);
   } 

Было бы ошибкой вызывать MPI_Finalize() и продолжать использовать MPI, но это не то, что вы здесь делаете, так что все в порядке.

person Jonathan Dursi    schedule 30.05.2012
comment
Спасибо, это работает, но он возвращает, что mpirun заметил, что задание прервано, но не имеет информации о процессе, вызвавшем эту ситуацию. я думаю, что это сообщение MPI по умолчанию, я использую Open MPI - person Fabricio; 31.05.2012
comment
В этом случае не все MPI-процессы одновременно попадали в Finalize/exit в другом месте. В этом нет необходимости, но поставьте барьер после трансляции и посмотрите, не является ли это просто вопросом некоторой рассинхронизации или действительно где-то застряли какие-то процессы. - person Jonathan Dursi; 31.05.2012
comment
В конце строки fprintf должна стоять точка с запятой. - person JC1; 20.06.2017
comment
Спасибо, @JC1. Исправлено. - person Jonathan Dursi; 20.06.2017