|
Packit |
577717 |
/* This file performs the following test: start, read, stop and again functionality
|
|
Packit |
577717 |
|
|
Packit |
577717 |
- It attempts to use the following three counters. It may use less depending on
|
|
Packit |
577717 |
hardware counter resource limitations. These are counted in the default counting
|
|
Packit |
577717 |
domain and default granularity, depending on the platform. Usually this is
|
|
Packit |
577717 |
the user domain (PAPI_DOM_USER) and thread context (PAPI_GRN_THR).
|
|
Packit |
577717 |
+ PAPI_FP_INS or PAPI_TOT_INS if PAPI_FP_INS doesn't exist
|
|
Packit |
577717 |
+ PAPI_TOT_CYC
|
|
Packit |
577717 |
- Start counters
|
|
Packit |
577717 |
- Do flops
|
|
Packit |
577717 |
- Read counters
|
|
Packit |
577717 |
- Reset counters
|
|
Packit |
577717 |
- Do flops
|
|
Packit |
577717 |
- Read counters
|
|
Packit |
577717 |
- Do flops
|
|
Packit |
577717 |
- Read counters
|
|
Packit |
577717 |
- Do flops
|
|
Packit |
577717 |
- Stop and read counters
|
|
Packit |
577717 |
- Read counters
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <mpi.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval, num_tests = 5, num_events, tmp;
|
|
Packit |
577717 |
long long **values;
|
|
Packit |
577717 |
int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
int PAPI_event, mask;
|
|
Packit |
577717 |
char event_name[PAPI_MAX_STR_LEN], add_event_str[PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
int quiet;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
quiet=tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Init( argc, argv );
|
|
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 |
/* query and set up the right instruction to monitor */
|
|
Packit |
577717 |
if ( PAPI_query_event( PAPI_FP_INS ) == PAPI_OK ) {
|
|
Packit |
577717 |
PAPI_event = PAPI_FP_INS;
|
|
Packit |
577717 |
mask = MASK_FP_INS | MASK_TOT_CYC;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
PAPI_event = PAPI_TOT_INS;
|
|
Packit |
577717 |
mask = MASK_TOT_INS | MASK_TOT_CYC;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_event_code_to_name( PAPI_event, event_name );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
|
|
Packit |
577717 |
sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
EventSet = add_test_events( &num_events, &mask );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
values = allocate_test_space( num_tests, num_events );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_flops( NUM_FLOPS );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_read( EventSet, values[0] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_read", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_reset( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_flops( NUM_FLOPS );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_read( EventSet, values[1] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_read", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_flops( NUM_FLOPS );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_read( EventSet, values[2] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_read", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_flops( NUM_FLOPS );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, values[3] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_read( EventSet, values[4] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_read", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
remove_test_events( &EventSet, mask );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "Test case 1: Non-overlapping start, stop, read.\n" );
|
|
Packit |
577717 |
printf( "-----------------------------------------------\n" );
|
|
Packit |
577717 |
tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
|
|
Packit |
577717 |
printf( "Default domain is: %d (%s)\n", tmp,
|
|
Packit |
577717 |
stringify_all_domains( tmp ) );
|
|
Packit |
577717 |
tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
|
|
Packit |
577717 |
printf( "Default granularity is: %d (%s)\n", tmp,
|
|
Packit |
577717 |
stringify_granularity( tmp ) );
|
|
Packit |
577717 |
printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "Test type : \t1\t\t2\t\t3\t\t4\t\t5\n" );
|
|
Packit |
577717 |
sprintf( add_event_str, "%s : ", event_name );
|
|
Packit |
577717 |
printf( TAB5, add_event_str,
|
|
Packit |
577717 |
( values[0] )[0], ( values[1] )[0], ( values[2] )[0],
|
|
Packit |
577717 |
( values[3] )[0], ( values[4] )[0] );
|
|
Packit |
577717 |
printf( TAB5, "PAPI_TOT_CYC: ", ( values[0] )[1], ( values[1] )[1],
|
|
Packit |
577717 |
( values[2] )[1], ( values[3] )[1], ( values[4] )[1] );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "Verification:\n" );
|
|
Packit |
577717 |
printf( "Column 1 approximately equals column 2\n" );
|
|
Packit |
577717 |
printf( "Column 3 approximately equals 2 * column 2\n" );
|
|
Packit |
577717 |
printf( "Column 4 approximately equals 3 * column 2\n" );
|
|
Packit |
577717 |
printf( "Column 4 exactly equals column 5\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
long long min, max;
|
|
Packit |
577717 |
min = ( long long ) ( values[1][0] * .9 );
|
|
Packit |
577717 |
max = ( long long ) ( values[1][0] * 1.1 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( values[0][0] > max || values[0][0] < min ||
|
|
Packit |
577717 |
values[2][0] > ( 2 * max )
|
|
Packit |
577717 |
|| values[2][0] < ( 2 * min ) || values[3][0] > ( 3 * max )
|
|
Packit |
577717 |
|| values[3][0] < ( 3 * min )
|
|
Packit |
577717 |
|| values[3][0] != values[4][0] ) {
|
|
Packit |
577717 |
printf( "min: " );
|
|
Packit |
577717 |
printf( LLDFMT, min );
|
|
Packit |
577717 |
printf( "max: " );
|
|
Packit |
577717 |
printf( LLDFMT, max );
|
|
Packit |
577717 |
printf( "1st: " );
|
|
Packit |
577717 |
printf( LLDFMT, values[0][0] );
|
|
Packit |
577717 |
printf( "2nd: " );
|
|
Packit |
577717 |
printf( LLDFMT, values[1][0] );
|
|
Packit |
577717 |
printf( "3rd: " );
|
|
Packit |
577717 |
printf( LLDFMT, values[2][0] );
|
|
Packit |
577717 |
printf( "4th: " );
|
|
Packit |
577717 |
printf( LLDFMT, values[3][0] );
|
|
Packit |
577717 |
printf( "5th: " );
|
|
Packit |
577717 |
printf( LLDFMT, values[4][0] );
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, event_name, 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
min = ( long long ) ( values[1][1] * .9 );
|
|
Packit |
577717 |
max = ( long long ) ( values[1][1] * 1.1 );
|
|
Packit |
577717 |
if ( values[0][1] > max || values[0][1] < min ||
|
|
Packit |
577717 |
values[2][1] > ( 2 * max )
|
|
Packit |
577717 |
|| values[2][1] < ( 2 * min ) || values[3][1] > ( 3 * max )
|
|
Packit |
577717 |
|| values[3][1] < ( 3 * min )
|
|
Packit |
577717 |
|| values[3][1] != values[4][1] ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_TOT_CYC", 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
test_pass( __FILE__, values, num_tests );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
MPI_Finalize( );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|