Blame src/ctests/reset.c

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
Packit 577717
     1
Packit 577717
   - Start counters
Packit 577717
   - Do flops
Packit 577717
   - Stop counters
Packit 577717
Packit 577717
     2
Packit 577717
   - Start counters
Packit 577717
   - Do flops
Packit 577717
   - Stop counters (should duplicate above)
Packit 577717
Packit 577717
     3
Packit 577717
   - Reset counters (should be redundant if stop works properly)
Packit 577717
   - Start counters
Packit 577717
   - Do flops
Packit 577717
   - Stop counters
Packit 577717
Packit 577717
     4
Packit 577717
   - Start counters
Packit 577717
   - Do flops/2
Packit 577717
   - Read counters (flops/2;counters keep counting)
Packit 577717
Packit 577717
     5
Packit 577717
   - Do flops/2
Packit 577717
   - Read counters (2flops/2; counters keep counting)
Packit 577717
Packit 577717
     6
Packit 577717
   - Do flops/2
Packit 577717
   - Read counters (3*flops/2; counters keep counting)
Packit 577717
   - Accum counters (2*(3*flops.2); counters clear and counting)
Packit 577717
Packit 577717
     7
Packit 577717
   - Do flops/2
Packit 577717
   - Read counters (flops/2; counters keep counting)
Packit 577717
Packit 577717
     8
Packit 577717
   - Reset (counters set to zero; still counting)
Packit 577717
   - Stop counters (flops/2; counters stopped)
Packit 577717
Packit 577717
     9
Packit 577717
   - Reset (counters set to zero; still counting)
Packit 577717
   - Do flops/2
Packit 577717
   - Stop counters (flops/2; counters stopped)
Packit 577717
Packit 577717
     9
Packit 577717
   - Reset (counters set to zero and stopped)
Packit 577717
   - Read counters (should be zero)
Packit 577717
*/
Packit 577717
Packit 577717
#include <stdio.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
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int retval, num_tests = 9, num_events, tmp, i;
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
	/* Init the PAPI library */
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
	/* add PAPI_TOT_CYC and one of the events in
Packit 577717
	   PAPI_FP_INS, PAPI_FP_OPS or PAPI_TOT_INS,
Packit 577717
	   depending on the availability of the event
Packit 577717
	   on the platform */
Packit 577717
	EventSet = add_two_events( &num_events, &PAPI_event, &mask );
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
	}
Packit 577717
	sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
Packit 577717
Packit 577717
	values = allocate_test_space( num_tests, num_events );
Packit 577717
Packit 577717
	/*===== Test 1: Start/Stop =======================*/
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
Packit 577717
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[0] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 2 Start/Stop =======================*/
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
Packit 577717
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[1] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 3: Reset/Start/Stop =======================*/
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
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
Packit 577717
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[2] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 4: Start/Read =======================*/
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
Packit 577717
	do_flops( NUM_FLOPS / 2 );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[3] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 5: Read =======================*/
Packit 577717
Packit 577717
	do_flops( NUM_FLOPS / 2 );
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
Packit 577717
	/*===== Test 6: Read/Accum =======================*/
Packit 577717
Packit 577717
	do_flops( NUM_FLOPS / 2 );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[5] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_accum( EventSet, values[5] );
Packit 577717
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_accum", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 7: Read =======================*/
Packit 577717
Packit 577717
	do_flops( NUM_FLOPS / 2 );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[6] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 8 Reset/Stop =======================*/
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
Packit 577717
	do_flops( NUM_FLOPS / 2 );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[7] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/*===== Test 9: Reset/Read =======================*/
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
Packit 577717
	retval = PAPI_read( EventSet, values[8] );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	remove_test_events( &EventSet, mask );
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "Test case: Start/Stop/Read/Accum/Reset.\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( "-------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
		sprintf( add_event_str, "%s:", event_name );
Packit 577717
		printf( "                           PAPI_TOT_CYC    %s\n", event_name );
Packit 577717
		printf( "1. start,ops,stop          %10lld      %10lld\n", values[0][0],
Packit 577717
			values[0][1] );
Packit 577717
		printf( "2. start,ops,stop          %10lld      %10lld\n", values[1][0],
Packit 577717
			values[1][1] );
Packit 577717
		printf( "3. reset,start,ops,stop    %10lld      %10lld\n", values[2][0],
Packit 577717
			values[2][1] );
Packit 577717
		printf( "4. start,ops/2,read        %10lld      %10lld\n", values[3][0],
Packit 577717
			values[3][1] );
Packit 577717
		printf( "5. ops/2,read              %10lld      %10lld\n", values[4][0],
Packit 577717
			values[4][1] );
Packit 577717
		printf( "6. ops/2,accum             %10lld      %10lld\n", values[5][0],
Packit 577717
			values[5][1] );
Packit 577717
		printf( "7. ops/2,read              %10lld      %10lld\n", values[6][0],
Packit 577717
			values[6][1] );
Packit 577717
		printf( "8. reset,ops/2,stop        %10lld      %10lld\n", values[7][0],
Packit 577717
			values[7][1] );
Packit 577717
		printf( "9. reset,read              %10lld      %10lld\n", values[8][0],
Packit 577717
			values[8][1] );
Packit 577717
		printf( "-------------------------------------------------------------------------\n" );
Packit 577717
		printf( "Verification:\n" );
Packit 577717
		printf( "Row 1 approximately equals rows 2 and 3 \n" );
Packit 577717
		printf( "Row 4 approximately equals 1/2 of row 3\n" );
Packit 577717
		printf( "Row 5 approximately equals twice row 4\n" );
Packit 577717
		printf( "Row 6 approximately equals 6 times row 4\n" );
Packit 577717
		printf( "Rows 7 and 8 approximately equal row 4\n" );
Packit 577717
		printf( "Row 9 equals 0\n" );
Packit 577717
		printf( "%% difference between %s 1 & 2: %.2f\n", "PAPI_TOT_CYC",
Packit 577717
			100.0 * ( float ) values[0][0] / ( float ) values[1][0] );
Packit 577717
		printf( "%% difference between %s 1 & 2: %.2f\n", add_event_str,
Packit 577717
			100.0 * ( float ) values[0][1] / ( float ) values[1][1] );
Packit 577717
	}
Packit 577717
Packit 577717
	for ( i = 0; i <= 1; i++ ) {
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[0][i], ( double ) values[1][i] ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[1][i], ( double ) values[2][i] ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[2][i], ( double ) values[3][i] * 2.0 ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[2][i], ( double ) values[4][i] ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[5][i], ( double ) values[3][i] * 6.0 ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[6][i], ( double ) values[3][i] ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( !approx_equals
Packit 577717
			 ( ( double ) values[7][i], ( double ) values[3][i] ) )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
		if ( values[8][i] != 0LL )
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit 577717
	}
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
}