|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: tenth.c
|
|
Packit |
577717 |
* Mods: Maynard Johnson
|
|
Packit |
577717 |
* maynardj@us.ibm.com
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.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 |
#define ITERS 100
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This file performs the following test: start, stop and timer functionality for
|
|
Packit |
577717 |
PAPI_L1_TCM derived event
|
|
Packit |
577717 |
|
|
Packit |
577717 |
- They are counted in the default counting domain and default
|
|
Packit |
577717 |
granularity, depending on the platform. Usually this is
|
|
Packit |
577717 |
the user domain (PAPI_DOM_USER) and thread context (PAPI_GRN_THR).
|
|
Packit |
577717 |
- Get us.
|
|
Packit |
577717 |
- Start counters
|
|
Packit |
577717 |
- Do flops
|
|
Packit |
577717 |
- Stop and read counters
|
|
Packit |
577717 |
- Get us.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if defined(sun) && defined(sparc)
|
|
Packit |
577717 |
#define CACHE_LEVEL "PAPI_L2_TCM"
|
|
Packit |
577717 |
#define EVT1 PAPI_L2_TCM
|
|
Packit |
577717 |
#define EVT2 PAPI_L2_TCA
|
|
Packit |
577717 |
#define EVT3 PAPI_L2_TCH
|
|
Packit |
577717 |
#define EVT1_STR "PAPI_L2_TCM"
|
|
Packit |
577717 |
#define EVT2_STR "PAPI_L2_TCA"
|
|
Packit |
577717 |
#define EVT3_STR "PAPI_L2_TCH"
|
|
Packit |
577717 |
#define MASK1 MASK_L2_TCM
|
|
Packit |
577717 |
#define MASK2 MASK_L2_TCA
|
|
Packit |
577717 |
#define MASK3 MASK_L2_TCH
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
#if defined(__powerpc__)
|
|
Packit |
577717 |
#define CACHE_LEVEL "PAPI_L1_DCA"
|
|
Packit |
577717 |
#define EVT1 PAPI_L1_DCA
|
|
Packit |
577717 |
#define EVT2 PAPI_L1_DCW
|
|
Packit |
577717 |
#define EVT3 PAPI_L1_DCR
|
|
Packit |
577717 |
#define EVT1_STR "PAPI_L1_DCA"
|
|
Packit |
577717 |
#define EVT2_STR "PAPI_L1_DCW"
|
|
Packit |
577717 |
#define EVT3_STR "PAPI_L1_DCR"
|
|
Packit |
577717 |
#define MASK1 MASK_L1_DCA
|
|
Packit |
577717 |
#define MASK2 MASK_L1_DCW
|
|
Packit |
577717 |
#define MASK3 MASK_L1_DCR
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
#define CACHE_LEVEL "PAPI_L1_TCM"
|
|
Packit |
577717 |
#define EVT1 PAPI_L1_TCM
|
|
Packit |
577717 |
#define EVT2 PAPI_L1_ICM
|
|
Packit |
577717 |
#define EVT3 PAPI_L1_DCM
|
|
Packit |
577717 |
#define EVT1_STR "PAPI_L1_TCM"
|
|
Packit |
577717 |
#define EVT2_STR "PAPI_L1_ICM"
|
|
Packit |
577717 |
#define EVT3_STR "PAPI_L1_DCM"
|
|
Packit |
577717 |
#define MASK1 MASK_L1_TCM
|
|
Packit |
577717 |
#define MASK2 MASK_L1_ICM
|
|
Packit |
577717 |
#define MASK3 MASK_L1_DCM
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval, num_tests = 30, tmp;
|
|
Packit |
577717 |
int EventSet1 = PAPI_NULL;
|
|
Packit |
577717 |
int EventSet2 = PAPI_NULL;
|
|
Packit |
577717 |
int EventSet3 = PAPI_NULL;
|
|
Packit |
577717 |
int mask1 = MASK1;
|
|
Packit |
577717 |
int mask2 = MASK2;
|
|
Packit |
577717 |
int mask3 = MASK3;
|
|
Packit |
577717 |
int num_events1;
|
|
Packit |
577717 |
int num_events2;
|
|
Packit |
577717 |
int num_events3;
|
|
Packit |
577717 |
long long **values;
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
long long min[3];
|
|
Packit |
577717 |
long long max[3];
|
|
Packit |
577717 |
long long sum[3];
|
|
Packit |
577717 |
int quiet;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
quiet = tests_quiet( 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 |
|
|
Packit |
577717 |
/* Make sure that required resources are available */
|
|
Packit |
577717 |
/* Skip (don't fail!) if they are not */
|
|
Packit |
577717 |
retval = PAPI_query_event( EVT1 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, EVT1_STR, retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_query_event( EVT2 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, EVT2_STR, retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_query_event( EVT3 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, EVT3_STR, retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
EventSet1 = add_test_events( &num_events1, &mask1, 1 );
|
|
Packit |
577717 |
EventSet2 = add_test_events( &num_events2, &mask2, 1 );
|
|
Packit |
577717 |
EventSet3 = add_test_events( &num_events3, &mask3, 1 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
values = allocate_test_space( num_tests, 1 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Warm me up */
|
|
Packit |
577717 |
do_l1misses( ITERS );
|
|
Packit |
577717 |
do_misses( 1, 1024 * 1024 * 4 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < 10; i++ ) {
|
|
Packit |
577717 |
retval = PAPI_start( EventSet1 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_l1misses( ITERS );
|
|
Packit |
577717 |
do_misses( 1, 1024 * 1024 * 4 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet1, values[( i * 3 ) + 0] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet2 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_l1misses( ITERS );
|
|
Packit |
577717 |
do_misses( 1, 1024 * 1024 * 4 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet2, values[( i * 3 ) + 1] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet3 );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_l1misses( ITERS );
|
|
Packit |
577717 |
do_misses( 1, 1024 * 1024 * 4 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet3, values[( i * 3 ) + 2] );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
remove_test_events( &EventSet1, mask1 );
|
|
Packit |
577717 |
remove_test_events( &EventSet2, mask2 );
|
|
Packit |
577717 |
remove_test_events( &EventSet3, mask3 );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( j = 0; j < 3; j++ ) {
|
|
Packit |
577717 |
min[j] = 65535;
|
|
Packit |
577717 |
max[j] = sum[j] = 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
for ( i = 0; i < 10; i++ ) {
|
|
Packit |
577717 |
for ( j = 0; j < 3; j++ ) {
|
|
Packit |
577717 |
if ( min[j] > values[( i * 3 ) + j][0] )
|
|
Packit |
577717 |
min[j] = values[( i * 3 ) + j][0];
|
|
Packit |
577717 |
if ( max[j] < values[( i * 3 ) + j][0] )
|
|
Packit |
577717 |
max[j] = values[( i * 3 ) + j][0];
|
|
Packit |
577717 |
sum[j] += values[( i * 3 ) + j][0];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "Test case 10: start, stop for derived event %s.\n",
|
|
Packit |
577717 |
CACHE_LEVEL );
|
|
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", ITERS );
|
|
Packit |
577717 |
printf( "Repeated 10 times\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
for (i=0;i<10;i++) {
|
|
Packit |
577717 |
printf("Test type : %12s%13s%13s\n", "1", "2", "3");
|
|
Packit |
577717 |
printf(TAB3, EVT1_STR, values[(i*3)+0][0], (long long)0, (long long)0);
|
|
Packit |
577717 |
printf(TAB3, EVT2_STR, (long long)0, values[(i*3)+1][0], (long long)0);
|
|
Packit |
577717 |
printf(TAB3, EVT3_STR, (long long)0, (long long)0, values[(i*3)+2][0]);
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
("-------------------------------------------------------------------------\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
printf( "Test type : %12s%13s%13s\n", "min", "max", "sum" );
|
|
Packit |
577717 |
printf( TAB3, EVT1_STR, min[0], max[0], sum[0] );
|
|
Packit |
577717 |
printf( TAB3, EVT2_STR, min[1], max[1], sum[1] );
|
|
Packit |
577717 |
printf( TAB3, EVT3_STR, min[2], max[2], sum[2] );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
printf( "Verification:\n" );
|
|
Packit |
577717 |
#if defined(sun) && defined(sparc)
|
|
Packit |
577717 |
printf( TAB1, "Sum 1 approximately equals sum 2 - sum 3 or",
|
|
Packit |
577717 |
( sum[1] - sum[2] ) );
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
printf( TAB1, "Sum 1 approximately equals sum 2 + sum 3 or",
|
|
Packit |
577717 |
( sum[1] + sum[2] ) );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
long long tmin, tmax;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#if defined(sun) && defined(sparc)
|
|
Packit |
577717 |
tmax = ( long long ) ( sum[1] - sum[2] );
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
tmax = ( long long ) ( sum[1] + sum[2] );
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf( "percent error: %f\n",
|
|
Packit |
577717 |
(( float ) abs( ( int ) ( tmax - sum[0] ) ) /
|
|
Packit |
577717 |
(float) sum[0] ) * 100.0 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
tmin = ( long long ) ( ( double ) tmax * 0.8 );
|
|
Packit |
577717 |
tmax = ( long long ) ( ( double ) tmax * 1.2 );
|
|
Packit |
577717 |
if ( sum[0] > tmax || sum[0] < tmin ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, CACHE_LEVEL, 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|