|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: native.c
|
|
Packit |
577717 |
* Mods: Maynard Johnson
|
|
Packit |
577717 |
* maynardj@us.ibm.com
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
This test defines an array of native event names, either at compile time
|
|
Packit |
577717 |
or at run time (some x86 platforms). It then:
|
|
Packit |
577717 |
- add the table of events to an event set;
|
|
Packit |
577717 |
- starts counting
|
|
Packit |
577717 |
- does a little work
|
|
Packit |
577717 |
- stops counting;
|
|
Packit |
577717 |
- reports the results.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
extern int TESTS_QUIET; /* Declared in test_utils.c */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if (defined(PPC32))
|
|
Packit |
577717 |
/* Select 4 events common to both ppc750 and ppc7450 */
|
|
Packit |
577717 |
static char *native_name[] = { "CPU_CLK", "FLOPS", "TOT_INS", "BR_MSP", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(_POWER4) || defined(_PPC970)
|
|
Packit |
577717 |
/* arbitrarily code events from group 28: pm_fpu3 - Floating point events by unit */
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "PM_FPU0_FDIV", "PM_FPU1_FDIV", "PM_FPU0_FRSP_FCONV",
|
|
Packit |
577717 |
"PM_FPU1_FRSP_FCONV",
|
|
Packit |
577717 |
"PM_FPU0_FMA", "PM_FPU1_FMA", "PM_INST_CMPL", "PM_CYC", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(_POWER5p)
|
|
Packit |
577717 |
/* arbitrarily code events from group 33: pm_fpustall - Floating Point Unit stalls */
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "PM_FPU_FULL_CYC", "PM_CMPLU_STALL_FDIV", "PM_CMPLU_STALL_FPU",
|
|
Packit |
577717 |
"PM_RUN_INST_CMPL", "PM_RUN_CYC", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(_POWER5)
|
|
Packit |
577717 |
/* arbitrarily code events from group 78: pm_fpu1 - Floating Point events */
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "PM_FPU_FDIV", "PM_FPU_FMA", "PM_FPU_FMOV_FEST", "PM_FPU_FEST",
|
|
Packit |
577717 |
"PM_INST_CMPL", "PM_RUN_CYC", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(POWER3)
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "PM_IC_MISS", "PM_FPU1_CMPL", "PM_LD_MISS_L1", "PM_LD_CMPL",
|
|
Packit |
577717 |
"PM_FPU0_CMPL", "PM_CYC", "PM_TLB_MISS", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(__ia64__)
|
|
Packit |
577717 |
#ifdef ITANIUM2
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "CPU_CYCLES", "L1I_READS", "L1D_READS_SET0", "IA64_INST_RETIRED", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "DEPENDENCY_SCOREBOARD_CYCLE", "DEPENDENCY_ALL_CYCLE",
|
|
Packit |
577717 |
"UNSTALLED_BACKEND_CYCLE", "MEMORY_CYCLE", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif ((defined(linux) && (defined(__i386__) || (defined __x86_64__))) )
|
|
Packit |
577717 |
static char *p3_native_name[] = { "DATA_MEM_REFS", "DCU_LINES_IN", NULL };
|
|
Packit |
577717 |
static char *core_native_name[] = { "UnhltCore_Cycles", "Instr_Retired", NULL };
|
|
Packit |
577717 |
static char *k7_native_name[] =
|
|
Packit |
577717 |
{ "TOT_CYC", "IC_MISSES", "DC_ACCESSES", "DC_MISSES", NULL };
|
|
Packit |
577717 |
// static char *k8_native_name[] = { "FP_ADD_PIPE", "FP_MULT_PIPE", "FP_ST_PIPE", "FP_NONE_RET", NULL };
|
|
Packit |
577717 |
static char *k8_native_name[] =
|
|
Packit |
577717 |
{ "DISPATCHED_FPU:OPS_ADD", "DISPATCHED_FPU:OPS_MULTIPLY",
|
|
Packit |
577717 |
"DISPATCHED_FPU:OPS_STORE", "CYCLES_NO_FPU_OPS_RETIRED", NULL };
|
|
Packit |
577717 |
static char *p4_native_name[] =
|
|
Packit |
577717 |
{ "retired_mispred_branch_type:CONDITIONAL", "resource_stall:SBFULL",
|
|
Packit |
577717 |
"tc_ms_xfer:CISC", "instr_retired:BOGUSNTAG:BOGUSTAG",
|
|
Packit |
577717 |
"BSQ_cache_reference:RD_2ndL_HITS", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
static char **native_name = p3_native_name;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(mips) && defined(sgi)
|
|
Packit |
577717 |
static char *native_name[] = { "Primary_instruction_cache_misses",
|
|
Packit |
577717 |
"Primary_data_cache_misses", NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
#elif defined(mips) && defined(linux)
|
|
Packit |
577717 |
static char *native_name[] = { "CYCLES", NULL };
|
|
Packit |
577717 |
#elif defined(sun) && defined(sparc)
|
|
Packit |
577717 |
static char *native_name[] = { "Cycle_cnt", "Instr_cnt", NULL };
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(_BGL)
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "BGL_UPC_PU0_PREF_STREAM_HIT", "BGL_PAPI_TIMEBASE",
|
|
Packit |
577717 |
"BGL_UPC_PU1_PREF_STREAM_HIT", NULL };
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#elif defined(__bgp__)
|
|
Packit |
577717 |
static char *native_name[] =
|
|
Packit |
577717 |
{ "PNE_BGP_PU0_JPIPE_LOGICAL_OPS", "PNE_BGP_PU0_JPIPE_LOGICAL_OPS",
|
|
Packit |
577717 |
"PNE_BGP_PU2_IPIPE_INSTRUCTIONS", NULL };
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
#error "Architecture not supported in test file."
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, retval, native;
|
|
Packit |
577717 |
const PAPI_hw_info_t *hwinfo;
|
|
Packit |
577717 |
long long values[8];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
tests_quiet( argc, argv ); /* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval =
|
|
Packit |
577717 |
PAPI_library_init( PAPI_VER_CURRENT ) ) != PAPI_VER_CURRENT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_create_eventset( &EventSet ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( hwinfo = PAPI_get_hardware_info( ) ) == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", PAPI_EMISC );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "Architecture %s, %d\n", hwinfo->model_string, hwinfo->model );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if ((defined(linux) && (defined(__i386__) || (defined __x86_64__))) )
|
|
Packit |
577717 |
if ( !strncmp( hwinfo->model_string, "Intel Pentium 4", 15 ) ) {
|
|
Packit |
577717 |
native_name = p4_native_name;
|
|
Packit |
577717 |
} else if ( !strncmp( hwinfo->model_string, "AMD K7", 6 ) ) {
|
|
Packit |
577717 |
native_name = k7_native_name;
|
|
Packit |
577717 |
} else if ( !strncmp( hwinfo->model_string, "AMD K8", 6 ) ) {
|
|
Packit |
577717 |
native_name = k8_native_name;
|
|
Packit |
577717 |
} else if ( !strncmp( hwinfo->model_string, "Intel Core", 17 ) ||
|
|
Packit |
577717 |
!strncmp( hwinfo->model_string, "Intel Core 2", 17 ) ) {
|
|
Packit |
577717 |
native_name = core_native_name;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; native_name[i] != NULL; i++ ) {
|
|
Packit |
577717 |
retval = PAPI_event_name_to_code( native_name[i], &native );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_event_name_to_code", retval );
|
|
Packit |
577717 |
printf( "Adding %s\n", native_name[i] );
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, native ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_both( 1000 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, values ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !TESTS_QUIET ) {
|
|
Packit |
577717 |
for ( i = 0; native_name[i] != NULL; i++ ) {
|
|
Packit |
577717 |
fprintf( stderr, "%-40s: ", native_name[i] );
|
|
Packit |
577717 |
fprintf( stderr, LLDFMT, values[i] );
|
|
Packit |
577717 |
fprintf( stderr, "\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_cleanup_eventset( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_cleanup", retval );
|
|
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__, NULL, 0 );
|
|
Packit |
577717 |
exit( 0 );
|
|
Packit |
577717 |
}
|