Blame src/ctests/reset_multiplex.c

Packit 577717
/* This file performs the same tests as the reset test
Packit 577717
   but does it with the events multiplexed.
Packit 577717
Packit 577717
   This is mostly to test perf_event, where resetting
Packit 577717
   multiplexed events is handled differently than grouped events.
Packit 577717
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
        retval = PAPI_multiplex_init(  );
Packit 577717
        if ( retval == PAPI_ENOSUPP) {
Packit 577717
           test_skip(__FILE__, __LINE__, "Multiplex not supported", 1);
Packit 577717
        }
Packit 577717
        else if ( retval != PAPI_OK ) {
Packit 577717
           test_fail( __FILE__, __LINE__, "PAPI_multiplex_init", retval );
Packit 577717
	}
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
	/* Set multiplexing on the eventset */
Packit 577717
Packit 577717
        retval = PAPI_set_multiplex( EventSet );
Packit 577717
        if ( retval != PAPI_OK) {
Packit 577717
           test_fail(__FILE__, __LINE__, "Setting multiplex", retval);
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
	}
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
}