/* This file attempts to test the PAPI_HW_INT */ /* performance counter (Total hardware interrupts). */ /* This assumes that interrupts will be happening in the background */ /* Including a regular timer tick of HZ. This is not always true */ /* but should be roughly true on your typical Linux system. */ /* by Vince Weaver, */ #include #include #include #include #include #include #include "papi.h" #include "papi_test.h" #include "display_error.h" int main(int argc, char **argv) { int quiet; long long count; int retval; int eventset=PAPI_NULL; struct timespec before,after; unsigned long long seconds; unsigned long long ns; quiet=tests_quiet(argc,argv); /* Init the PAPI library */ retval = PAPI_library_init( PAPI_VER_CURRENT ); if ( retval != PAPI_VER_CURRENT ) { test_fail( __FILE__, __LINE__, "PAPI_library_init", retval ); } if (!quiet) { printf("\nTesting PAPI_HW_INT\n"); } retval=PAPI_create_eventset(&eventset); if (retval!=PAPI_OK) { test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval ); } retval=PAPI_add_named_event(eventset,"PAPI_HW_INT"); if (retval!=PAPI_OK) { if (!quiet) printf("Could not add PAPI_HW_INT\n"); test_skip( __FILE__, __LINE__, "adding PAPI_HW_INT", retval ); } /********************************/ /* testing 3 seconds of runtime */ /********************************/ if (!quiet) { printf("\nRunning for 3 seconds\n"); } clock_gettime(CLOCK_REALTIME,&before); PAPI_reset(eventset); PAPI_start(eventset); while(1) { clock_gettime(CLOCK_REALTIME,&after); seconds=after.tv_sec - before.tv_sec; ns = after.tv_nsec - before.tv_nsec; ns = (seconds*1000000000ULL)+ns; /* be done if 3 billion nanoseconds has passed */ if (ns>3000000000ULL) break; } retval=PAPI_stop(eventset,&count); if (retval!=PAPI_OK) { test_fail( __FILE__, __LINE__, "Problem stopping!", retval ); } if (!quiet) { printf("\tMeasured interrupts = %lld\n",count); /* FIXME: find actua Hz on system */ /* Or even, read /proc/interrupts */ printf("\tAssuming HZ=250, expect roughly 750\n"); } if (!quiet) printf("\n"); if (count<10) { if (!quiet) printf("Too few interrupts!\n"); test_fail( __FILE__, __LINE__, "Too few interrupts!", 1 ); } test_pass( __FILE__ ); return 0; }