first.c File Reference

Include dependency graph for first.c:

Go to the source code of this file.

Functions

int main (int argc, char **argv)

Variables

int TESTS_QUIET

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 27 of file first.c.

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     long long min, max;
00035 
00036     /* Set TESTS_QUIET variable */
00037     tests_quiet( argc, argv );  
00038 
00039     /* Init PAPI library */
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 
00045     /* add PAPI_TOT_CYC and one of the events in 
00046            PAPI_FP_INS, PAPI_FP_OPS or PAPI_TOT_INS, 
00047            depending on the availability of the event 
00048            on the platform                             */
00049     EventSet = add_two_events( &num_events, &PAPI_event, &mask );
00050 
00051     retval = PAPI_event_code_to_name( PAPI_event, event_name );
00052     if ( retval != PAPI_OK ) {
00053        test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
00054     }
00055     sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
00056 
00057     /* Allocate space for results */
00058     values = allocate_test_space( num_tests, num_events );
00059 
00060     /* Start PAPI */
00061     retval = PAPI_start( EventSet );
00062     if ( retval != PAPI_OK ) {
00063        test_fail( __FILE__, __LINE__, "PAPI_start", retval );
00064     }
00065 
00066     /* Benchmark code */
00067     do_flops( NUM_FLOPS );
00068 
00069     /* read results 0 */
00070     retval = PAPI_read( EventSet, values[0] );
00071     if ( retval != PAPI_OK ) {
00072        test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00073     }
00074 
00075     /* Reset */
00076     retval = PAPI_reset( EventSet );
00077     if ( retval != PAPI_OK ) {
00078        test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
00079     }
00080 
00081     /* Benchmark some more */
00082     do_flops( NUM_FLOPS );
00083 
00084     /* Read Results 1 */
00085     retval = PAPI_read( EventSet, values[1] );
00086     if ( retval != PAPI_OK ) {
00087        test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00088     }
00089 
00090     /* Benchmark some more */
00091     do_flops( NUM_FLOPS );
00092 
00093     /* Read results 2 */
00094     retval = PAPI_read( EventSet, values[2] );
00095     if ( retval != PAPI_OK ) {
00096        test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00097     }
00098 
00099     /* Benchmark some more */
00100     do_flops( NUM_FLOPS );
00101 
00102     /* Read results 3 */
00103     retval = PAPI_stop( EventSet, values[3] );
00104     if ( retval != PAPI_OK ) {
00105        test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
00106     }
00107 
00108     /* Read results 4 */
00109     retval = PAPI_read( EventSet, values[4] );
00110     if ( retval != PAPI_OK ) {
00111        test_fail( __FILE__, __LINE__, "PAPI_read", retval );
00112     }
00113 
00114     /* remove results.  We never stop??? */
00115     remove_test_events( &EventSet, mask );
00116 
00117     if ( !TESTS_QUIET ) {
00118        printf( "Test case 1: Non-overlapping start, stop, read.\n" );
00119        printf( "-----------------------------------------------\n" );
00120        tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
00121        printf( "Default domain is: %d (%s)\n", tmp,
00122                 stringify_all_domains( tmp ) );
00123        tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
00124        printf( "Default granularity is: %d (%s)\n", tmp,
00125                 stringify_granularity( tmp ) );
00126        printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
00127        printf( "-------------------------------------------------------------------------\n" );
00128 
00129        printf( "Test type   :        1           2           3           4           5\n" );
00130        sprintf( add_event_str, "%s:", event_name );
00131        printf( TAB5, add_event_str,
00132            values[0][1], values[1][1], values[2][1], 
00133                    values[3][1], values[4][1] );
00134        printf( TAB5, "PAPI_TOT_CYC:", 
00135                    values[0][0], values[1][0], values[2][0], 
00136                    values[3][0], values[4][0] );
00137        printf( "-------------------------------------------------------------------------\n" );
00138         
00139            printf( "Verification:\n" );
00140        printf( "Row 1 Column 1 at least %d\n", NUM_FLOPS );
00141        printf( "%% difference between %s 1 & 2: %.2f\n", add_event_str,
00142                 100.0 * ( float ) values[0][1] /
00143                 ( float ) values[1][1] );
00144        printf( "%% difference between %s 1 & 2: %.2f\n", "PAPI_TOT_CYC",
00145                 100.0 * ( float ) values[0][0] /
00146                 ( float ) values[1][0] );
00147        printf( "Column 1 approximately equals column 2\n" );
00148        printf( "Column 3 approximately equals 2 * column 2\n" );
00149        printf( "Column 4 approximately equals 3 * column 2\n" );
00150        printf( "Column 4 exactly equals column 5\n" );
00151     }
00152 
00153     /* Validation */
00154 
00155     /* Check cycles constraints */
00156 
00157     min = ( long long ) ( ( double ) values[1][0] * .8 );
00158     max = ( long long ) ( ( double ) values[1][0] * 1.2 );
00159 
00160     /* Check constraint Col1=Col2 */        
00161     if ( values[0][0] > max || values[0][0] < min ) {
00162        test_fail( __FILE__, __LINE__, "Cycle Col1!=Col2", 1 );
00163     }
00164     /* Check constraint col3 == 2*col2 */
00165     if ( (values[2][0] > ( 2 * max )) || 
00166          (values[2][0] < ( 2 * min )) ) {
00167        test_fail( __FILE__, __LINE__, "Cycle Col3!=2*Col2", 1 );
00168     }
00169     /* Check constraint col4 == 3*col2 */
00170     if ( (values[3][0] > ( 3 * max )) || 
00171          (values[3][0] < ( 3 * min )) ) {
00172        test_fail( __FILE__, __LINE__, "Cycle Col3!=3*Col2", 1 );
00173     }
00174     /* Check constraint col4 == col5 */
00175     if ( values[3][0] != values[4][0] ) {
00176        test_fail( __FILE__, __LINE__, "Cycle Col4!=Col5", 1 );
00177     }
00178 
00179 
00180     /* Check FLOP constraints */
00181 
00182     min = ( long long ) ( ( double ) values[1][1] * .9 );
00183     max = ( long long ) ( ( double ) values[1][1] * 1.1 );
00184 
00185     /* Check constraint Col1=Col2 */
00186     if ( values[0][1] > max || values[0][1] < min ) {
00187        test_fail( __FILE__, __LINE__, "FLOP Col1!=Col2", 1 );
00188     }
00189     /* Check constraint col3 == 2*col2 */
00190     if ( (values[2][1] > ( 2 * max )) || 
00191              (values[2][1] < ( 2 * min )) ) {
00192        test_fail( __FILE__, __LINE__, "FLOP Col3!=2*Col2", 1 );
00193     }
00194     /* Check constraint col4 == 3*col2 */
00195     if ( (values[3][1] > ( 3 * max )) || 
00196          (values[3][1] < ( 3 * min )) ) {
00197        test_fail( __FILE__, __LINE__, "FLOP Col4!=3*Col2", 1 );
00198     }
00199     /* Check constraint col4 == col5 */
00200     if (values[3][1] != values[4][1]) {
00201        test_fail( __FILE__, __LINE__, "FLOP Col4!=Col5", 1 );
00202     }
00203     /* Check flops are sane */
00204     if (values[0][1] < ( long long ) NUM_FLOPS ) {
00205        test_fail( __FILE__, __LINE__, "FLOP sanity", 1 );
00206     }
00207 
00208 
00209     test_pass( __FILE__, values, num_tests );
00210     return 0;
00211 
00212 }

Here is the call graph for this function:


Variable Documentation

Definition at line 11 of file test_utils.c.


Generated on 8 Sep 2016 for PAPI by  doxygen 1.6.1