PAPI  5.0.1.0
mpifirst.c
Go to the documentation of this file.
00001 /* This file performs the following test: start, read, stop and again functionality
00002 
00003    - It attempts to use the following three counters. It may use less depending on
00004      hardware counter resource limitations. These are counted in the default counting
00005      domain and default granularity, depending on the platform. Usually this is 
00006      the user domain (PAPI_DOM_USER) and thread context (PAPI_GRN_THR).
00007      + PAPI_FP_INS or PAPI_TOT_INS if PAPI_FP_INS doesn't exist
00008      + PAPI_TOT_CYC
00009    - Start counters
00010    - Do flops
00011    - Read counters
00012    - Reset counters
00013    - Do flops
00014    - Read counters
00015    - Do flops
00016    - Read counters
00017    - Do flops
00018    - Stop and read counters
00019    - Read counters
00020 */
00021 
00022 #include "papi_test.h"
00023 
00024 extern int TESTS_QUIET;                /* Declared in test_utils.c */
00025 
00026 int
00027 main( int argc, char **argv )
00028 {
00029     int retval, num_tests = 5, num_events, tmp;
00030     long long **values;
00031     int EventSet = PAPI_NULL;
00032     int PAPI_event, mask;
00033     char event_name[PAPI_MAX_STR_LEN], add_event_str[PAPI_MAX_STR_LEN];
00034 
00035 
00036     tests_quiet( argc, argv );  /* Set TESTS_QUIET variable */
00037 
00038     MPI_Init( argc, argv );
00039 
00040     retval = PAPI_library_init( PAPI_VER_CURRENT );
00041     if ( retval != PAPI_VER_CURRENT )
00042         test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
00043 
00044     /* query and set up the right instruction to monitor */
00045     if ( PAPI_query_event( PAPI_FP_INS ) == PAPI_OK ) {
00046         PAPI_event = PAPI_FP_INS;
00047         mask = MASK_FP_INS | MASK_TOT_CYC;
00048     } else {
00049         PAPI_event = PAPI_TOT_INS;
00050         mask = MASK_TOT_INS | MASK_TOT_CYC;
00051     }
00052 
00053     retval = PAPI_event_code_to_name( PAPI_event, event_name );
00054     if ( retval != PAPI_OK )
00055         test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
00056     sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
00057 
00058     EventSet = add_test_events( &num_events, &mask );
00059 
00060     values = allocate_test_space( num_tests, num_events );
00061 
00062     retval = PAPI_start( EventSet );
00063     if ( retval != PAPI_OK )
00064         test_fail( __FILE__, __LINE__, "PAPI_start", retval );
00065 
00066     do_flops( NUM_FLOPS );
00067 
00068     retval = PAPI_read( EventSet, values[0] );
00069     if ( retval != PAPI_OK )
00070         test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00071 
00072     retval = PAPI_reset( EventSet );
00073     if ( retval != PAPI_OK )
00074         test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
00075 
00076     do_flops( NUM_FLOPS );
00077 
00078     retval = PAPI_read( EventSet, values[1] );
00079     if ( retval != PAPI_OK )
00080         test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00081 
00082     do_flops( NUM_FLOPS );
00083 
00084     retval = PAPI_read( EventSet, values[2] );
00085     if ( retval != PAPI_OK )
00086         test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00087 
00088     do_flops( NUM_FLOPS );
00089 
00090     retval = PAPI_stop( EventSet, values[3] );
00091     if ( retval != PAPI_OK )
00092         test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
00093 
00094     retval = PAPI_read( EventSet, values[4] );
00095     if ( retval != PAPI_OK )
00096         test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00097 
00098     remove_test_events( &EventSet, mask );
00099 
00100     if ( !TESTS_QUIET ) {
00101         printf( "Test case 1: Non-overlapping start, stop, read.\n" );
00102         printf( "-----------------------------------------------\n" );
00103         tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
00104         printf( "Default domain is: %d (%s)\n", tmp,
00105                 stringify_all_domains( tmp ) );
00106         tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
00107         printf( "Default granularity is: %d (%s)\n", tmp,
00108                 stringify_granularity( tmp ) );
00109         printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
00110         printf
00111             ( "-------------------------------------------------------------------------\n" );
00112 
00113         printf( "Test type   : \t1\t\t2\t\t3\t\t4\t\t5\n" );
00114         sprintf( add_event_str, "%s : ", event_name );
00115         printf( TAB5, add_event_str,
00116                 ( values[0] )[0], ( values[1] )[0], ( values[2] )[0],
00117                 ( values[3] )[0], ( values[4] )[0] );
00118         printf( TAB5, "PAPI_TOT_CYC: ", ( values[0] )[1], ( values[1] )[1],
00119                 ( values[2] )[1], ( values[3] )[1], ( values[4] )[1] );
00120         printf
00121             ( "-------------------------------------------------------------------------\n" );
00122 
00123         printf( "Verification:\n" );
00124         printf( "Column 1 approximately equals column 2\n" );
00125         printf( "Column 3 approximately equals 2 * column 2\n" );
00126         printf( "Column 4 approximately equals 3 * column 2\n" );
00127         printf( "Column 4 exactly equals column 5\n" );
00128     }
00129 
00130     {
00131         long long min, max;
00132         min = ( long long ) ( values[1][0] * .9 );
00133         max = ( long long ) ( values[1][0] * 1.1 );
00134 
00135         if ( values[0][0] > max || values[0][0] < min ||
00136              values[2][0] > ( 2 * max )
00137              || values[2][0] < ( 2 * min ) || values[3][0] > ( 3 * max )
00138              || values[3][0] < ( 3 * min )
00139              || values[3][0] != values[4][0] ) {
00140             printf( "min: " );
00141             printf( LLDFMT, min );
00142             printf( "max: " );
00143             printf( LLDFMT, max );
00144             printf( "1st: " );
00145             printf( LLDFMT, values[0][0] );
00146             printf( "2nd: " );
00147             printf( LLDFMT, values[1][0] );
00148             printf( "3rd: " );
00149             printf( LLDFMT, values[2][0] );
00150             printf( "4th: " );
00151             printf( LLDFMT, values[3][0] );
00152             printf( "5th: " );
00153             printf( LLDFMT, values[4][0] );
00154             printf( "\n" );
00155             test_fail( __FILE__, __LINE__, event_name, 1 );
00156         }
00157 
00158         min = ( long long ) ( values[1][1] * .9 );
00159         max = ( long long ) ( values[1][1] * 1.1 );
00160         if ( values[0][1] > max || values[0][1] < min ||
00161              values[2][1] > ( 2 * max )
00162              || values[2][1] < ( 2 * min ) || values[3][1] > ( 3 * max )
00163              || values[3][1] < ( 3 * min )
00164              || values[3][1] != values[4][1] ) {
00165             test_fail( __FILE__, __LINE__, "PAPI_TOT_CYC", 1 );
00166         }
00167     }
00168     test_pass( __FILE__, values, num_tests );
00169 
00170     MPI_Finalize(  );
00171     exit( 1 );
00172 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines