|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: multiplex.c
|
|
Packit |
577717 |
* Author: Philip Mucci
|
|
Packit |
577717 |
* mucci@cs.utk.edu
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This file tests the multiplex functionality, originally developed by
|
|
Packit |
577717 |
John May of LLNL. */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "do_loops.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Tests that we can really multiplex a lot. */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
case1( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval, i, EventSet = PAPI_NULL, j = 0, k = 0, allvalid = 1;
|
|
Packit |
577717 |
int max_mux, nev, *events;
|
|
Packit |
577717 |
long long *values;
|
|
Packit |
577717 |
PAPI_event_info_t pset;
|
|
Packit |
577717 |
char evname[PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize PAPI */
|
|
Packit |
577717 |
|
|
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", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_multiplex_init( );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI multiplex init fail\n", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
if ( PAPI_set_domain( PAPI_DOM_KERNEL ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_domain", retval );
|
|
Packit |
577717 |
#endif
|
|
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 |
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
if ( PAPI_set_domain( PAPI_DOM_KERNEL ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_domain", retval );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
/* In Component PAPI, EventSets must be assigned a component index
|
|
Packit |
577717 |
before you can fiddle with their internals.
|
|
Packit |
577717 |
0 is always the cpu component */
|
|
Packit |
577717 |
retval = PAPI_assign_eventset_component( EventSet, 0 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_assign_eventset_component",
|
|
Packit |
577717 |
retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
if ( PAPI_set_domain( PAPI_DOM_KERNEL ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_domain", retval );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_set_multiplex( EventSet );
|
|
Packit |
577717 |
if ( retval == PAPI_ENOSUPP) {
|
|
Packit |
577717 |
test_skip(__FILE__, __LINE__, "Multiplex not supported", 1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_multiplex", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
max_mux = PAPI_get_opt( PAPI_MAX_MPX_CTRS, NULL );
|
|
Packit |
577717 |
if ( max_mux > 32 ) max_mux = 32;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
if ( PAPI_set_domain( PAPI_DOM_KERNEL ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_domain", retval );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Fill up the event set with as many non-derived events as we can */
|
|
Packit |
577717 |
if (!TESTS_QUIET) {
|
|
Packit |
577717 |
printf( "\nFilling the event set with as many non-derived events as we can...\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
i = PAPI_PRESET_MASK;
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
if ( PAPI_get_event_info( i, &pset ) == PAPI_OK ) {
|
|
Packit |
577717 |
if ( pset.count && ( strcmp( pset.derived, "NOT_DERIVED" ) == 0 ) ) {
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, ( int ) pset.event_code );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
printf("Failed trying to add %s\n",pset.symbol);
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
if (!TESTS_QUIET) printf( "Added %s\n", pset.symbol );
|
|
Packit |
577717 |
j++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( ( PAPI_enum_event( &i, PAPI_PRESET_ENUM_AVAIL ) == PAPI_OK ) &&
|
|
Packit |
577717 |
( j < max_mux ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (j==0) {
|
|
Packit |
577717 |
if (!TESTS_QUIET) printf("No events found\n");
|
|
Packit |
577717 |
test_skip(__FILE__,__LINE__,"No events",0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
events = ( int * ) malloc( ( size_t ) j * sizeof ( int ) );
|
|
Packit |
577717 |
if ( events == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "malloc events", 0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
values = ( long long * ) malloc( ( size_t ) j * sizeof ( long long ) );
|
|
Packit |
577717 |
if ( values == NULL )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "malloc values", 0 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_stuff( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if 0
|
|
Packit |
577717 |
if ( PAPI_set_domain( PAPI_DOM_KERNEL ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_domain", retval );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( PAPI_start( EventSet ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_stuff( );
|
|
Packit |
577717 |
|
|
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 |
nev = j;
|
|
Packit |
577717 |
retval = PAPI_list_events( EventSet, events, &nev );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_list_events", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!TESTS_QUIET) printf( "\nEvent Counts:\n" );
|
|
Packit |
577717 |
for ( i = 0, allvalid = 0; i < j; i++ ) {
|
|
Packit |
577717 |
PAPI_event_code_to_name( events[i], evname );
|
|
Packit |
577717 |
if (!TESTS_QUIET) printf( TAB1, evname, values[i] );
|
|
Packit |
577717 |
if ( values[i] == 0 )
|
|
Packit |
577717 |
allvalid++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (!TESTS_QUIET) {
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
if ( allvalid ) {
|
|
Packit |
577717 |
printf( "Caution: %d counters had zero values\n", allvalid );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (allvalid==j) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "All counters returned zero", 5 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0, allvalid = 0; i < j; i++ ) {
|
|
Packit |
577717 |
for ( k = i + 1; k < j; k++ ) {
|
|
Packit |
577717 |
if ( ( i != k ) && ( values[i] == values[k] ) ) {
|
|
Packit |
577717 |
allvalid++;
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!TESTS_QUIET) {
|
|
Packit |
577717 |
if ( allvalid ) {
|
|
Packit |
577717 |
printf( "Caution: %d counter pair(s) had identical values\n",
|
|
Packit |
577717 |
allvalid );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
free( events );
|
|
Packit |
577717 |
free( values );
|
|
Packit |
577717 |
|
|
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 |
return ( SUCCESS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int quiet;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
quiet = tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf( "%s: Does PAPI_multiplex_init() handle lots of events?\n",
|
|
Packit |
577717 |
argv[0] );
|
|
Packit |
577717 |
printf( "Using %d iterations\n", NUM_ITERS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
case1( );
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|