|
Packit Service |
a1973e |
/****************************/
|
|
Packit Service |
a1973e |
/* THIS IS OPEN SOURCE CODE */
|
|
Packit Service |
a1973e |
/****************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/**
|
|
Packit Service |
a1973e |
* @file linux-bgq.c
|
|
Packit Service |
a1973e |
* @author Heike Jagode
|
|
Packit Service |
a1973e |
* jagode@eecs.utk.edu
|
|
Packit Service |
a1973e |
* Mods: < your name here >
|
|
Packit Service |
a1973e |
* < your email address >
|
|
Packit Service |
a1973e |
* Blue Gene/Q CPU component: BGPM / Punit
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Tested version of bgpm (early access)
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* @brief
|
|
Packit Service |
a1973e |
* This file has the source code for a component that enables PAPI-C to
|
|
Packit Service |
a1973e |
* access hardware monitoring counters for BG/Q through the BGPM library.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "papi.h"
|
|
Packit Service |
a1973e |
#include "papi_internal.h"
|
|
Packit Service |
a1973e |
#include "papi_lock.h"
|
|
Packit Service |
a1973e |
#include "papi_memory.h"
|
|
Packit Service |
a1973e |
#include "extras.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "linux-bgq.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "papi_vector.h"
|
|
Packit Service |
a1973e |
#include "error.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* BG/Q specific 'stuff'
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
#include <ucontext.h>
|
|
Packit Service |
a1973e |
#include <stdlib.h>
|
|
Packit Service |
a1973e |
#include <signal.h>
|
|
Packit Service |
a1973e |
#include <sys/time.h>
|
|
Packit Service |
a1973e |
#include <errno.h>
|
|
Packit Service |
a1973e |
#include <stdio.h>
|
|
Packit Service |
a1973e |
#include <string.h>
|
|
Packit Service |
a1973e |
#include <sys/utsname.h>
|
|
Packit Service |
a1973e |
#include "spi/include/upci/upci.h"
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
#include <inttypes.h>
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// BG/Q macros
|
|
Packit Service |
a1973e |
#define get_cycles GetTimeBase
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// BG/Q external structures/functions/stuff
|
|
Packit Service |
a1973e |
#if 1
|
|
Packit Service |
a1973e |
UPC_Lock_t thdLocks[PAPI_MAX_LOCK];
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
pthread_mutex_t thdLocks[PAPI_MAX_LOCK];
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Defined in papi_data.c */
|
|
Packit Service |
a1973e |
//extern papi_mdi_t _papi_hwi_system_info;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
papi_vector_t _bgq_vectors;
|
|
Packit Service |
a1973e |
PAPI_os_info_t _papi_os_info;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define OPCODE_EVENT_CHUNK 8
|
|
Packit Service |
a1973e |
static int allocated_opcode_events = 0;
|
|
Packit Service |
a1973e |
static int num_opcode_events = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct bgq_generic_events_t {
|
|
Packit Service |
a1973e |
int idx;
|
|
Packit Service |
a1973e |
int eventId;
|
|
Packit Service |
a1973e |
char mask[PAPI_MIN_STR_LEN];
|
|
Packit Service |
a1973e |
char opcode[PAPI_MIN_STR_LEN];
|
|
Packit Service |
a1973e |
uint64_t opcode_mask;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static struct bgq_generic_events_t *GenericEvent;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Defined in linux-bgq-memory.c */
|
|
Packit Service |
a1973e |
extern int _bgq_get_memory_info( PAPI_hw_info_t * pHwInfo, int pCPU_Type );
|
|
Packit Service |
a1973e |
extern int _bgq_get_dmem_info( PAPI_dmem_info_t * pDmemInfo );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* prototypes */
|
|
Packit Service |
a1973e |
void user_signal_handler( int hEvtSet, uint64_t address, uint64_t ovfVector, const ucontext_t *pContext );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*******************************************************************************
|
|
Packit Service |
a1973e |
******** BEGIN FUNCTIONS USED INTERNALLY SPECIFIC TO THIS COMPONENT **********
|
|
Packit Service |
a1973e |
******************************************************************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Lock
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
_papi_hwd_lock( int lock )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( _AT_ " _papi_hwd_lock %d\n", lock);
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
assert( lock < PAPI_MAX_LOCK );
|
|
Packit Service |
a1973e |
#if 1
|
|
Packit Service |
a1973e |
UPC_Lock( &thdLocks[lock] );
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
pthread_mutex_lock( &thdLocks[lock] );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( _AT_ " _papi_hwd_lock got lock %d\n", lock );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Unlock
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
_papi_hwd_unlock( int lock )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( _AT_ " _papi_hwd_unlock %d\n", lock );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
assert( lock < PAPI_MAX_LOCK );
|
|
Packit Service |
a1973e |
#if 1
|
|
Packit Service |
a1973e |
UPC_Unlock( &thdLocks[lock] );
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
pthread_mutex_unlock( &thdLocks[lock] );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Get System Information
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Initialize system information structure
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_get_system_info( papi_mdi_t *mdi )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_get_system_info\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
( void ) mdi;
|
|
Packit Service |
a1973e |
Personality_t personality;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Hardware info */
|
|
Packit Service |
a1973e |
retval = Kernel_GetPersonality( &personality, sizeof( Personality_t ) );
|
|
Packit Service |
a1973e |
if ( retval ) {
|
|
Packit Service |
a1973e |
fprintf( stdout, "Kernel_GetPersonality returned %d (sys error=%d).\n"
|
|
Packit Service |
a1973e |
"\t%s\n", retval, errno, strerror( errno ) );
|
|
Packit Service |
a1973e |
return PAPI_ESYS;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Returns the number of processors that are associated with the currently
|
|
Packit Service |
a1973e |
* running process */
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.ncpu = Kernel_ProcessorCount( );
|
|
Packit Service |
a1973e |
// TODO: HJ Those values need to be fixed
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.nnodes = Kernel_ProcessCount( );
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.totalcpus = _papi_hwi_system_info.hw_info.ncpu;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.cpu_max_mhz = personality.Kernel_Config.FreqMHz;
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.cpu_min_mhz = personality.Kernel_Config.FreqMHz;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.mhz = ( float ) personality.Kernel_Config.FreqMHz;
|
|
Packit Service |
a1973e |
SUBDBG( "_bgq_get_system_info: Detected MHZ is %f\n",
|
|
Packit Service |
a1973e |
_papi_hwi_system_info.hw_info.mhz );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Initialize Control State
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_init_control_state( hwd_control_state_t * ptr )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_init_control_state\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ptr->EventGroup = Bgpm_CreateEventSet();
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( ptr->EventGroup, "Bgpm_CreateEventSet" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// initialize multiplexing flag to OFF (0)
|
|
Packit Service |
a1973e |
ptr->muxOn = 0;
|
|
Packit Service |
a1973e |
// initialize overflow flag to OFF (0)
|
|
Packit Service |
a1973e |
ptr->overflow = 0;
|
|
Packit Service |
a1973e |
ptr->overflow_count = 0;
|
|
Packit Service |
a1973e |
// initialized BGPM eventGroup flag to NOT applied yet (0)
|
|
Packit Service |
a1973e |
ptr->bgpm_eventset_applied = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Set Domain
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_set_domain( hwd_control_state_t * cntrl, int domain )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_set_domain\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int found = 0;
|
|
Packit Service |
a1973e |
( void ) cntrl;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( PAPI_DOM_USER & domain )
|
|
Packit Service |
a1973e |
found = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( PAPI_DOM_KERNEL & domain )
|
|
Packit Service |
a1973e |
found = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( PAPI_DOM_OTHER & domain )
|
|
Packit Service |
a1973e |
found = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( !found )
|
|
Packit Service |
a1973e |
return ( PAPI_EINVAL );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Initialization
|
|
Packit Service |
a1973e |
* This is called whenever a thread is initialized
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_init( hwd_context_t * ctx )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_init\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
Bgpm_PrintOnError(1);
|
|
Packit Service |
a1973e |
Bgpm_ExitOnError(0);
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
Bgpm_PrintOnError(0);
|
|
Packit Service |
a1973e |
// avoid bgpm default of exiting when error occurs - caller will check return code instead.
|
|
Packit Service |
a1973e |
Bgpm_ExitOnError(0);
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_Init( BGPM_MODE_SWDISTRIB );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Init" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
//_common_initBgpm();
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_multiplex( hwd_control_state_t * bgq_state )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
uint64_t bgpm_period;
|
|
Packit Service |
a1973e |
double Sec, Hz;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("_bgq_multiplex BEGIN: Num of Events = %d (vs %d)\n", Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// convert Mhz to Hz ( = cycles / sec )
|
|
Packit Service |
a1973e |
Hz = (double) _papi_hwi_system_info.hw_info.cpu_max_mhz * 1000 * 1000;
|
|
Packit Service |
a1973e |
// convert PAPI multiplex period (in ns) to BGPM period (in cycles)
|
|
Packit Service |
a1973e |
Sec = (double) _papi_os_info.itimer_ns / ( 1000 * 1000 * 1000 );
|
|
Packit Service |
a1973e |
bgpm_period = Hz * Sec;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// if EventGroup is not empty -- which is required by BGPM before
|
|
Packit Service |
a1973e |
// we can call SetMultiplex() -- then drain the events from the
|
|
Packit Service |
a1973e |
// BGPM EventGroup, turn on multiplex flag, and rebuild BGPM EventGroup.
|
|
Packit Service |
a1973e |
if ( 0 < bgq_state->count ) {
|
|
Packit Service |
a1973e |
// Delete and re-create BGPM eventset
|
|
Packit Service |
a1973e |
retval = _common_deleteRecreate( &bgq_state->EventGroup );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// turn on multiplex for BGPM
|
|
Packit Service |
a1973e |
retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_SetMultiplex" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// rebuild BGPM EventGroup
|
|
Packit Service |
a1973e |
retval = _common_rebuildEventgroup( bgq_state->count,
|
|
Packit Service |
a1973e |
bgq_state->EventGroup_local,
|
|
Packit Service |
a1973e |
&bgq_state->EventGroup );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
// need to pass either BGPM_NORMAL or BGPM_NOTNORMAL
|
|
Packit Service |
a1973e |
// BGPM_NORMAL: numbers reported by Bgpm_ReadEvent() are normalized
|
|
Packit Service |
a1973e |
// to the maximum time spent in a multiplexed group
|
|
Packit Service |
a1973e |
retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_SetMultiplex" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("_bgq_multiplex END: Num of Events = %d (vs %d) --- retval = %d\n",
|
|
Packit Service |
a1973e |
Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count, retval );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Register Allocation
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_allocate_registers( EventSetInfo_t * ESI )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("_bgq_allocate_registers\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int i, natNum;
|
|
Packit Service |
a1973e |
int xEventId;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Start monitoring the events...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
natNum = ESI->NativeCount;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < natNum; i++ ) {
|
|
Packit Service |
a1973e |
xEventId = ( ESI->NativeInfoArray[i].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
ESI->NativeInfoArray[i].ni_position = i;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Cleanup Eventset
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Destroy and re-create the BGPM / Punit EventSet
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_cleanup_eventset( hwd_control_state_t * ctrl )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_cleanup_eventset\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// set multiplexing flag to OFF (0)
|
|
Packit Service |
a1973e |
ctrl->muxOn = 0;
|
|
Packit Service |
a1973e |
// set overflow flag to OFF (0)
|
|
Packit Service |
a1973e |
ctrl->overflow = 0;
|
|
Packit Service |
a1973e |
ctrl->overflow_count = 0;
|
|
Packit Service |
a1973e |
// set BGPM eventGroup flag back to NOT applied yet (0)
|
|
Packit Service |
a1973e |
ctrl->bgpm_eventset_applied = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Update Control State
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* This function clears the current contents of the control
|
|
Packit Service |
a1973e |
* structure and updates it with whatever resources are allocated
|
|
Packit Service |
a1973e |
* for all the native events in the native info structure array.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_update_control_state( hwd_control_state_t * ptr,
|
|
Packit Service |
a1973e |
NativeInfo_t * native, int count,
|
|
Packit Service |
a1973e |
hwd_context_t * ctx )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( _AT_ " _bgq_update_control_state: count = %d, EventGroup=%d\n", count, ptr->EventGroup );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int i, j, k, index, retval;
|
|
Packit Service |
a1973e |
unsigned evtIdx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// Delete and re-create BGPM eventset
|
|
Packit Service |
a1973e |
retval = _common_deleteRecreate( &ptr->EventGroup );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( _AT_ " _bgq_update_control_state: EventGroup=%d, muxOn = %d, overflow = %d\n",
|
|
Packit Service |
a1973e |
ptr->EventGroup, ptr->muxOn, ptr->overflow );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// add the events to the eventset
|
|
Packit Service |
a1973e |
for ( i = 0; i < count; i++ ) {
|
|
Packit Service |
a1973e |
index = ( native[i].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
ptr->EventGroup_local[i] = index;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// we found an opcode event
|
|
Packit Service |
a1973e |
if ( index > BGQ_PUNIT_MAX_EVENTS ) {
|
|
Packit Service |
a1973e |
for( j = 0; j < num_opcode_events; j++ ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: %d out of %d OPCODES\n",
|
|
Packit Service |
a1973e |
j, num_opcode_events );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: j's idx = %d, index = %d\n",
|
|
Packit Service |
a1973e |
GenericEvent[j].idx, index );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
if ( GenericEvent[j].idx == ( index - 1) ) {
|
|
Packit Service |
a1973e |
/* Add events to the BGPM eventGroup */
|
|
Packit Service |
a1973e |
retval = Bgpm_AddEvent( ptr->EventGroup, GenericEvent[j].eventId );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_AddEvent" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: ADD event: i = %d, eventId = %d\n", i, GenericEvent[j].eventId );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
evtIdx = Bgpm_GetEventIndex( ptr->EventGroup,
|
|
Packit Service |
a1973e |
GenericEvent[j].eventId,
|
|
Packit Service |
a1973e |
i );
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: evtIdx in EventGroup = %d\n",
|
|
Packit Service |
a1973e |
evtIdx );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
if ( 0 == strcmp( GenericEvent[j].mask, "PEVT_INST_XU_GRP_MASK" ) ) {
|
|
Packit Service |
a1973e |
retval = Bgpm_SetXuGrpMask( ptr->EventGroup,
|
|
Packit Service |
a1973e |
evtIdx,
|
|
Packit Service |
a1973e |
GenericEvent[j].opcode_mask );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_SetXuGrpMask" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: it's PEVT_INST_XU_GRP_MASK\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
} else if ( 0 == strcmp( GenericEvent[j].mask, "PEVT_INST_QFPU_GRP_MASK" ) ) {
|
|
Packit Service |
a1973e |
retval = Bgpm_SetQfpuGrpMask( ptr->EventGroup,
|
|
Packit Service |
a1973e |
evtIdx,
|
|
Packit Service |
a1973e |
GenericEvent[j].opcode_mask );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_SetQfpuGrpMask" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: it's PEVT_INST_QFPU_GRP_MASK\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: no OPCODE\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Add events to the BGPM eventGroup */
|
|
Packit Service |
a1973e |
retval = Bgpm_AddEvent( ptr->EventGroup, index );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_AddEvent" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_update_control_state: ADD event: i = %d, index = %d\n", i, index );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// store how many events we added to an EventSet
|
|
Packit Service |
a1973e |
ptr->count = count;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// if muxOn and EventGroup is not empty -- which is required by BGPM before
|
|
Packit Service |
a1973e |
// we can call SetMultiplex() -- then drain the events from the
|
|
Packit Service |
a1973e |
// BGPM EventGroup, turn on multiplex flag, and rebuild BGPM EventGroup.
|
|
Packit Service |
a1973e |
if ( 1 == ptr->muxOn ) {
|
|
Packit Service |
a1973e |
retval = _bgq_multiplex( ptr );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// since update_control_state trashes overflow settings, this puts things
|
|
Packit Service |
a1973e |
// back into balance for BGPM
|
|
Packit Service |
a1973e |
if ( 1 == ptr->overflow ) {
|
|
Packit Service |
a1973e |
for ( k = 0; k < ptr->overflow_count; k++ ) {
|
|
Packit Service |
a1973e |
retval = _common_set_overflow_BGPM( ptr->EventGroup,
|
|
Packit Service |
a1973e |
ptr->overflow_list[k].EventIndex,
|
|
Packit Service |
a1973e |
ptr->overflow_list[k].threshold,
|
|
Packit Service |
a1973e |
user_signal_handler );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Start
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_start( hwd_context_t * ctx, hwd_control_state_t * ptr )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "BEGIN _bgq_start\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_Apply( ptr->EventGroup );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Apply" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// set flag to 1: BGPM eventGroup HAS BEEN applied
|
|
Packit Service |
a1973e |
ptr->bgpm_eventset_applied = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
int numEvts = Bgpm_NumEvents( ptr->EventGroup );
|
|
Packit Service |
a1973e |
for ( i = 0; i < numEvts; i++ ) {
|
|
Packit Service |
a1973e |
printf("%d = %s\n", i, Bgpm_GetEventLabel( ptr->EventGroup, i) );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Bgpm_Apply() does an implicit reset;
|
|
Packit Service |
a1973e |
hence no need to use Bgpm_ResetStart */
|
|
Packit Service |
a1973e |
retval = Bgpm_Start( ptr->EventGroup );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Start" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Stop
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_stop( hwd_context_t * ctx, hwd_control_state_t * ptr )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "BEGIN _bgq_stop\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_Stop( ptr->EventGroup );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Stop" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Read Counters
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Read the counters into local storage
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_read( hwd_context_t * ctx, hwd_control_state_t * ptr,
|
|
Packit Service |
a1973e |
long_long ** dp, int flags )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_read\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
( void ) flags;
|
|
Packit Service |
a1973e |
int i, numEvts;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
numEvts = Bgpm_NumEvents( ptr->EventGroup );
|
|
Packit Service |
a1973e |
if ( numEvts == 0 ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
printf ("Error: ret value is %d for BGPM API function Bgpm_NumEvents.\n", numEvts );
|
|
Packit Service |
a1973e |
//return ( EXIT_FAILURE );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < numEvts; i++ )
|
|
Packit Service |
a1973e |
ptr->counters[i] = _common_getEventValue( i, ptr->EventGroup );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
*dp = ptr->counters;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Reset
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Zero the counter values
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_reset( hwd_context_t * ctx, hwd_control_state_t * ptr )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_reset\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* we can't simply call Bgpm_Reset() since PAPI doesn't have the
|
|
Packit Service |
a1973e |
restriction that an EventSet has to be stopped before resetting is
|
|
Packit Service |
a1973e |
possible. However, BGPM does have this restriction.
|
|
Packit Service |
a1973e |
Hence we need to stop, reset and start */
|
|
Packit Service |
a1973e |
retval = Bgpm_Stop( ptr->EventGroup );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Stop" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_ResetStart( ptr->EventGroup );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_ResetStart" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Shutdown
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* This routine is for shutting down threads,
|
|
Packit Service |
a1973e |
* including the master thread.
|
|
Packit Service |
a1973e |
* Effectively a no-op, same as BG/L/P...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_shutdown( hwd_context_t * ctx )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_shutdown\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Disable BGPM library */
|
|
Packit Service |
a1973e |
retval = Bgpm_Disable();
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_Disable" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Write
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Write counter values
|
|
Packit Service |
a1973e |
* NOTE: Could possible support, but signal error as BG/L/P does...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_write( hwd_context_t * ctx, hwd_control_state_t * cntrl, long_long * from )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_write\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
( void ) cntrl;
|
|
Packit Service |
a1973e |
( void ) from;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_ECMP;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Dispatch Timer
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* NOT the same as BG/L/P where we simply return
|
|
Packit Service |
a1973e |
* This function is used when hardware overflows are working or when
|
|
Packit Service |
a1973e |
* software overflows are forced
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
_bgq_dispatch_timer( int signal, hwd_siginfo_t * info, void *uc )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
( void ) signal;
|
|
Packit Service |
a1973e |
( void ) info;
|
|
Packit Service |
a1973e |
( void ) uc;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("BEGIN _bgq_dispatch_timer\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* user_signal_handler
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* This function is used when hardware overflows are working or when
|
|
Packit Service |
a1973e |
* software overflows are forced
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
user_signal_handler( int hEvtSet, uint64_t address, uint64_t ovfVector, const ucontext_t *pContext )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "user_signal_handler start\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) address;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
unsigned i;
|
|
Packit Service |
a1973e |
int isHardware = 1;
|
|
Packit Service |
a1973e |
int cidx = _bgq_vectors.cmp_info.CmpIdx;
|
|
Packit Service |
a1973e |
long_long overflow_bit = 0;
|
|
Packit Service |
a1973e |
caddr_t address1;
|
|
Packit Service |
a1973e |
_papi_hwi_context_t ctx;
|
|
Packit Service |
a1973e |
ctx.ucontext = ( hwd_ucontext_t * ) pContext;
|
|
Packit Service |
a1973e |
ThreadInfo_t *thread = _papi_hwi_lookup_thread( 0 );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
//printf(_AT_ " thread = %p\n", thread); // <<<<<<<<<<<<<<<<<<
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
EventSetInfo_t *ESI;
|
|
Packit Service |
a1973e |
ESI = thread->running_eventset[cidx];
|
|
Packit Service |
a1973e |
// Get the indices of all events which have overflowed.
|
|
Packit Service |
a1973e |
unsigned ovfIdxs[BGPM_MAX_OVERFLOW_EVENTS];
|
|
Packit Service |
a1973e |
unsigned len = BGPM_MAX_OVERFLOW_EVENTS;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_GetOverflowEventIndices( hEvtSet, ovfVector, ovfIdxs, &len );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( retval < 0 ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
printf ( "Error: ret value is %d for BGPM API function Bgpm_GetOverflowEventIndices.\n",
|
|
Packit Service |
a1973e |
retval );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( thread == NULL ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "thread == NULL in user_signal_handler!" );
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ESI == NULL ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "ESI == NULL in user_signal_handler!");
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ESI->overflow.flags == 0 ) {
|
|
Packit Service |
a1973e |
PAPIERROR( "ESI->overflow.flags == 0 in user_signal_handler!");
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < len; i++ ) {
|
|
Packit Service |
a1973e |
uint64_t hProf;
|
|
Packit Service |
a1973e |
Bgpm_GetEventUser1( hEvtSet, ovfIdxs[i], &hProf );
|
|
Packit Service |
a1973e |
if ( hProf ) {
|
|
Packit Service |
a1973e |
overflow_bit ^= 1 << ovfIdxs[i];
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ESI->overflow.flags & PAPI_OVERFLOW_FORCE_SW ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("OVERFLOW_SOFTWARE\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
address1 = GET_OVERFLOW_ADDRESS( ctx );
|
|
Packit Service |
a1973e |
_papi_hwi_dispatch_overflow_signal( ( void * ) &ctx, address1, NULL, 0, 0, &thread, cidx );
|
|
Packit Service |
a1973e |
return;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else if ( ESI->overflow.flags & PAPI_OVERFLOW_HARDWARE ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("OVERFLOW_HARDWARE\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
address1 = GET_OVERFLOW_ADDRESS( ctx );
|
|
Packit Service |
a1973e |
_papi_hwi_dispatch_overflow_signal( ( void * ) &ctx, address1, &isHardware, overflow_bit, 0, &thread, cidx );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("OVERFLOW_NONE\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
PAPIERROR( "ESI->overflow.flags is set to something other than PAPI_OVERFLOW_HARDWARE or PAPI_OVERFLOW_FORCE_SW (%#x)", thread->running_eventset[cidx]->overflow.flags);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Set Overflow
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* This is commented out in BG/L/P - need to explore and complete...
|
|
Packit Service |
a1973e |
* However, with true 64-bit counters in BG/Q and all counters for PAPI
|
|
Packit Service |
a1973e |
* always starting from a true zero (we don't allow write...), the possibility
|
|
Packit Service |
a1973e |
* for overflow is remote at best...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_set_overflow( EventSetInfo_t * ESI, int EventIndex, int threshold )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("BEGIN _bgq_set_overflow\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
hwd_control_state_t * this_state = ( hwd_control_state_t * ) ESI->ctl_state;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
int evt_idx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* In case an BGPM eventGroup HAS BEEN applied or attached before
|
|
Packit Service |
a1973e |
* overflow is set, delete the eventGroup and create an new empty one,
|
|
Packit Service |
a1973e |
* and rebuild as it was prior to deletion
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_set_overflow: bgpm_eventset_applied = %d, threshold = %d\n",
|
|
Packit Service |
a1973e |
this_state->bgpm_eventset_applied, threshold );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
if ( 1 == this_state->bgpm_eventset_applied && 0 != threshold ) {
|
|
Packit Service |
a1973e |
retval = _common_deleteRecreate( &this_state->EventGroup );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _common_rebuildEventgroup( this_state->count,
|
|
Packit Service |
a1973e |
this_state->EventGroup_local,
|
|
Packit Service |
a1973e |
&this_state->EventGroup );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* set BGPM eventGroup flag back to NOT applied yet (0)
|
|
Packit Service |
a1973e |
* because the eventGroup has been recreated from scratch */
|
|
Packit Service |
a1973e |
this_state->bgpm_eventset_applied = 0;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
evt_idx = ESI->EventInfoArray[EventIndex].pos[0];
|
|
Packit Service |
a1973e |
//evt_id = ( ESI->NativeInfoArray[EventIndex].ni_event & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
SUBDBG( "Hardware counter %d (vs %d) used in overflow, threshold %d\n",
|
|
Packit Service |
a1973e |
evt_idx, EventIndex, threshold );
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "Hardware counter %d (vs %d) used in overflow, threshold %d\n",
|
|
Packit Service |
a1973e |
evt_idx, EventIndex, threshold );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* If this counter isn't set to overflow, it's an error */
|
|
Packit Service |
a1973e |
if ( threshold == 0 ) {
|
|
Packit Service |
a1973e |
/* Remove the signal handler */
|
|
Packit Service |
a1973e |
retval = _papi_hwi_stop_signal( _bgq_vectors.cmp_info.hardware_intr_sig );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
this_state->overflow = 1;
|
|
Packit Service |
a1973e |
this_state->overflow_count++;
|
|
Packit Service |
a1973e |
this_state->overflow_list[this_state->overflow_count-1].threshold = threshold;
|
|
Packit Service |
a1973e |
this_state->overflow_list[this_state->overflow_count-1].EventIndex = evt_idx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_set_overflow: Enable the signal handler\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
/* Enable the signal handler */
|
|
Packit Service |
a1973e |
retval = _papi_hwi_start_signal( _bgq_vectors.cmp_info.hardware_intr_sig,
|
|
Packit Service |
a1973e |
NEED_CONTEXT,
|
|
Packit Service |
a1973e |
_bgq_vectors.cmp_info.CmpIdx );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = _common_set_overflow_BGPM( this_state->EventGroup,
|
|
Packit Service |
a1973e |
this_state->overflow_list[this_state->overflow_count-1].EventIndex,
|
|
Packit Service |
a1973e |
this_state->overflow_list[this_state->overflow_count-1].threshold,
|
|
Packit Service |
a1973e |
user_signal_handler );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Set Profile
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same as for BG/L/P, routine not used and returns error
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_set_profile( EventSetInfo_t * ESI, int EventIndex, int threshold )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("BEGIN _bgq_set_profile\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
( void ) ESI;
|
|
Packit Service |
a1973e |
( void ) EventIndex;
|
|
Packit Service |
a1973e |
( void ) threshold;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_ECMP;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Stop Profiling
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same as for BG/L/P...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_stop_profiling( ThreadInfo_t * master, EventSetInfo_t * ESI )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("BEGIN _bgq_stop_profiling\n");
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
( void ) master;
|
|
Packit Service |
a1973e |
( void ) ESI;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Control
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same as for BG/L/P - initialize the domain
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ctl\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
( void ) ctx;
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
switch ( code ) {
|
|
Packit Service |
a1973e |
case PAPI_MULTIPLEX:
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
hwd_control_state_t * bgq_state = ( ( hwd_control_state_t * ) option->multiplex.ESI->ctl_state );
|
|
Packit Service |
a1973e |
bgq_state->muxOn = 1;
|
|
Packit Service |
a1973e |
retval = _bgq_multiplex( bgq_state );
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
default:
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Get Real Micro-seconds
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
long long
|
|
Packit Service |
a1973e |
_bgq_get_real_usec( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_get_real_usec\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* NOTE: _papi_hwi_system_info.hw_info.mhz is really a representation of unit of time per cycle.
|
|
Packit Service |
a1973e |
* On BG/P, it's value is 8.5e-4. Therefore, to get cycles per sec, we have to multiply
|
|
Packit Service |
a1973e |
* by 1.0e12. To then convert to usec, we have to divide by 1.0e-3.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
return ( ( long long ) ( ( ( float ) get_cycles( ) ) /
|
|
Packit Service |
a1973e |
( ( _papi_hwi_system_info.hw_info.cpu_max_mhz ) ) ) );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Get Real Cycles
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same for BG/L/P, using native function...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
long long
|
|
Packit Service |
a1973e |
_bgq_get_real_cycles( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_get_real_cycles\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( ( long long ) get_cycles( ) );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Get Virtual Micro-seconds
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same calc as for BG/L/P, returns real usec...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
long long
|
|
Packit Service |
a1973e |
_bgq_get_virt_usec( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_get_virt_usec\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return _bgq_get_real_usec( );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Get Virtual Cycles
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Same calc as for BG/L/P, returns real cycles...
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
long long
|
|
Packit Service |
a1973e |
_bgq_get_virt_cycles( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_get_virt_cycles\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return _bgq_get_real_cycles( );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Component setup and shutdown
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Initialize hardware counters, setup the function vector table
|
|
Packit Service |
a1973e |
* and get hardware information, this routine is called when the
|
|
Packit Service |
a1973e |
* PAPI process is initialized (IE PAPI_library_init)
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_init_component( int cidx )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf("_bgq_init_substrate\n");
|
|
Packit Service |
a1973e |
//printf("_bgq_init_substrate: 1. BGPM_INITIALIZED = %d \n", BGPM_INITIALIZED);
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* allocate the opcode event structure */
|
|
Packit Service |
a1973e |
GenericEvent = calloc( OPCODE_EVENT_CHUNK, sizeof( struct bgq_generic_events_t ) );
|
|
Packit Service |
a1973e |
if ( NULL == GenericEvent ) {
|
|
Packit Service |
a1973e |
return PAPI_ENOMEM;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* init opcode event stuff */
|
|
Packit Service |
a1973e |
allocated_opcode_events = OPCODE_EVENT_CHUNK;
|
|
Packit Service |
a1973e |
num_opcode_events = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
_bgq_vectors.cmp_info.CmpIdx = cidx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Fill in what we can of the papi_system_info
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
SUBDBG( "Before _bgq_get_system_info()...\n" );
|
|
Packit Service |
a1973e |
retval = _bgq_get_system_info( &_papi_hwi_system_info );
|
|
Packit Service |
a1973e |
SUBDBG( "After _bgq_get_system_info(), retval=%d...\n", retval );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Setup memory info
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
SUBDBG( "Before _bgq_get_memory_info...\n" );
|
|
Packit Service |
a1973e |
retval = _bgq_get_memory_info( &_papi_hwi_system_info.hw_info,
|
|
Packit Service |
a1973e |
( int ) _papi_hwi_system_info.hw_info.
|
|
Packit Service |
a1973e |
model );
|
|
Packit Service |
a1973e |
SUBDBG( "After _bgq_get_memory_info, retval=%d...\n", retval );
|
|
Packit Service |
a1973e |
if ( retval )
|
|
Packit Service |
a1973e |
return ( retval );
|
|
Packit Service |
a1973e |
#if 1
|
|
Packit Service |
a1973e |
/* Setup Locks */
|
|
Packit Service |
a1973e |
for ( i = 0; i < PAPI_MAX_LOCK; i++ )
|
|
Packit Service |
a1973e |
thdLocks[i] = 0; // MUTEX_OPEN
|
|
Packit Service |
a1973e |
#else
|
|
Packit Service |
a1973e |
for( i = 0; i < PAPI_MAX_LOCK; i++ ) {
|
|
Packit Service |
a1973e |
pthread_mutex_init( &thdLocks[i], NULL );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Setup presets */
|
|
Packit Service |
a1973e |
retval = _papi_load_preset_table( "BGQ", 0, cidx );
|
|
Packit Service |
a1973e |
if ( retval ) {
|
|
Packit Service |
a1973e |
return retval;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*************************************/
|
|
Packit Service |
a1973e |
/* CODE TO SUPPORT OPAQUE NATIVE MAP */
|
|
Packit Service |
a1973e |
/*************************************/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Event Name to Native Code
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ntv_name_to_code( const char *name, unsigned int *event_code )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ntv_name_to_code\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int ret;
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "name = ===%s===\n", name );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Treat events differently if BGPM Opcodes are used */
|
|
Packit Service |
a1973e |
/* Opcode group selection values are "OR"ed together to create a desired
|
|
Packit Service |
a1973e |
mask of instruction group events to accumulate in the same counter */
|
|
Packit Service |
a1973e |
if ( 0 == strncmp( name, "PEVT_INST_XU_GRP_MASK", strlen( "PEVT_INST_XU_GRP_MASK" ) ) ||
|
|
Packit Service |
a1973e |
0 == strncmp( name, "PEVT_INST_QFPU_GRP_MASK", strlen( "PEVT_INST_QFPU_GRP_MASK" ) ) ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
char *pcolon;
|
|
Packit Service |
a1973e |
pcolon = strchr( name, ':' );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
// Found colon separator
|
|
Packit Service |
a1973e |
if ( pcolon != NULL ) {
|
|
Packit Service |
a1973e |
int mask_len = pcolon - name;
|
|
Packit Service |
a1973e |
strncpy( GenericEvent[num_opcode_events].mask, name, mask_len );
|
|
Packit Service |
a1973e |
strncpy( GenericEvent[num_opcode_events].opcode, pcolon+1, strlen(name) - 1 - mask_len );
|
|
Packit Service |
a1973e |
/* opcode_mask needs to be 'uint64_t',
|
|
Packit Service |
a1973e |
hence we use strtoull() which returns an 'unsigned long long int' */
|
|
Packit Service |
a1973e |
GenericEvent[num_opcode_events].opcode_mask = strtoull( GenericEvent[num_opcode_events].opcode, (char **)NULL, 16 );
|
|
Packit Service |
a1973e |
GenericEvent[num_opcode_events].idx = OPCODE_BUF + num_opcode_events;
|
|
Packit Service |
a1973e |
/* Return event id matching the generic XU/QFPU event string */
|
|
Packit Service |
a1973e |
GenericEvent[num_opcode_events].eventId = Bgpm_GetEventIdFromLabel( GenericEvent[num_opcode_events].mask );
|
|
Packit Service |
a1973e |
if ( GenericEvent[num_opcode_events].eventId <= 0 ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
printf ("Error: ret value is %d for BGPM API function '%s'.\n",
|
|
Packit Service |
a1973e |
ret, "Bgpm_GetEventIdFromLabel" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
*event_code = GenericEvent[num_opcode_events].idx;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
num_opcode_events++;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* If there are too many opcode events than allocated, then allocate more room */
|
|
Packit Service |
a1973e |
if( num_opcode_events >= allocated_opcode_events ) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
SUBDBG("Allocating more room for BGPM opcode events (%d %ld)\n",
|
|
Packit Service |
a1973e |
( allocated_opcode_events + NATIVE_OPCODE_CHUNK ),
|
|
Packit Service |
a1973e |
( long )sizeof( struct bgq_generic_events_t ) *
|
|
Packit Service |
a1973e |
( allocated_opcode_events + NATIVE_OPCODE_CHUNK ) );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
GenericEvent = realloc( GenericEvent, sizeof( struct bgq_generic_events_t ) *
|
|
Packit Service |
a1973e |
( allocated_opcode_events + OPCODE_EVENT_CHUNK ) );
|
|
Packit Service |
a1973e |
if ( NULL == GenericEvent ) {
|
|
Packit Service |
a1973e |
return PAPI_ENOMEM;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
allocated_opcode_events += OPCODE_EVENT_CHUNK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
SUBDBG( "Error: Found a generic BGPM event mask without opcode string\n" );
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf(_AT_ " _bgq_ntv_name_to_code: GenericEvent no. %d: \n", num_opcode_events-1 );
|
|
Packit Service |
a1973e |
printf( "idx = %d\n", GenericEvent[num_opcode_events-1].idx);
|
|
Packit Service |
a1973e |
printf( "eventId = %d\n", GenericEvent[num_opcode_events-1].eventId);
|
|
Packit Service |
a1973e |
printf( "mask = %s\n", GenericEvent[num_opcode_events-1].mask);
|
|
Packit Service |
a1973e |
printf( "opcode = %s\n", GenericEvent[num_opcode_events-1].opcode);
|
|
Packit Service |
a1973e |
printf( "opcode_mask = %#lX (%lu)\n", GenericEvent[num_opcode_events-1].opcode_mask,
|
|
Packit Service |
a1973e |
GenericEvent[num_opcode_events-1].opcode_mask );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else {
|
|
Packit Service |
a1973e |
/* Return event id matching a given event label string */
|
|
Packit Service |
a1973e |
ret = Bgpm_GetEventIdFromLabel ( name );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ret <= 0 ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
printf ("Error: ret value is %d for BGPM API function '%s'.\n",
|
|
Packit Service |
a1973e |
ret, "Bgpm_GetEventIdFromLabel" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
else if ( ret > BGQ_PUNIT_MAX_EVENTS ) // not a PUnit event
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
else
|
|
Packit Service |
a1973e |
*event_code = ( ret - 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Native Code to Event Name
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Given a native event code, returns the short text label
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ntv_code_to_name( unsigned int EventCode, char *name, int len )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ntv_code_to_name\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int index = ( EventCode & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( index >= MAX_COUNTERS )
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strncpy( name, Bgpm_GetEventIdLabel( index ), len );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( name == NULL ) {
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGPM
|
|
Packit Service |
a1973e |
printf ("Error: ret value is NULL for BGPM API function Bgpm_GetEventIdLabel.\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
return PAPI_ENOEVNT;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "name = ===%s===\n", name );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Native Code to Event Description
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Given a native event code, returns the longer native event description
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ntv_code_to_descr\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
int retval;
|
|
Packit Service |
a1973e |
int index = ( EventCode & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = Bgpm_GetLongDesc( index, name, &len );
|
|
Packit Service |
a1973e |
retval = _check_BGPM_error( retval, "Bgpm_GetLongDesc" );
|
|
Packit Service |
a1973e |
if ( retval < 0 ) return retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Native Code to Bit Configuration
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Given a native event code, assigns the native event's
|
|
Packit Service |
a1973e |
* information to a given pointer.
|
|
Packit Service |
a1973e |
* NOTE: The info must be COPIED to location addressed by
|
|
Packit Service |
a1973e |
* the provided pointer, not just referenced!
|
|
Packit Service |
a1973e |
* NOTE: For BG/Q, the bit configuration is not needed,
|
|
Packit Service |
a1973e |
* as the native SPI is used to configure events.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ntv_code_to_bits( unsigned int EventCode, hwd_register_t * bits )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ntv_code_to_bits\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
( void ) EventCode;
|
|
Packit Service |
a1973e |
( void ) bits;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Native ENUM Events
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_bgq_ntv_enum_events( unsigned int *EventCode, int modifier )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
#ifdef DEBUG_BGQ
|
|
Packit Service |
a1973e |
printf( "_bgq_ntv_enum_events\n" );
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
switch ( modifier ) {
|
|
Packit Service |
a1973e |
case PAPI_ENUM_FIRST:
|
|
Packit Service |
a1973e |
*EventCode = PAPI_NATIVE_MASK;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
case PAPI_ENUM_EVENTS:
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int index = ( *EventCode & PAPI_NATIVE_AND_MASK ) + 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( index < BGQ_PUNIT_MAX_EVENTS ) {
|
|
Packit Service |
a1973e |
*EventCode = *EventCode + 1;
|
|
Packit Service |
a1973e |
return ( PAPI_OK );
|
|
Packit Service |
a1973e |
} else
|
|
Packit Service |
a1973e |
return ( PAPI_ENOEVNT );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
default:
|
|
Packit Service |
a1973e |
return ( PAPI_EINVAL );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return ( PAPI_EINVAL );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
_papi_hwi_init_os(void) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct utsname uname_buffer;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Get the kernel info */
|
|
Packit Service |
a1973e |
uname(&uname_buffer);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strncpy(_papi_os_info.name,uname_buffer.sysname,PAPI_MAX_STR_LEN);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
strncpy(_papi_os_info.version,uname_buffer.release,PAPI_MAX_STR_LEN);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
_papi_os_info.itimer_sig = PAPI_INT_MPX_SIGNAL;
|
|
Packit Service |
a1973e |
_papi_os_info.itimer_num = PAPI_INT_ITIMER;
|
|
Packit Service |
a1973e |
_papi_os_info.itimer_res_ns = 1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return PAPI_OK;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* PAPI Vector Table for BG/Q
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
papi_vector_t _bgq_vectors = {
|
|
Packit Service |
a1973e |
.cmp_info = {
|
|
Packit Service |
a1973e |
/* Default component information (unspecified values are initialized to 0) */
|
|
Packit Service |
a1973e |
.name = "linux-bgq",
|
|
Packit Service |
a1973e |
.short_name = "bgq",
|
|
Packit Service |
a1973e |
.description = "Blue Gene/Q component",
|
|
Packit Service |
a1973e |
.num_cntrs = BGQ_PUNIT_MAX_COUNTERS,
|
|
Packit Service |
a1973e |
.num_mpx_cntrs = BGQ_PUNIT_MAX_COUNTERS,
|
|
Packit Service |
a1973e |
.num_native_events = BGQ_PUNIT_MAX_EVENTS,
|
|
Packit Service |
a1973e |
.default_domain = PAPI_DOM_USER,
|
|
Packit Service |
a1973e |
.available_domains = PAPI_DOM_USER | PAPI_DOM_KERNEL,
|
|
Packit Service |
a1973e |
.default_granularity = PAPI_GRN_THR,
|
|
Packit Service |
a1973e |
.available_granularities = PAPI_GRN_THR,
|
|
Packit Service |
a1973e |
.hardware_intr_sig = PAPI_INT_SIGNAL,
|
|
Packit Service |
a1973e |
.hardware_intr = 1,
|
|
Packit Service |
a1973e |
.kernel_multiplex = 1,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* component specific cmp_info initializations */
|
|
Packit Service |
a1973e |
.fast_real_timer = 1,
|
|
Packit Service |
a1973e |
.fast_virtual_timer = 0,
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
,
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Sizes of framework-opaque component-private structures */
|
|
Packit Service |
a1973e |
.size = {
|
|
Packit Service |
a1973e |
.context = sizeof ( hwd_context_t ),
|
|
Packit Service |
a1973e |
.control_state = sizeof ( hwd_control_state_t ),
|
|
Packit Service |
a1973e |
.reg_value = sizeof ( hwd_register_t ),
|
|
Packit Service |
a1973e |
.reg_alloc = sizeof ( hwd_reg_alloc_t ),
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
,
|
|
Packit Service |
a1973e |
/* Function pointers in this component */
|
|
Packit Service |
a1973e |
// .get_overflow_address =
|
|
Packit Service |
a1973e |
.start = _bgq_start,
|
|
Packit Service |
a1973e |
.stop = _bgq_stop,
|
|
Packit Service |
a1973e |
.read = _bgq_read,
|
|
Packit Service |
a1973e |
.reset = _bgq_reset,
|
|
Packit Service |
a1973e |
.write = _bgq_write,
|
|
Packit Service |
a1973e |
.stop_profiling = _bgq_stop_profiling,
|
|
Packit Service |
a1973e |
.init_component = _bgq_init_component,
|
|
Packit Service |
a1973e |
.init_thread = _bgq_init,
|
|
Packit Service |
a1973e |
.init_control_state = _bgq_init_control_state,
|
|
Packit Service |
a1973e |
.update_control_state = _bgq_update_control_state,
|
|
Packit Service |
a1973e |
.ctl = _bgq_ctl,
|
|
Packit Service |
a1973e |
.set_overflow = _bgq_set_overflow,
|
|
Packit Service |
a1973e |
//.dispatch_timer = _bgq_dispatch_timer,
|
|
Packit Service |
a1973e |
.set_profile = _bgq_set_profile,
|
|
Packit Service |
a1973e |
.set_domain = _bgq_set_domain,
|
|
Packit Service |
a1973e |
.ntv_enum_events = _bgq_ntv_enum_events,
|
|
Packit Service |
a1973e |
.ntv_name_to_code = _bgq_ntv_name_to_code,
|
|
Packit Service |
a1973e |
.ntv_code_to_name = _bgq_ntv_code_to_name,
|
|
Packit Service |
a1973e |
.ntv_code_to_descr = _bgq_ntv_code_to_descr,
|
|
Packit Service |
a1973e |
.ntv_code_to_bits = _bgq_ntv_code_to_bits,
|
|
Packit Service |
a1973e |
.allocate_registers = _bgq_allocate_registers,
|
|
Packit Service |
a1973e |
.cleanup_eventset = _bgq_cleanup_eventset,
|
|
Packit Service |
a1973e |
.shutdown_thread = _bgq_shutdown
|
|
Packit Service |
a1973e |
// .shutdown_global =
|
|
Packit Service |
a1973e |
// .user =
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
papi_os_vector_t _papi_os_vector = {
|
|
Packit Service |
a1973e |
.get_memory_info = _bgq_get_memory_info,
|
|
Packit Service |
a1973e |
.get_dmem_info = _bgq_get_dmem_info,
|
|
Packit Service |
a1973e |
.get_real_cycles = _bgq_get_real_cycles,
|
|
Packit Service |
a1973e |
.get_real_usec = _bgq_get_real_usec,
|
|
Packit Service |
a1973e |
.get_virt_cycles = _bgq_get_virt_cycles,
|
|
Packit Service |
a1973e |
.get_virt_usec = _bgq_get_virt_usec,
|
|
Packit Service |
a1973e |
.get_system_info = _bgq_get_system_info
|
|
Packit Service |
a1973e |
};
|