⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errhand.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include <stdio.h>#include "mpi.h"#include "test.h"int verbose = 0;int global_errors = 0;int Test_errorhandling (void);/* This is complicated by the fact that not all systems correctly    implement stdargs (for the ...) declarations).  MPICH uses USE_STDARG   as the choice here, instead of the cases  if defined(__STDC__) || defined(__cplusplus) || defined(HAVE_PROTOTYPES)  */#if defined(USE_STDARG)void handler_a( MPI_Comm *, int *, ...);void handler_b( MPI_Comm *, int *, ...);void error_handler(MPI_Comm *, int *, ...);#elsevoid handler_a ( MPI_Comm *, int * );void handler_b ( MPI_Comm *, int * );void error_handler ( MPI_Comm *, int * );#endif/*    Test the error handers (based on a Fortran test program) */int main( int argc, char **argv ){    MPI_Init( &argc, &argv );    Test_errorhandling();    Test_Waitforall( );    MPI_Finalize();    return 0;}static int a_errors, b_errors;int Test_errorhandling( void ){    char errstring[MPI_MAX_ERROR_STRING];    MPI_Comm dup_comm_world, dummy;    MPI_Comm tempcomm;    MPI_Errhandler errhandler_a, errhandler_b, errhandler, old_handler;    int  err, world_rank, class, resultlen;    int  errs, toterrs;#ifdef FOO    logical test_default, test_abort#endif    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );    MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world );    if (world_rank == 0 && verbose) {	printf( "*** Error Handling ***\n" );    }/*     Exercise save/restore of user error handlers. */    a_errors = 0;    MPI_Errhandler_create(handler_a, &errhandler_a);    MPI_Errhandler_set(dup_comm_world, errhandler_a);    MPI_Errhandler_free(&errhandler_a);    if (verbose) printf( "create with null group 1\n" );    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    if (a_errors != 1) {	Test_Failed( "    error handler A not invoked\n" );	global_errors ++;    }    b_errors = 0;    MPI_Errhandler_create(handler_b, &errhandler_b);    MPI_Errhandler_get(dup_comm_world, &old_handler);    /* The following is needed to preserve an old handler */    MPI_Comm_dup( MPI_COMM_SELF, &tempcomm );    MPI_Errhandler_set( tempcomm, old_handler );    MPI_Errhandler_set(dup_comm_world, errhandler_b);    MPI_Errhandler_free(&errhandler_b);    if (verbose) printf( "create with null group 2\n" );    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    if (b_errors != 1) {	Test_Failed( "    error handler B not invoked\n" );	global_errors++;    }    MPI_Errhandler_set(dup_comm_world, old_handler);    MPI_Comm_free( &tempcomm );    /* MPI_Errhandler_free(&old_handler); */    if (verbose) printf( "create with null group 3\n" );    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    if (a_errors != 2) {	Test_Failed( "    error handler A not re-invoked\n" );	global_errors++;    }/*      Exercise class & string interrogation. */    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL);    if (verbose) 	printf( "    Three error messages (from two errors) are expected\n\which should both show an error class of %d\n", MPI_ERR_GROUP );    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_RETURN);    if (verbose) printf( "create with null group 4\n" );    err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    if (err != MPI_SUCCESS) {	MPI_Error_class(err, &class);	MPI_Error_string(err, errstring, &resultlen);	if (verbose)	    printf( "(first) %d : %s\n", class, errstring );	else if (class != MPI_ERR_GROUP) {	    Test_Failed( "(first) Class is not MPI_ERR_GROUP\n" );	    global_errors++;	}    }    else {	MPI_Comm_free( &dummy );	Test_Failed( "Did not detect error when building communicator\n" );	global_errors++;    }    MPI_Errhandler_create(error_handler, &errhandler);    MPI_Errhandler_set(dup_comm_world, errhandler);    MPI_Errhandler_free(&errhandler);    if (verbose) printf( "create with null group 5\n" );    err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    if (err != MPI_SUCCESS) {	MPI_Error_class(err, &class);	MPI_Error_string(err, errstring, &resultlen);	if (verbose) 	    printf( "(second) %d : %s\n", class, errstring );	else if (class != MPI_ERR_GROUP) {	    Test_Failed( "(second) class was not MPI_ERR_GROUP" );	    global_errors++;	}    }    else {	MPI_Comm_free( &dummy );	Test_Failed( "Did not detect error in building communicator\n" );	global_errors++;    }    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL);#ifdef FOO    if (test_default) {	printf("Forcing error for default handler...\n");	MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);    }    if (test_abort) {	printf( "Calling MPI_Abort...\n" );	MPI_Abort(MPI_COMM_WORLD, 123456768);    }#endif    MPI_Comm_free( &dup_comm_world );#if 0    errs = global_errors;    MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );    if (world_rank == 0) {	if (toterrs == 0) 	    printf( " No Errors\n" );	else	    printf( " Found %d errors\n", toterrs );    }#endif        return 0;}/*  Trivial error handler.  Note that FORTRAN error handlers can't  deal with the varargs stuff the C handlers can.  */#if defined(USE_STDARG)void error_handler(MPI_Comm *comm, int *err, ...)#elsevoid error_handler(MPI_Comm *comm, int *err)#endif{    int class;    int resultlen;    char string[MPI_MAX_ERROR_STRING];        MPI_Error_class(*err, &class);    MPI_Error_string(*err, string, &resultlen);    if (verbose) 	printf( "(errhandler) %d : %s\n", class, string );    else {	if (class != MPI_ERR_GROUP) {	    printf( "(errhandler) class = %d, expected %d (MPI_ERR_GROUP)\n",		    class, MPI_ERR_GROUP );	    printf( "   message %s\n", string );	    global_errors++;	}    }}/*   Error handler A, used for save/restore testing. */#if defined(USE_STDARG)void handler_a( MPI_Comm *comm, int *err, ...)#elsevoid handler_a(MPI_Comm *comm, int err)#endif{    int class;    MPI_Error_class(*err, &class);    if (class != MPI_ERR_GROUP) {	printf( "handler_a: incorrect error class %d\n", class );    }    *err = MPI_SUCCESS;    a_errors++;}/*   Error handler B, used for save/restore testing. */#if defined(USE_STDARG)void handler_b(MPI_Comm *comm, int *err, ...)#elsevoid handler_b(comm, err)MPI_Comm *comm;int      *err;#endif{    int class;    MPI_Error_class(*err, &class);    if (class != MPI_ERR_GROUP) {	printf( "handler_b: incorrect error class %d\n", class );    }    *err = MPI_SUCCESS;    b_errors++;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -