int add_two_nonderived_events( int *num_events, int *papi_event, int *mask ) { /* query and set up the right event to monitor */ int EventSet = PAPI_NULL; #define POTENTIAL_EVENTS 3 unsigned int potential_evt_to_add[POTENTIAL_EVENTS][2] = { {( unsigned int ) PAPI_FP_INS, MASK_FP_INS}, {( unsigned int ) PAPI_FP_OPS, MASK_FP_OPS}, {( unsigned int ) PAPI_TOT_INS, MASK_TOT_INS} }; int event_found = 0,i; *mask = 0; for(i=0;i<POTENTIAL_EVENTS;i++) { if ( PAPI_query_event( ( int ) potential_evt_to_add[i][0] ) == PAPI_OK ) { if ( !is_event_derived(potential_evt_to_add[i][0])) { event_found = 1; break; } } } if ( event_found ) { *papi_event = ( int ) potential_evt_to_add[i][0]; *mask = ( int ) potential_evt_to_add[i][1] | MASK_TOT_CYC; EventSet = add_test_events( num_events, mask, 0 ); } else { test_fail( __FILE__, __LINE__, "Not enough room to add an event!", 0 ); } return EventSet; }
int add_two_nonderived_events( int *num_events, int *papi_event, int *mask ) { /* query and set up the right event to monitor */ int EventSet = PAPI_NULL; #define POTENTIAL_EVENTS 3 unsigned int potential_evt_to_add[POTENTIAL_EVENTS][2] = { {( unsigned int ) PAPI_FP_INS, MASK_FP_INS}, {( unsigned int ) PAPI_FP_OPS, MASK_FP_OPS}, {( unsigned int ) PAPI_TOT_INS, MASK_TOT_INS} }; int i; *mask = 0; /* could leak up to two event sets. */ for(i=0;i<POTENTIAL_EVENTS;i++) { if ( PAPI_query_event( ( int ) potential_evt_to_add[i][0] ) == PAPI_OK ) { if ( !is_event_derived(potential_evt_to_add[i][0])) { *papi_event = ( int ) potential_evt_to_add[i][0]; *mask = ( int ) potential_evt_to_add[i][1] | MASK_TOT_CYC; EventSet = add_test_events( num_events, mask, 0 ); if ( *num_events == 2 ) break; } } } if ( i == POTENTIAL_EVENTS ) { test_fail( __FILE__, __LINE__, "Can't find a non-derived event!", 0 ); } return EventSet; }
int add_test_events( int *number, int *mask, int allow_derived ) { int retval,i; int EventSet = PAPI_NULL; int num_counters = 0; char name_string[BUFSIZ]; *number = 0; /* get the number of available HW counters */ num_counters = PAPI_get_opt( PAPI_MAX_HWCTRS, NULL ); if ( num_counters < 1 ) { test_fail( __FILE__, __LINE__, "Zero HW Counters available", num_counters ); } /* create the eventset */ retval = PAPI_create_eventset( &EventSet ); if ( retval != PAPI_OK ) { test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval ); } /* check all the masks */ for(i=0;i<MAX_TEST_EVENTS;i++) { if ( *mask & test_events[i].mask ) { /* remove any derived events if told to */ if ((is_event_derived(test_events[i].event)) && (!allow_derived)) { *mask = *mask ^ test_events[i].mask; continue; } retval = PAPI_add_event( EventSet, test_events[i].event ); if ( retval == PAPI_OK ) { ( *number )++; #if 0 if ((*number)==num_counters) { if ( !TESTS_QUIET) { fprintf(stdout, "Stopping with %d events due to HW limit\n", num_counters); } break; } #endif } else { if ( !TESTS_QUIET ) { PAPI_event_code_to_name(test_events[i].event,name_string); fprintf( stdout, "%x %s is not available.\n", test_events[i].event,name_string); } *mask = *mask ^ test_events[i].mask; } } } return EventSet; }