Blame src/ctests/reset_multiplex.c

Packit Service a1973e
/* This file performs the same tests as the reset test
Packit Service a1973e
   but does it with the events multiplexed.
Packit Service a1973e
Packit Service a1973e
   This is mostly to test perf_event, where resetting
Packit Service a1973e
   multiplexed events is handled differently than grouped events.
Packit Service a1973e
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
#include "do_loops.h"
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
main( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
	int retval, num_tests = 9, num_events, tmp, i;
Packit Service a1973e
	long long **values;
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
	int PAPI_event, mask;
Packit Service a1973e
	char event_name[PAPI_MAX_STR_LEN], add_event_str[PAPI_MAX_STR_LEN];
Packit Service a1973e
	int quiet;
Packit Service a1973e
Packit Service a1973e
	/* Set TESTS_QUIET variable */
Packit Service a1973e
	quiet = tests_quiet( argc, argv );
Packit Service a1973e
Packit Service a1973e
	/* Init the PAPI library */
Packit Service a1973e
	retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
	if ( retval != PAPI_VER_CURRENT ) {
Packit Service a1973e
	   test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
        retval = PAPI_multiplex_init(  );
Packit Service a1973e
        if ( retval == PAPI_ENOSUPP) {
Packit Service a1973e
           test_skip(__FILE__, __LINE__, "Multiplex not supported", 1);
Packit Service a1973e
        }
Packit Service a1973e
        else if ( retval != PAPI_OK ) {
Packit Service a1973e
           test_fail( __FILE__, __LINE__, "PAPI_multiplex_init", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/* add PAPI_TOT_CYC and one of the events in
Packit Service a1973e
	   PAPI_FP_INS, PAPI_FP_OPS or PAPI_TOT_INS,
Packit Service a1973e
	   depending on the availability of the event
Packit Service a1973e
	   on the platform */
Packit Service a1973e
	EventSet = add_two_events( &num_events, &PAPI_event, &mask );
Packit Service a1973e
Packit Service a1973e
	/* Set multiplexing on the eventset */
Packit Service a1973e
Packit Service a1973e
        retval = PAPI_set_multiplex( EventSet );
Packit Service a1973e
        if ( retval != PAPI_OK) {
Packit Service a1973e
           test_fail(__FILE__, __LINE__, "Setting multiplex", retval);
Packit Service a1973e
        }
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_event_code_to_name( PAPI_event, event_name );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
	   test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
Packit Service a1973e
	}
Packit Service a1973e
	sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
Packit Service a1973e
Packit Service a1973e
	values = allocate_test_space( num_tests, num_events );
Packit Service a1973e
Packit Service a1973e
	/*===== Test 1: Start/Stop =======================*/
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_start( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_stop( EventSet, values[0] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 2 Start/Stop =======================*/
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_start( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_stop( EventSet, values[1] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 3: Reset/Start/Stop =======================*/
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_reset( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_start( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_stop( EventSet, values[2] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 4: Start/Read =======================*/
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_start( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS / 2 );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_read( EventSet, values[3] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 5: Read =======================*/
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS / 2 );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_read( EventSet, values[4] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 6: Read/Accum =======================*/
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS / 2 );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_read( EventSet, values[5] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_accum( EventSet, values[5] );
Packit Service a1973e
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_accum", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 7: Read =======================*/
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS / 2 );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_read( EventSet, values[6] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 8 Reset/Stop =======================*/
Packit Service a1973e
	retval = PAPI_reset( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	do_flops( NUM_FLOPS / 2 );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_stop( EventSet, values[7] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/*===== Test 9: Reset/Read =======================*/
Packit Service a1973e
	retval = PAPI_reset( EventSet );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_reset", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_read( EventSet, values[8] );
Packit Service a1973e
	if ( retval != PAPI_OK ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	remove_test_events( &EventSet, mask );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "Test case: Start/Stop/Read/Accum/Reset.\n" );
Packit Service a1973e
		printf( "----------------------------------------------------------------\n" );
Packit Service a1973e
		tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
Packit Service a1973e
		printf( "Default domain is: %d (%s)\n", tmp,
Packit Service a1973e
			stringify_all_domains( tmp ) );
Packit Service a1973e
		tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
Packit Service a1973e
		printf( "Default granularity is: %d (%s)\n", tmp,
Packit Service a1973e
			stringify_granularity( tmp ) );
Packit Service a1973e
		printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
Packit Service a1973e
		printf( "-------------------------------------------------------------------------\n" );
Packit Service a1973e
Packit Service a1973e
		sprintf( add_event_str, "%s:", event_name );
Packit Service a1973e
		printf( "                           PAPI_TOT_CYC    %s\n", event_name );
Packit Service a1973e
		printf( "1. start,ops,stop          %10lld      %10lld\n", values[0][0],
Packit Service a1973e
			values[0][1] );
Packit Service a1973e
		printf( "2. start,ops,stop          %10lld      %10lld\n", values[1][0],
Packit Service a1973e
			values[1][1] );
Packit Service a1973e
		printf( "3. reset,start,ops,stop    %10lld      %10lld\n", values[2][0],
Packit Service a1973e
			values[2][1] );
Packit Service a1973e
		printf( "4. start,ops/2,read        %10lld      %10lld\n", values[3][0],
Packit Service a1973e
			values[3][1] );
Packit Service a1973e
		printf( "5. ops/2,read              %10lld      %10lld\n", values[4][0],
Packit Service a1973e
			values[4][1] );
Packit Service a1973e
		printf( "6. ops/2,accum             %10lld      %10lld\n", values[5][0],
Packit Service a1973e
			values[5][1] );
Packit Service a1973e
		printf( "7. ops/2,read              %10lld      %10lld\n", values[6][0],
Packit Service a1973e
			values[6][1] );
Packit Service a1973e
		printf( "8. reset,ops/2,stop        %10lld      %10lld\n", values[7][0],
Packit Service a1973e
			values[7][1] );
Packit Service a1973e
		printf( "9. reset,read              %10lld      %10lld\n", values[8][0],
Packit Service a1973e
			values[8][1] );
Packit Service a1973e
		printf( "-------------------------------------------------------------------------\n" );
Packit Service a1973e
		printf( "Verification:\n" );
Packit Service a1973e
		printf( "Row 1 approximately equals rows 2 and 3 \n" );
Packit Service a1973e
		printf( "Row 4 approximately equals 1/2 of row 3\n" );
Packit Service a1973e
		printf( "Row 5 approximately equals twice row 4\n" );
Packit Service a1973e
		printf( "Row 6 approximately equals 6 times row 4\n" );
Packit Service a1973e
		printf( "Rows 7 and 8 approximately equal row 4\n" );
Packit Service a1973e
		printf( "Row 9 equals 0\n" );
Packit Service a1973e
		printf( "%% difference between %s 1 & 2: %.2f\n", "PAPI_TOT_CYC",
Packit Service a1973e
			100.0 * ( float ) values[0][0] / ( float ) values[1][0] );
Packit Service a1973e
		printf( "%% difference between %s 1 & 2: %.2f\n", add_event_str,
Packit Service a1973e
			100.0 * ( float ) values[0][1] / ( float ) values[1][1] );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	for ( i = 0; i <= 1; i++ ) {
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[0][i], ( double ) values[1][i] ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[1][i], ( double ) values[2][i] ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[2][i], ( double ) values[3][i] * 2.0 ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[2][i], ( double ) values[4][i] ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[5][i], ( double ) values[3][i] * 6.0 ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[6][i], ( double ) values[3][i] ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( !approx_equals
Packit Service a1973e
			 ( ( double ) values[7][i], ( double ) values[3][i] ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
		if ( values[8][i] != 0LL )
Packit Service a1973e
			test_fail( __FILE__, __LINE__,
Packit Service a1973e
					   ( ( i == 0 ) ? "PAPI_TOT_CYC" : add_event_str ), 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	test_pass( __FILE__ );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}