{
int retval, num_tests = 1, tmp;
int EventSet1 = PAPI_NULL;
int PAPI_event, mask1;
int num_events;
long long **values;
long long elapsed_us, elapsed_cyc, elapsed_virt_us, elapsed_virt_cyc;
char event_name[PAPI_MAX_STR_LEN], add_event_str[PAPI_MAX_STR_LEN];
double cycles_error;
tests_quiet( argc, argv );
retval = PAPI_library_init( PAPI_VER_CURRENT );
if ( retval != PAPI_VER_CURRENT ) {
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
}
EventSet1 = add_two_events( &num_events, &PAPI_event, &mask1 );
retval = PAPI_event_code_to_name( PAPI_event, event_name );
if ( retval != PAPI_OK ) {
test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
}
sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
values = allocate_test_space( num_tests, num_events );
do_flops( NUM_FLOPS*10 );
elapsed_us = PAPI_get_real_usec( );
elapsed_cyc = PAPI_get_real_cyc( );
elapsed_virt_us = PAPI_get_virt_usec( );
elapsed_virt_cyc = PAPI_get_virt_cyc( );
retval = PAPI_start( EventSet1 );
if ( retval != PAPI_OK ) {
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
}
do_flops( NUM_FLOPS );
retval = PAPI_stop( EventSet1, values[0] );
if ( retval != PAPI_OK ) {
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
}
elapsed_virt_us = PAPI_get_virt_usec( ) - elapsed_virt_us;
elapsed_virt_cyc = PAPI_get_virt_cyc( ) - elapsed_virt_cyc;
elapsed_us = PAPI_get_real_usec( ) - elapsed_us;
elapsed_cyc = PAPI_get_real_cyc( ) - elapsed_cyc;
remove_test_events( &EventSet1, mask1 );
if ( !TESTS_QUIET ) {
printf( "Test case 0: start, stop.\n" );
printf( "-----------------------------------------------\n" );
tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
printf( "Default domain is: %d (%s)\n", tmp,
stringify_all_domains( tmp ) );
tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
printf( "Default granularity is: %d (%s)\n", tmp,
stringify_granularity( tmp ) );
printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
printf( "-------------------------------------------------------------------------\n" );
printf( "Test type : \t 1\n" );
sprintf( add_event_str, "%-12s : \t", event_name );
printf( TAB1, add_event_str, values[0][1] );
if ( mask1 & MASK_TOT_CYC ) {
printf( TAB1, "PAPI_TOT_CYC : \t", values[0][0] );
}
printf( TAB1, "Real usec : \t", elapsed_us );
printf( TAB1, "Real cycles : \t", elapsed_cyc );
printf( TAB1, "Virt usec : \t", elapsed_virt_us );
printf( TAB1, "Virt cycles : \t", elapsed_virt_cyc );
printf( "-------------------------------------------------------------------------\n" );
printf( "Verification: PAPI_TOT_CYC should be roughly real_cycles\n" );
printf( "NOTE: Not true if dynamic frequency scaling is enabled.\n" );
printf( "Verification: PAPI_FP_INS should be roughly %d\n", 2*NUM_FLOPS );
}
cycles_error=100.0*((double)values[0][0] - (double)elapsed_cyc)/((double)elapsed_cyc);
if ((cycles_error > MAX_CYCLE_ERROR) || (cycles_error < -MAX_CYCLE_ERROR)) {
printf("PAPI_TOT_CYC Error of %.2f%%\n",cycles_error);
test_fail( __FILE__, __LINE__, "Cycles validation", 0 );
}
if (abs(values[0][1] - (2*NUM_FLOPS)) > (2*NUM_FLOPS)) {
printf("%s Error of %.2f%%\n", event_name, (100.0 * (double)(values[0][1] - (2*NUM_FLOPS)))/(2*NUM_FLOPS));
test_fail( __FILE__, __LINE__, "FLOPS validation", 0 );
}
if (abs(values[0][1] - (2*NUM_FLOPS)) > (NUM_FLOPS/2)) {
printf("%s Error of %.2f%%\n", event_name, (100.0 * (double)(values[0][1] - (2*NUM_FLOPS)))/(2*NUM_FLOPS));
test_warn( __FILE__, __LINE__, "FLOPS validation", 0 );
}
test_pass( __FILE__, values, num_tests );
return 0;
}