Вопрос по c, mpi, abort – Изящно выход с MPI

2

Я пытаюсь корректно выйти из моей программы после того, как 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, не печатая это огромное сообщение об ошибке?

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

Ваш Ответ

1   ответ
11

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

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

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

   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, но это не то, что вы здесь делаете, так что у вас все хорошо.

В конце строки fprintf должна быть точка с запятой.
Спасибо, @ JC1. Исправлена.
Спасибо, это работает, но он возвращает & quot; mpirun заметил, что задание было прервано, но не имеет информации о процессе, который вызвал эту ситуацию. & Quot; я думаю, что это сообщение по умолчанию MPI, я использую Open MPI Fabricio
В этом случае не все процессы MPI попали в Finalize / exit одновременно в другом месте. Это не должно быть необходимым, но поставьте барьер после трансляции и посмотрите, не является ли это просто вопросом синхронизации или каких-то процессов на самом деле где-то застряли.

Похожие вопросы