1
1
openmpi/test/simple/bad_arg.c
Aurelien Bouteiller 06c563625a
Add a test for mpi_errors_mpi3 behavior and non-catastrophic errors
Signed-off-by: Aurelien Bouteiller <bouteill@icl.utk.edu>
2020-07-23 05:09:29 -04:00

77 строки
2.2 KiB
C

/*
* Copyright (c) 2020 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <stdio.h>
#include <unistd.h>
#include "mpi.h"
void errhandler(MPI_Comm* comm, int* err) {
int rank, len = 0;
char errstr[MPI_MAX_ERROR_STRING] = {0};
char cname[MPI_MAX_OBJECT_NAME] = {0};
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Error_string(*err, errstr, &len);
MPI_Comm_get_name(*comm, cname, &len);
fprintf(stderr, "Rank %02d: The error handler for %s has been invoked with error %d: %s\n\n", rank, cname, *err, errstr);
}
int main(int argc, char *argv[])
{
int rank, size, i = 5;
MPI_Errhandler errh;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_create_errhandler(errhandler, &errh);
MPI_Comm_set_errhandler(MPI_COMM_WORLD, errh);
MPI_Comm_set_errhandler(MPI_COMM_SELF, errh);
if(0 == rank) {
fprintf(stderr,
"This test will have rank 1 pass an invalid argument to a local MPI call.\n"
"An error handler has been set, so:\n"
" * A high quality implementation should refrain from calling MPI_ERRORS_ARE_FATAL.\n"
" * An MPI-4 compliant implementation should trigger the MPI_COMM_SELF error handler.\n"
" * An MPI-3 compliant implementation should trigger the MPI_COMM_WORLD error handler.\n\n");
}
sleep(1);
if(1 == rank) {
MPI_Type_set_name(MPI_DATATYPE_NULL, "bad type argument");
}
else {
MPI_Type_set_name(MPI_INT, "good type argument");
}
/* The reported error was not 'important' so we expect MPI to remain
* operative */
/* progress for some time to see if some error handler gets called */
while(i-- > 0) {
MPI_Sendrecv_replace(&size, 1, MPI_INT, 0, 0, 0, 0, MPI_COMM_SELF, MPI_STATUS_IGNORE);
sleep(1);
if(0 == rank) fprintf(stderr, "\rWaiting for %2ds", i);
}
if(0 == rank) fprintf(stderr, "\n");
MPI_Barrier(MPI_COMM_WORLD);
fprintf(stderr, "Rank %02d: I have survived till the end of the test.\n", rank);
MPI_Finalize();
return 0;
}