|
Packit |
577717 |
/* From Dave McNamara at PSRV. Thanks! */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* If an event is countable but you've exhausted the counter resources
|
|
Packit |
577717 |
and you try to add an event, it seems subsequent PAPI_start and/or
|
|
Packit |
577717 |
PAPI_stop will causes a Seg. Violation.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
I got around this by calling PAPI to get the # of countable events,
|
|
Packit |
577717 |
then making sure that I didn't try to add more than these number of
|
|
Packit |
577717 |
events. I still have a problem if someone adds Level 2 cache misses
|
|
Packit |
577717 |
and then adds FLOPS 'cause I didn't count FLOPS as actually requiring
|
|
Packit |
577717 |
2 counters. */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
#include <mpi.h>
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <math.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern int TESTS_QUIET; /* Declared in test_utils.c */
|
|
Packit |
577717 |
char *netevents[] =
|
|
Packit |
577717 |
{ "LO_RX_PACKETS", "LO_TX_PACKETS", "ETH0_RX_PACKETS", "ETH0_TX_PACKETS" };
|
|
Packit |
577717 |
|
|
Packit |
577717 |
double
|
|
Packit |
577717 |
f( double a )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return ( 4.0 / ( 1.0 + a * a ) );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int EventSet = PAPI_NULL, EventSet1 = PAPI_NULL;
|
|
Packit |
577717 |
int evtcode;
|
|
Packit |
577717 |
int retval, i, ins = 0;
|
|
Packit |
577717 |
long long g1[2], g2[2];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int done = 0, n, myid, numprocs;
|
|
Packit |
577717 |
double PI25DT = 3.141592653589793238462643;
|
|
Packit |
577717 |
double mypi, pi, h, sum, x;
|
|
Packit |
577717 |
double startwtime = 0.0, endwtime;
|
|
Packit |
577717 |
int namelen;
|
|
Packit |
577717 |
char processor_name[MPI_MAX_PROCESSOR_NAME];
|
|
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 ( ( retval = PAPI_create_eventset( &EventSet1 ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_event_name_to_code( netevents[2], &evtcode );
|
|
Packit |
577717 |
if ( ( retval = PAPI_query_event( evtcode ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_aquery_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, evtcode ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_event_name_to_code( netevents[3], &evtcode );
|
|
Packit |
577717 |
if ( ( retval = PAPI_query_event( evtcode ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_aquery_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, evtcode ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_query_event( PAPI_FP_INS ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( ( retval = PAPI_query_event( PAPI_FP_OPS ) ) == PAPI_OK ) {
|
|
Packit |
577717 |
ins = 2;
|
|
Packit |
577717 |
if ( ( retval =
|
|
Packit |
577717 |
PAPI_add_event( EventSet1, PAPI_FP_OPS ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
ins = 1;
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet1, PAPI_FP_INS ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet1, PAPI_TOT_CYC ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
if ( retval != PAPI_ECNFLCT )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Init( &argc, &argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
|
|
Packit |
577717 |
MPI_Comm_rank( MPI_COMM_WORLD, &myid );
|
|
Packit |
577717 |
MPI_Get_processor_name( processor_name, &namelen );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
fprintf( stdout, "Process %d of %d on %s\n",
|
|
Packit |
577717 |
myid, numprocs, processor_name );
|
|
Packit |
577717 |
fflush( stdout );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet1 ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
n = 0;
|
|
Packit |
577717 |
while ( !done ) {
|
|
Packit |
577717 |
if ( myid == 0 ) {
|
|
Packit |
577717 |
if ( n == 0 )
|
|
Packit |
577717 |
n = 1000000;
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
n = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
startwtime = MPI_Wtime( );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
MPI_Bcast( &n, 1, MPI_INT, 0, MPI_COMM_WORLD );
|
|
Packit |
577717 |
if ( n == 0 )
|
|
Packit |
577717 |
done = 1;
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
h = 1.0 / ( double ) n;
|
|
Packit |
577717 |
sum = 0.0;
|
|
Packit |
577717 |
/* A slightly better approach starts from large i and works back */
|
|
Packit |
577717 |
for ( i = myid + 1; i <= n; i += numprocs ) {
|
|
Packit |
577717 |
x = h * ( ( double ) i - 0.5 );
|
|
Packit |
577717 |
sum += f( x );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
mypi = h * sum;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Reduce( &mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( myid == 0 ) {
|
|
Packit |
577717 |
printf( "pi is approximately %.16f, Error is %.16f\n",
|
|
Packit |
577717 |
pi, fabs( pi - PI25DT ) );
|
|
Packit |
577717 |
endwtime = MPI_Wtime( );
|
|
Packit |
577717 |
printf( "wall clock time = %f\n", endwtime - startwtime );
|
|
Packit |
577717 |
fflush( stdout );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet1, g1 ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, g2 ) ) != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Finalize( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "ETH0_RX_BYTES: %lld ETH0_TX_BYTES: %lld\n", g2[0], g2[1] );
|
|
Packit |
577717 |
if ( ins == 0 ) {
|
|
Packit |
577717 |
printf( "PAPI_TOT_CYC : %lld\n", g1[0] );
|
|
Packit |
577717 |
} else if ( ins == 1 ) {
|
|
Packit |
577717 |
printf( "PAPI_FP_INS : %lld PAPI_TOT_CYC : %lld\n", g1[0], g1[1] );
|
|
Packit |
577717 |
} else if ( ins == 2 ) {
|
|
Packit |
577717 |
printf( "PAPI_FP_OPS : %lld PAPI_TOT_CYC : %lld\n", g1[0], g1[1] );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
test_pass( __FILE__, NULL, 0 );
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|