Closes trac:2158.
Special-case the before MPI_INIT / after MPI_FINALIZE error messages so that they can be a bit more clear than the general "an error occurred" messages that are displayed in the middle of MPI jobs. This is not really a "bug fix", but it is helpful for usability. I leave it up to the v1.4 RM's to decide if they want it for the 1.4 series or not. This commit was SVN r22382. The following Trac tickets were found above: Ticket 2158 --> https://svn.open-mpi.org/trac/ompi/ticket/2158
Этот коммит содержится в:
родитель
86d8356b13
Коммит
8f824177cd
@ -163,6 +163,11 @@ static void out(char *str, char *arg)
|
||||
/*
|
||||
* Use orte_show_help() to aggregate the error messages (i.e., show it
|
||||
* once rather than N times).
|
||||
*
|
||||
* Note that this function will only be invoked for errors during the
|
||||
* MPI application (i.e., after MPI_INIT and before MPI_FINALIZE). So
|
||||
* there's no need to handle the pre-MPI_INIT and post-MPI_FINALIZE
|
||||
* errors here.
|
||||
*/
|
||||
static void backend_fatal_aggregate(char *type,
|
||||
struct ompi_communicator_t *comm,
|
||||
@ -207,34 +212,68 @@ static void backend_fatal_aggregate(char *type,
|
||||
}
|
||||
|
||||
/*
|
||||
* THESE MESSAGES ARE COORDINATED WITH FIXED STRINGS IN
|
||||
* help-mpi-errors.txt! Do not change these messages without also
|
||||
* changing help-mpi-errors.txt!
|
||||
* Note that this function has to handle pre-MPI_INIT and
|
||||
* post-MPI_FINALIZE errors, which backend_fatal_aggregate() does not
|
||||
* have to handle.
|
||||
*/
|
||||
static void backend_fatal_no_aggregate(char *type,
|
||||
struct ompi_communicator_t *comm,
|
||||
char *name, int *error_code,
|
||||
va_list arglist)
|
||||
{
|
||||
int len;
|
||||
char *arg;
|
||||
char str[MPI_MAX_PROCESSOR_NAME * 2];
|
||||
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
arg = va_arg(arglist, char*);
|
||||
|
||||
/* Per #2152, print out in plain english if something was invoked
|
||||
before MPI_INIT* or after MPI_FINALIZE */
|
||||
if (!ompi_mpi_initialized) {
|
||||
if (NULL != arg) {
|
||||
out("*** The %s() function was called before MPI_INIT was invoked.\n"
|
||||
"*** This is disallowed by the MPI standard.\n", arg);
|
||||
} else {
|
||||
out("*** An MPI function was called before MPI_INIT was invoked.\n"
|
||||
"*** This is disallowed by the MPI standard.\n"
|
||||
"*** Unfortunately, no further information is available on *which* MPI\n"
|
||||
"*** function was invoked, sorry. :-(\n", NULL);
|
||||
}
|
||||
out("*** Your MPI job will now abort.\n", NULL);
|
||||
} else if (ompi_mpi_finalized) {
|
||||
if (NULL != arg) {
|
||||
out("*** The %s() function was called after MPI_FINALIZE was invoked.\n"
|
||||
"*** This is disallowed by the MPI standard.\n", arg);
|
||||
} else {
|
||||
out("*** An MPI function was called after MPI_FINALIZE was invoked.\n"
|
||||
"*** This is disallowed by the MPI standard.\n"
|
||||
"*** Unfortunately, no further information is available on *which* MPI\n"
|
||||
"*** function was invoked, sorry. :-(\n", NULL);
|
||||
}
|
||||
out("*** Your MPI job will now abort.\n", NULL);
|
||||
}
|
||||
|
||||
else {
|
||||
int len;
|
||||
char str[MPI_MAX_PROCESSOR_NAME * 2];
|
||||
|
||||
/* THESE MESSAGES ARE COORDINATED WITH FIXED STRINGS IN
|
||||
help-mpi-errors.txt! Do not change these messages without
|
||||
also changing help-mpi-errors.txt! */
|
||||
|
||||
/* This is after MPI_INIT* and before MPI_FINALIZE, so print
|
||||
the error message normally */
|
||||
if (NULL != arg) {
|
||||
out("*** An error occurred in %s\n", arg);
|
||||
} else {
|
||||
out("*** An error occurred\n", NULL);
|
||||
}
|
||||
va_end(arglist);
|
||||
|
||||
if (NULL != name && ompi_mpi_initialized && !ompi_mpi_finalized) {
|
||||
/* Don't use asprintf() here because there may be stack / heap
|
||||
corruption by the time we're invoked, so just do it on the
|
||||
stack */
|
||||
if (NULL != name) {
|
||||
/* Don't use asprintf() here because there may be stack /
|
||||
heap corruption by the time we're invoked, so just do
|
||||
it on the stack */
|
||||
str[0] = '\0';
|
||||
len = sizeof(str) - 1;
|
||||
strncat(str, type, len);
|
||||
@ -249,10 +288,6 @@ static void backend_fatal_no_aggregate(char *type,
|
||||
}
|
||||
}
|
||||
out("*** on %s", str);
|
||||
} else if (!ompi_mpi_initialized) {
|
||||
out("*** before MPI was initialized\n", NULL);
|
||||
} else if (ompi_mpi_finalized) {
|
||||
out("*** after MPI was finalized\n", NULL);
|
||||
} else if (NULL == name) {
|
||||
out("*** on a NULL %s\n", type);
|
||||
}
|
||||
@ -269,6 +304,8 @@ static void backend_fatal_no_aggregate(char *type,
|
||||
}
|
||||
out("*** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)\n", NULL);
|
||||
}
|
||||
va_end(arglist);
|
||||
}
|
||||
|
||||
static void backend_fatal(char *type, struct ompi_communicator_t *comm,
|
||||
char *name, int *error_code,
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user