|
Packit |
577717 |
/**
|
|
Packit |
577717 |
* @author PAPI team UTK/ICL
|
|
Packit |
577717 |
* Test case for powercap component
|
|
Packit |
577717 |
* @brief
|
|
Packit |
577717 |
* Tests basic functionality of powercap component
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define MAX_powercap_EVENTS 64
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef BASIC_TEST
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void run_test( int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "Sleeping 1 second...\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
sleep( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#else /* NOT BASIC_TEST */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define MATRIX_SIZE 1024
|
|
Packit |
577717 |
static double a[MATRIX_SIZE][MATRIX_SIZE];
|
|
Packit |
577717 |
static double b[MATRIX_SIZE][MATRIX_SIZE];
|
|
Packit |
577717 |
static double c[MATRIX_SIZE][MATRIX_SIZE];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Naive matrix multiply */
|
|
Packit |
577717 |
void run_test( int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
double s;
|
|
Packit |
577717 |
int i,j,k;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) printf( "Doing a naive %dx%d MMM...\n",MATRIX_SIZE,MATRIX_SIZE );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
for( j=0; j
|
|
Packit |
577717 |
a[i][j]=( double )i*( double )j;
|
|
Packit |
577717 |
b[i][j]=( double )i/( double )( j+5 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for( j=0; j
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
s=0;
|
|
Packit |
577717 |
for( k=0; k
|
|
Packit |
577717 |
s+=a[i][k]*b[k][j];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
c[i][j] = s;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
s=0.0;
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
for( j=0; j
|
|
Packit |
577717 |
s+=c[i][j];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) printf( "Matrix multiply sum: s=%lf\n",s );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int main ( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
(void) argv;
|
|
Packit |
577717 |
(void) argc;
|
|
Packit |
577717 |
int retval,cid,powercap_cid=-1,numcmp;
|
|
Packit |
577717 |
int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
long long *values;
|
|
Packit |
577717 |
int num_events=0;
|
|
Packit |
577717 |
int code;
|
|
Packit |
577717 |
char event_names[MAX_powercap_EVENTS][PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
char event_descrs[MAX_powercap_EVENTS][PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
char units[MAX_powercap_EVENTS][PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
int data_type[MAX_powercap_EVENTS];
|
|
Packit |
577717 |
int r,i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
const PAPI_component_info_t *cmpinfo = NULL;
|
|
Packit |
577717 |
PAPI_event_info_t evinfo;
|
|
Packit |
577717 |
long long before_time,after_time;
|
|
Packit |
577717 |
double elapsed_time;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Currently unimplemented? */
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
int do_wrap = 0;
|
|
Packit |
577717 |
if ( argc > 1 ) {
|
|
Packit |
577717 |
if ( strstr( argv[1], "-w" ) ) {
|
|
Packit |
577717 |
do_wrap = 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* PAPI Initialization */
|
|
Packit |
577717 |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit |
577717 |
if ( retval != PAPI_VER_CURRENT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,"PAPI_library_init failed\n",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) printf( "Trying all powercap events\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
numcmp = PAPI_num_components();
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for( cid=0; cid
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( cmpinfo = PAPI_get_component_info( cid ) ) == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,"PAPI_get_component_info failed\n", 0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( strstr( cmpinfo->name,"powercap" ) ) {
|
|
Packit |
577717 |
powercap_cid=cid;
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) printf( "Found powercap component at cid %d\n",powercap_cid );
|
|
Packit |
577717 |
if ( cmpinfo->disabled ) {
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) {
|
|
Packit |
577717 |
printf( "powercap component disabled: %s\n",
|
|
Packit |
577717 |
cmpinfo->disabled_reason );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
test_skip( __FILE__,__LINE__,"powercap component disabled",0 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Component not found */
|
|
Packit |
577717 |
if ( cid==numcmp )
|
|
Packit |
577717 |
test_skip( __FILE__,__LINE__,"No powercap component found\n",0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Skip if component has no counters */
|
|
Packit |
577717 |
if ( cmpinfo->num_cntrs==0 )
|
|
Packit |
577717 |
test_skip( __FILE__,__LINE__,"No counters in the powercap component\n",0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create EventSet */
|
|
Packit |
577717 |
retval = PAPI_create_eventset( &EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset()",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Add all events */
|
|
Packit |
577717 |
code = PAPI_NATIVE_MASK;
|
|
Packit |
577717 |
r = PAPI_enum_cmp_event( &code, PAPI_ENUM_FIRST, powercap_cid );
|
|
Packit |
577717 |
while ( r == PAPI_OK ) {
|
|
Packit |
577717 |
retval = PAPI_event_code_to_name( code, event_names[num_events] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,"Error from PAPI_event_code_to_name", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_get_event_info( code,&evinfo );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "Error getting event info\n",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strncpy( event_descrs[num_events],evinfo.long_descr,sizeof( event_descrs[0] )-1 );
|
|
Packit |
577717 |
strncpy( units[num_events],evinfo.units,sizeof( units[0] )-1 );
|
|
Packit |
577717 |
// buffer must be null terminated to safely use strstr operation on it below
|
|
Packit |
577717 |
units[num_events][sizeof( units[0] )-1] = '\0';
|
|
Packit |
577717 |
data_type[num_events] = evinfo.data_type;
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, code );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
break; /* We've hit an event limit */
|
|
Packit |
577717 |
num_events++;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
r = PAPI_enum_cmp_event( &code, PAPI_ENUM_EVENTS, powercap_cid );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
values=calloc( num_events,sizeof( long long ) );
|
|
Packit |
577717 |
if ( values==NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,"No memory",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) printf( "\nStarting measurements...\n\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start Counting */
|
|
Packit |
577717 |
before_time=PAPI_get_real_nsec();
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start()",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Run test */
|
|
Packit |
577717 |
run_test( TESTS_QUIET );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Stop Counting */
|
|
Packit |
577717 |
after_time=PAPI_get_real_nsec();
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, values );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop()",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
elapsed_time=( ( double )( after_time-before_time ) )/1.0e9;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) {
|
|
Packit |
577717 |
printf( "\nStopping measurements, took %.3fs, gathering results...\n\n", elapsed_time );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "scaled energy measurements:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"ENERGY_UJ" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%4.6f J (Average Power %.1fW)\n",
|
|
Packit |
577717 |
event_names[i], event_descrs[i],
|
|
Packit |
577717 |
( double )values[i]/1.0e6,
|
|
Packit |
577717 |
( ( double )values[i]/1.0e6 )/elapsed_time );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "energy counts:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"ENERGY_UJ" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%12lld\t%#08llx\n", event_names[i],
|
|
Packit |
577717 |
event_descrs[i],
|
|
Packit |
577717 |
values[i], values[i] );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "long term time window values:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"TIME_WINDOW_A_US" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%4f (secs)\n",
|
|
Packit |
577717 |
event_names[i], event_descrs[i],
|
|
Packit |
577717 |
( double )values[i]/1.0e6 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "short term time window values:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"TIME_WINDOW_B_US" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%4f (secs)\n",
|
|
Packit |
577717 |
event_names[i], event_descrs[i],
|
|
Packit |
577717 |
( double )values[i]/1.0e6 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "long term power limit:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"POWER_LIMIT_A_UW" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%4f (watts)\n",
|
|
Packit |
577717 |
event_names[i], event_descrs[i],
|
|
Packit |
577717 |
( double )values[i]/1.0e6 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "short term power limit:\n" );
|
|
Packit |
577717 |
for( i=0; i
|
|
Packit |
577717 |
if ( strstr( event_names[i],"POWER_LIMIT_B_UW" ) ) {
|
|
Packit |
577717 |
if ( data_type[i] == PAPI_DATATYPE_UINT64 ) {
|
|
Packit |
577717 |
printf( "%-45s%-20s%4f (watts)\n",
|
|
Packit |
577717 |
event_names[i], event_descrs[i],
|
|
Packit |
577717 |
( double )values[i]/1.0e6 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Done, clean up */
|
|
Packit |
577717 |
retval = PAPI_cleanup_eventset( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,"PAPI_cleanup_eventset()",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_destroy_eventset( &EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset()",retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|