Blame src/components/powercap/tests/powercap_limit.c

Packit Service a1973e
/**
Packit Service a1973e
 * @author Philip Vaccaro
Packit Service a1973e
 * Test case for powercap component
Packit Service a1973e
 * @brief
Packit Service a1973e
 *   Tests basic functionality of powercap component
Packit Service a1973e
 */
Packit Service a1973e

Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <string.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e

Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e

Packit Service a1973e
#define MAX_powercap_EVENTS 64
Packit Service a1973e

Packit Service a1973e
int main ( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
  (void) argv;
Packit Service a1973e
  (void) argc;
Packit Service a1973e
  int retval,cid,powercap_cid=-1,numcmp;
Packit Service a1973e
  int EventSet = PAPI_NULL;
Packit Service a1973e
  long long values[MAX_powercap_EVENTS];
Packit Service a1973e
  int limit_map[MAX_powercap_EVENTS];
Packit Service a1973e
  int num_events=0, num_limits=0;
Packit Service a1973e
  int code;
Packit Service a1973e
  char event_names[MAX_powercap_EVENTS][PAPI_MAX_STR_LEN];
Packit Service a1973e
  int r,i;
Packit Service a1973e

Packit Service a1973e
  const PAPI_component_info_t *cmpinfo = NULL;
Packit Service a1973e

Packit Service a1973e
  /* PAPI Initialization */
Packit Service a1973e
  retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
  if ( retval != PAPI_VER_CURRENT )
Packit Service a1973e
    test_fail( __FILE__, __LINE__,"PAPI_library_init\n",retval );
Packit Service a1973e

Packit Service a1973e
  if ( !TESTS_QUIET ) printf( "Trying all powercap events\n" );
Packit Service a1973e

Packit Service a1973e
  numcmp = PAPI_num_components();
Packit Service a1973e

Packit Service a1973e
  for( cid=0; cid
Packit Service a1973e

Packit Service a1973e
    if ( ( cmpinfo = PAPI_get_component_info( cid ) ) == NULL )
Packit Service a1973e
      test_fail( __FILE__, __LINE__,"PAPI_get_component_info\n", 0 );
Packit Service a1973e

Packit Service a1973e
    if ( strstr( cmpinfo->name,"powercap" ) ) {
Packit Service a1973e
      powercap_cid=cid;
Packit Service a1973e
      if ( !TESTS_QUIET ) printf( "Found powercap component at cid %d\n",powercap_cid );
Packit Service a1973e
      if ( cmpinfo->disabled ) {
Packit Service a1973e
        if ( !TESTS_QUIET ) {
Packit Service a1973e
          printf( "powercap component disabled: %s\n",
Packit Service a1973e
                  cmpinfo->disabled_reason );
Packit Service a1973e
        }
Packit Service a1973e
        test_skip( __FILE__,__LINE__,"powercap component disabled",0 );
Packit Service a1973e
      }
Packit Service a1973e
      break;
Packit Service a1973e
    }
Packit Service a1973e
  }
Packit Service a1973e

Packit Service a1973e
  /* Component not found */
Packit Service a1973e
  if ( cid==numcmp )
Packit Service a1973e
    test_skip( __FILE__,__LINE__,"No powercap component found\n",0 );
Packit Service a1973e

Packit Service a1973e
  /* Skip if component has no counters */
Packit Service a1973e
  if ( cmpinfo->num_cntrs==0 )
Packit Service a1973e
    test_skip( __FILE__,__LINE__,"No counters in the powercap component\n",0 );
Packit Service a1973e

Packit Service a1973e
  /* Create EventSet */
Packit Service a1973e
  retval = PAPI_create_eventset( &EventSet );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_create_eventset()",retval );
Packit Service a1973e

Packit Service a1973e
  /* Add all package limit events */
Packit Service a1973e
  code = PAPI_NATIVE_MASK;
Packit Service a1973e
  r = PAPI_enum_cmp_event( &code, PAPI_ENUM_FIRST, powercap_cid );
Packit Service a1973e

Packit Service a1973e

Packit Service a1973e
  /* find all package power events */
Packit Service a1973e
  while ( r == PAPI_OK ) {
Packit Service a1973e
    retval = PAPI_event_code_to_name( code, event_names[num_events] );
Packit Service a1973e
    if ( retval != PAPI_OK ) 
Packit Service a1973e
      test_fail( __FILE__, __LINE__,"PAPI_event_code_to_name", retval );
Packit Service a1973e

Packit Service a1973e
    retval = PAPI_add_event(EventSet, code);
Packit Service a1973e
    if (retval != PAPI_OK)
Packit Service a1973e
      break; /* We've hit an event limit */
Packit Service a1973e

Packit Service a1973e
    if (!(strstr(event_names[num_events],"SUBZONE")) && (strstr(event_names[num_events],"POWER_LIMIT"))) {
Packit Service a1973e

Packit Service a1973e
      limit_map[num_limits] = num_events;
Packit Service a1973e
      num_limits++;
Packit Service a1973e
    }
Packit Service a1973e
    num_events++;
Packit Service a1973e
    r = PAPI_enum_cmp_event( &code, PAPI_ENUM_EVENTS, powercap_cid );
Packit Service a1973e
  }
Packit Service a1973e

Packit Service a1973e

Packit Service a1973e
  /* start collecting power data */
Packit Service a1973e
  retval = PAPI_start( EventSet );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e

Packit Service a1973e
  /* initial read of package limits */
Packit Service a1973e
  retval = PAPI_read( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e

Packit Service a1973e

Packit Service a1973e
  printf("\nCURRENT LIMITS\n");
Packit Service a1973e
  for( i=0; i
Packit Service a1973e
    printf("EVENT: %s\tLIMIT: %0.2lf Watts\n", event_names[limit_map[i]], ((double)values[limit_map[i]]*1e-6));
Packit Service a1973e
    values[limit_map[i]] = values[limit_map[i]] - (10 * 1e6); //minus 10 Watts
Packit Service a1973e
  }
Packit Service a1973e
  usleep(10000);
Packit Service a1973e

Packit Service a1973e
  printf("\nSETTING LIMITS 10 WATTS BELOW CURRENT LIMITS\n");
Packit Service a1973e
  retval = PAPI_write( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e

Packit Service a1973e
  usleep(10000);
Packit Service a1973e

Packit Service a1973e
  printf("\nREADING LIMITS TO MAKE SURE SET\n");
Packit Service a1973e
  retval = PAPI_read( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e
  usleep(10000);
Packit Service a1973e

Packit Service a1973e
  printf("\nNEW LIMITS\n");
Packit Service a1973e
  for( i=0; i
Packit Service a1973e
    printf("EVENT: %s\tLIMIT: %0.2lf Watts\n", event_names[limit_map[i]], ((double)values[limit_map[i]]*1e-6));
Packit Service a1973e
    values[limit_map[i]] = values[limit_map[i]] + (10 * 1e6); //plus 10 Watts
Packit Service a1973e
  }
Packit Service a1973e

Packit Service a1973e
  printf("\nRESET LIMITS BEFORE EXITING...");
Packit Service a1973e
  retval = PAPI_write( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e
  usleep(10000);
Packit Service a1973e

Packit Service a1973e
  printf("\nREADING RESET LIMITS TO MAKE SURE SET\n");
Packit Service a1973e
  retval = PAPI_read( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
Packit Service a1973e
  usleep(10000);
Packit Service a1973e

Packit Service a1973e
  printf("\nRESET LIMITS\n");
Packit Service a1973e
  for( i=0; i
Packit Service a1973e
    printf("EVENT: %s\tLIMIT: %0.2lf Watts\n", event_names[limit_map[i]], ((double)values[limit_map[i]]*1e-6));
Packit Service a1973e
  }
Packit Service a1973e

Packit Service a1973e
  printf("done\n");
Packit Service a1973e

Packit Service a1973e
  retval = PAPI_stop( EventSet, values );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_stop()",retval );
Packit Service a1973e

Packit Service a1973e
  /* Done, clean up */
Packit Service a1973e
  retval = PAPI_cleanup_eventset( EventSet );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__,"PAPI_cleanup_eventset()",retval );
Packit Service a1973e

Packit Service a1973e
  retval = PAPI_destroy_eventset( &EventSet );
Packit Service a1973e
  if ( retval != PAPI_OK )
Packit Service a1973e
    test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset()",retval );
Packit Service a1973e

Packit Service a1973e
  test_pass( __FILE__ );
Packit Service a1973e

Packit Service a1973e
  return 0;
Packit Service a1973e
}
Packit Service a1973e