|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: multiplex1_pthreads.c
|
|
Packit |
577717 |
* Author: Rick Kufrin
|
|
Packit |
577717 |
* rkufrin@ncsa.uiuc.edu
|
|
Packit |
577717 |
* Mods: Philip Mucci
|
|
Packit |
577717 |
* mucci@cs.utk.edu
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This file really bangs on the multiplex pthread functionality */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <pthread.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 |
static int *events;
|
|
Packit |
577717 |
static int numevents = 0;
|
|
Packit |
577717 |
static int max_events=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
double
|
|
Packit |
577717 |
loop( long n )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
long i;
|
|
Packit |
577717 |
double a = 0.0012;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < n; i++ ) {
|
|
Packit |
577717 |
a += 0.01;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return a;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void *
|
|
Packit |
577717 |
thread( void *arg )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
( void ) arg; /*unused */
|
|
Packit |
577717 |
int eventset = PAPI_NULL;
|
|
Packit |
577717 |
long long *values;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int ret = PAPI_register_thread( );
|
|
Packit |
577717 |
if ( ret != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_register_thread", ret );
|
|
Packit |
577717 |
ret = PAPI_create_eventset( &eventset );
|
|
Packit |
577717 |
if ( ret != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", ret );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
values=calloc(max_events,sizeof(long long));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!TESTS_QUIET) printf( "Event set %d created\n", eventset );
|
|
Packit |
577717 |
|
|
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 |
ret = PAPI_assign_eventset_component( eventset, 0 );
|
|
Packit |
577717 |
if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_assign_eventset_component", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_set_multiplex( eventset );
|
|
Packit |
577717 |
if ( ret == PAPI_ENOSUPP) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "Multiplexing not supported", 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_set_multiplex", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_add_events( eventset, events, numevents );
|
|
Packit |
577717 |
if ( ret < PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_events", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_start( eventset );
|
|
Packit |
577717 |
if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_stuff( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_stop( eventset, values );
|
|
Packit |
577717 |
if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_cleanup_eventset( eventset );
|
|
Packit |
577717 |
if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_destroy_eventset( &eventset );
|
|
Packit |
577717 |
if ( ret != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", ret );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ret = PAPI_unregister_thread( );
|
|
Packit |
577717 |
if ( ret != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_unregister_thread", ret );
|
|
Packit |
577717 |
return ( NULL );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int nthreads = 8, retval, i;
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
pthread_t *threads;
|
|
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 |
if ( argc > 1 ) {
|
|
Packit |
577717 |
int tmp = atoi( argv[1] );
|
|
Packit |
577717 |
if ( tmp >= 1 )
|
|
Packit |
577717 |
nthreads = tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
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_thread_init( ( unsigned long ( * )( void ) ) pthread_self );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_thread_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", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ((max_events = PAPI_get_cmp_opt(PAPI_MAX_MPX_CTRS,NULL,0)) <= 0) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_get_cmp_opt", max_events );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ((events = calloc(max_events,sizeof(int))) == NULL) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "calloc", PAPI_ESYS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Fill up the event set with as many non-derived events as we can */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
i = PAPI_PRESET_MASK;
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
if ( PAPI_get_event_info( i, &info ) == PAPI_OK ) {
|
|
Packit |
577717 |
if ( info.count == 1 ) {
|
|
Packit |
577717 |
events[numevents++] = ( int ) info.event_code;
|
|
Packit |
577717 |
if (!quiet) printf( "Added %s\n", info.symbol );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
if (!quiet) printf( "Skipping derived event %s\n", info.symbol );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( ( PAPI_enum_event( &i, PAPI_PRESET_ENUM_AVAIL ) == PAPI_OK )
|
|
Packit |
577717 |
&& ( numevents < max_events ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf( "Found %d events\n", numevents );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (numevents==0) {
|
|
Packit |
577717 |
test_skip(__FILE__,__LINE__,"No events found",0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_stuff( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf( "Creating %d threads:\n", nthreads );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
threads =
|
|
Packit |
577717 |
( pthread_t * ) malloc( ( size_t ) nthreads * sizeof ( pthread_t ) );
|
|
Packit |
577717 |
if ( threads == NULL ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "malloc", PAPI_ENOMEM );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create the threads */
|
|
Packit |
577717 |
for ( i = 0; i < nthreads; i++ ) {
|
|
Packit |
577717 |
retval = pthread_create( &threads[i], NULL, thread, NULL );
|
|
Packit |
577717 |
if ( retval != 0 ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "pthread_create", PAPI_ESYS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Wait for thread completion */
|
|
Packit |
577717 |
for ( i = 0; i < nthreads; i++ ) {
|
|
Packit |
577717 |
retval = pthread_join( threads[i], NULL );
|
|
Packit |
577717 |
if ( retval != 0 ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "pthread_join", PAPI_ESYS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf( "Done." );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pthread_exit( NULL );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|