PAPI  5.1.0.2
papi_hl.c File Reference

This file contains the 'high level' interface to PAPI. BASIC is a high level language. ;-) More...

Include dependency graph for papi_hl.c:

Go to the source code of this file.

Data Structures

struct  HighLevelInfo

Defines

#define HL_START_COUNTERS   1
#define HL_FLIPS   2
#define HL_IPC   3
#define HL_FLOPS   4
#define PAPI_HL_READ   1
#define PAPI_HL_ACCUM   2

Functions

int _hl_rate_calls (float *real_time, float *proc_time, long long *ins, float *rate, unsigned int EVENT, HighLevelInfo *state)
void _internal_cleanup_hl_info (HighLevelInfo *state)
int _internal_check_state (HighLevelInfo **state)
int _internal_start_hl_counters (HighLevelInfo *state)
int _internal_hl_read_cnts (long long *values, int array_len, int flag)
int PAPI_flips (float *rtime, float *ptime, long long *flpins, float *mflips)
int PAPI_flops (float *rtime, float *ptime, long long *flpops, float *mflops)
int PAPI_ipc (float *rtime, float *ptime, long long *ins, float *ipc)
int PAPI_num_counters (void)
int PAPI_start_counters (int *events, int array_len)
int PAPI_read_counters (long long *values, int array_len)
int PAPI_accum_counters (long long *values, int array_len)
int PAPI_stop_counters (long long *values, int array_len)
void _papi_hwi_shutdown_highlevel ()

Detailed Description

Author:
Philip Mucci mucci@cs.utk.edu
Kevin London london@cs.utk.edu
dan terpstra terpstra@cs.utk.edu

Definition in file papi_hl.c.


Define Documentation

#define HL_FLIPS   2

Definition at line 27 of file papi_hl.c.

#define HL_FLOPS   4

Definition at line 29 of file papi_hl.c.

#define HL_IPC   3

Definition at line 28 of file papi_hl.c.

#define HL_START_COUNTERS   1

Definition at line 26 of file papi_hl.c.

#define PAPI_HL_ACCUM   2

Definition at line 33 of file papi_hl.c.

#define PAPI_HL_READ   1

Definition at line 32 of file papi_hl.c.


Function Documentation

int _hl_rate_calls ( float *  real_time,
float *  proc_time,
long long *  ins,
float *  rate,
unsigned int  EVENT,
HighLevelInfo state 
)

Definition at line 342 of file papi_hl.c.

{
     long long values[2] = { 0, 0 };
     int retval = 0;
     int level = 0;

     if ( EVENT == ( unsigned int ) PAPI_FP_INS )
    level = HL_FLIPS;
     else if ( EVENT == ( unsigned int ) PAPI_TOT_INS )
    level = HL_IPC;
     else if ( EVENT == ( unsigned int ) PAPI_FP_OPS )
    level = HL_FLOPS;

     if ( state->running != 0 && state->running != level ) {
    return PAPI_EINVAL;
     }

     if ( state->running == 0 ) {
        if ( PAPI_query_event( ( int ) EVENT ) != PAPI_OK ) {
       return PAPI_ENOEVNT;
        }

    if ((retval=PAPI_add_event(state->EventSet,(int)EVENT))!=PAPI_OK ) {
       _internal_cleanup_hl_info( state );
       PAPI_cleanup_eventset( state->EventSet );
       return retval;
    }

    if ( PAPI_query_event( ( int ) PAPI_TOT_CYC ) != PAPI_OK ) {
       return PAPI_ENOEVNT;
    }

    if ((retval=PAPI_add_event(state->EventSet,(int)PAPI_TOT_CYC))!=PAPI_OK) {
       _internal_cleanup_hl_info( state );
       PAPI_cleanup_eventset( state->EventSet );
       return retval;
    }

    state->initial_time = PAPI_get_real_usec(  );
    if ( ( retval = PAPI_start( state->EventSet ) ) != PAPI_OK ) {
       return retval;
    }

    state->running = ( short ) level;

     } else {
        if ( ( retval = PAPI_stop( state->EventSet, values ) ) != PAPI_OK ) {
       return retval;
        }

    /* Use Multiplication because it is much faster */
    *real_time = (float) ((double) (PAPI_get_real_usec() -
                    state->initial_time ) * .000001 );
    *proc_time = (float) ((double) values[1] * .000001 /
             (( _papi_hwi_system_info.hw_info.cpu_max_mhz == 0 ) ?
                             1 : _papi_hwi_system_info.hw_info.cpu_max_mhz ) );

    if ( *proc_time > 0 ) {
       *rate = (float) ((float)values[0] *
               ( EVENT == ( unsigned int ) PAPI_TOT_INS ? 1 :
                   _papi_hwi_system_info.hw_info.cpu_max_mhz ) /
                   (float) ( values[1] == 0 ? 1 : values[1] ) );
    }

    state->total_proc_time += *proc_time;
    state->total_ins += ( float ) values[0];
    *proc_time = state->total_proc_time;
    *ins = ( long long ) state->total_ins;
    if ( ( retval = PAPI_start( state->EventSet ) ) != PAPI_OK ) {
       state->running = 0;
       return retval;
    }
     }

     return PAPI_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int _internal_check_state ( HighLevelInfo **  outgoing)

This function is called to determine the state of the system. We may as well set the HighLevelInfo so you don't have to look it up again.

Definition at line 98 of file papi_hl.c.

{
    int retval;
    HighLevelInfo *state = NULL;

    /* Only allow one thread at a time in here */
    if ( init_level == PAPI_NOT_INITED ) {
        retval = PAPI_library_init( PAPI_VER_CURRENT );
        if ( retval != PAPI_VER_CURRENT ) {
            return ( retval );
        } else {
            _papi_hwi_lock( HIGHLEVEL_LOCK );
            init_level = PAPI_HIGH_LEVEL_INITED;
            _papi_hwi_unlock( HIGHLEVEL_LOCK );
        }
    }

    /*
     * Do we have the thread specific data setup yet?
     */
    if ( ( retval =
           PAPI_get_thr_specific( PAPI_HIGH_LEVEL_TLS, ( void * ) &state ) )
         != PAPI_OK || state == NULL ) {
        state = ( HighLevelInfo * ) papi_malloc( sizeof ( HighLevelInfo ) );
        if ( state == NULL )
            return ( PAPI_ENOMEM );

        memset( state, 0, sizeof ( HighLevelInfo ) );
        state->EventSet = -1;

        if ( ( retval = PAPI_create_eventset( &state->EventSet ) ) != PAPI_OK )
            return ( retval );

        if ( ( retval =
               PAPI_set_thr_specific( PAPI_HIGH_LEVEL_TLS,
                                      state ) ) != PAPI_OK )
            return ( retval );
    }
    *outgoing = state;
    return ( PAPI_OK );
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 150 of file papi_hl.c.

{
    state->num_evts = 0;
    state->running = 0;
    state->initial_time = -1;
    state->total_proc_time = 0;
    state->total_ins = 0;
    return;
}

Here is the caller graph for this function:

int _internal_hl_read_cnts ( long long *  values,
int  array_len,
int  flag 
)

Definition at line 557 of file papi_hl.c.

{
    int retval;
    HighLevelInfo *state = NULL;

    if ( ( retval = _internal_check_state( &state ) ) != PAPI_OK )
        return ( retval );

    if ( state->running != HL_START_COUNTERS || array_len < state->num_evts )
        return ( PAPI_EINVAL );

    if ( flag == PAPI_HL_ACCUM )
        return ( PAPI_accum( state->EventSet, values ) );
    else if ( flag == PAPI_HL_READ ) {
        if ( ( retval = PAPI_read( state->EventSet, values ) ) != PAPI_OK )
            return ( retval );
        return ( PAPI_reset( state->EventSet ) );
    }

    /* Invalid flag passed in */
    return ( PAPI_EINVAL );
}

Here is the call graph for this function:

Here is the caller graph for this function:

Make sure to allocate space for values

Definition at line 144 of file papi_hl.c.

{
    return ( PAPI_start( state->EventSet ) );
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 754 of file papi_hl.c.

{
    HighLevelInfo *state = NULL;

    if ( PAPI_get_thr_specific( PAPI_HIGH_LEVEL_TLS, ( void * ) &state ) ==
         PAPI_OK ) {
        if ( state )
            papi_free( state );
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines