|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Test PAPI with fork() and exec().
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include <sys/time.h>
|
|
Packit Service |
a1973e |
#include <sys/types.h>
|
|
Packit Service |
a1973e |
#include <sys/wait.h>
|
|
Packit Service |
a1973e |
#include <errno.h>
|
|
Packit Service |
a1973e |
#include <stdio.h>
|
|
Packit Service |
a1973e |
#include <stdlib.h>
|
|
Packit Service |
a1973e |
#include <unistd.h>
|
|
Packit Service |
a1973e |
#include "papi.h"
|
|
Packit Service |
a1973e |
#include "papi_test.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define MAX_EVENTS 3
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int Event[MAX_EVENTS] = {
|
|
Packit Service |
a1973e |
PAPI_TOT_CYC,
|
|
Packit Service |
a1973e |
PAPI_FP_INS,
|
|
Packit Service |
a1973e |
PAPI_FAD_INS,
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int Threshold[MAX_EVENTS] = {
|
|
Packit Service |
a1973e |
8000000,
|
|
Packit Service |
a1973e |
4000000,
|
|
Packit Service |
a1973e |
4000000,
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static int num_events = 1;
|
|
Packit Service |
a1973e |
static int EventSet = PAPI_NULL;
|
|
Packit Service |
a1973e |
static const char *name = "unknown";
|
|
Packit Service |
a1973e |
static struct timeval start, last;
|
|
Packit Service |
a1973e |
static long count, total;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
my_handler( int EventSet, void *pc, long long ovec, void *context )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
( void ) EventSet;
|
|
Packit Service |
a1973e |
( void ) pc;
|
|
Packit Service |
a1973e |
( void ) ovec;
|
|
Packit Service |
a1973e |
( void ) context;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
count++;
|
|
Packit Service |
a1973e |
total++;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
zero_count( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
gettimeofday( &start, NULL );
|
|
Packit Service |
a1973e |
last = start;
|
|
Packit Service |
a1973e |
count = 0;
|
|
Packit Service |
a1973e |
total = 0;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
print_here( const char *str) {
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (!TESTS_QUIET) printf("[%d] %s, %s\n", getpid(), name, str);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
print_rate( const char *str )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
static int last_count = -1;
|
|
Packit Service |
a1973e |
struct timeval now;
|
|
Packit Service |
a1973e |
double st_secs, last_secs;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
gettimeofday( &now, NULL );
|
|
Packit Service |
a1973e |
st_secs = ( double ) ( now.tv_sec - start.tv_sec )
|
|
Packit Service |
a1973e |
+ ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
|
|
Packit Service |
a1973e |
last_secs = ( double ) ( now.tv_sec - last.tv_sec )
|
|
Packit Service |
a1973e |
+ ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
|
|
Packit Service |
a1973e |
if ( last_secs <= 0.001 )
|
|
Packit Service |
a1973e |
last_secs = 0.001;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if (!TESTS_QUIET) {
|
|
Packit Service |
a1973e |
printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
|
|
Packit Service |
a1973e |
getpid( ), str, st_secs, total, count,
|
|
Packit Service |
a1973e |
( ( double ) count ) / last_secs );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( last_count != -1 ) {
|
|
Packit Service |
a1973e |
if ( count < .1 * last_count ) {
|
|
Packit Service |
a1973e |
test_fail( name, __LINE__, "Interrupt rate changed!", 1 );
|
|
Packit Service |
a1973e |
exit( 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
last_count = ( int ) count;
|
|
Packit Service |
a1973e |
count = 0;
|
|
Packit Service |
a1973e |
last = now;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
do_cycles( int program_time )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
struct timeval start, now;
|
|
Packit Service |
a1973e |
double x, sum;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
gettimeofday( &start, NULL );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( ;; ) {
|
|
Packit Service |
a1973e |
sum = 1.0;
|
|
Packit Service |
a1973e |
for ( x = 1.0; x < 250000.0; x += 1.0 )
|
|
Packit Service |
a1973e |
sum += x;
|
|
Packit Service |
a1973e |
if ( sum < 0.0 )
|
|
Packit Service |
a1973e |
printf( "==>> SUM IS NEGATIVE !! <<==\n" );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
gettimeofday( &now, NULL );
|
|
Packit Service |
a1973e |
if ( now.tv_sec >= start.tv_sec + program_time )
|
|
Packit Service |
a1973e |
break;
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
my_papi_start( void )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int ev;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
EventSet = PAPI_NULL;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( PAPI_create_eventset( &EventSet ) != PAPI_OK )
|
|
Packit Service |
a1973e |
test_fail( name, __LINE__, "PAPI_create_eventset failed", 1 );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( ev = 0; ev < num_events; ev++ ) {
|
|
Packit Service |
a1973e |
if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
|
|
Packit Service |
a1973e |
if (!TESTS_QUIET) printf("Trouble adding event\n");
|
|
Packit Service |
a1973e |
test_skip( name, __LINE__, "PAPI_add_event failed", 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( ev = 0; ev < num_events; ev++ ) {
|
|
Packit Service |
a1973e |
if ( PAPI_overflow( EventSet, Event[ev], Threshold[ev], 0, my_handler )
|
|
Packit Service |
a1973e |
!= PAPI_OK ) {
|
|
Packit Service |
a1973e |
test_fail( name, __LINE__, "PAPI_overflow failed", 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( PAPI_start( EventSet ) != PAPI_OK )
|
|
Packit Service |
a1973e |
test_fail( name, __LINE__, "PAPI_start failed", 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
static void
|
|
Packit Service |
a1973e |
run( const char *str, int len )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int n;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( n = 1; n <= len; n++ ) {
|
|
Packit Service |
a1973e |
do_cycles( 1 );
|
|
Packit Service |
a1973e |
print_rate( str );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
main( int argc, char **argv )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
char buf[100];
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int quiet,retval;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Used to be able to set this via command line */
|
|
Packit Service |
a1973e |
num_events=1;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* Set TESTS_QUIET variable */
|
|
Packit Service |
a1973e |
quiet=tests_quiet( argc, argv );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
do_cycles( 1 );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
zero_count( );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval=PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit Service |
a1973e |
if (retval!=PAPI_VER_CURRENT) {
|
|
Packit Service |
a1973e |
test_fail( name, __LINE__, "PAPI_library_init failed", 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
name = argv[0];
|
|
Packit Service |
a1973e |
if (!quiet) printf( "[%d] %s, num_events = %d\n", getpid( ), name, num_events );
|
|
Packit Service |
a1973e |
sprintf( buf, "%d", num_events );
|
|
Packit Service |
a1973e |
my_papi_start( );
|
|
Packit Service |
a1973e |
run( name, 3 );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
print_here( "system(./burn)" );
|
|
Packit Service |
a1973e |
if ( access( "./burn", X_OK ) == 0 )
|
|
Packit Service |
a1973e |
( quiet ? system( "./burn TESTS_QUIET" ) : system( "./burn" ) );
|
|
Packit Service |
a1973e |
else if ( access( "./ctests/burn", X_OK ) == 0 )
|
|
Packit Service |
a1973e |
( quiet ? system( "./ctests/burn TESTS_QUIET" ) :
|
|
Packit Service |
a1973e |
system( "./ctests/burn" ) );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
test_pass(__FILE__);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
return 0;
|
|
Packit Service |
a1973e |
}
|