Blame src/ctests/zero_flip.c

Packit 577717
/* This file performs the following test: start, stop and timer functionality
Packit 577717
Packit 577717
   - It attempts to use the following two counters.
Packit 577717
     It may use less depending on hardware counter resource limitations.
Packit 577717
     These are counted in the default counting domain and default granularity,
Packit 577717
     depending on the platform.
Packit 577717
     Usually this is the user domain (PAPI_DOM_USER) and
Packit 577717
     thread context (PAPI_GRN_THR).
Packit 577717
     + PAPI_FP_INS
Packit 577717
     + PAPI_TOT_CYC
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
#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
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int retval, eventcnt, events[2], i, tmp;
Packit 577717
	int EventSet1 = PAPI_NULL, EventSet2 = PAPI_NULL;
Packit 577717
	int PAPI_event;
Packit 577717
	long long values1[2], values2[2];
Packit 577717
	long long elapsed_us, elapsed_cyc;
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
	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_OPS ) == PAPI_OK )
Packit 577717
		PAPI_event = PAPI_FP_OPS;
Packit 577717
	else
Packit 577717
		PAPI_event = PAPI_TOT_INS;
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
	retval = PAPI_create_eventset( &EventSet1 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit 577717
Packit 577717
	/* Add the events */
Packit 577717
	if (!quiet) printf( "Adding: %s\n", event_name );
Packit 577717
	retval = PAPI_add_event( EventSet1, PAPI_event );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		if (!quiet) printf("Trouble adding event\n");
Packit 577717
		test_skip( __FILE__, __LINE__, "PAPI_add_event", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_add_event( EventSet1, PAPI_TOT_CYC );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
Packit 577717
Packit 577717
	/* Add them reversed to EventSet2 */
Packit 577717
Packit 577717
	retval = PAPI_create_eventset( &EventSet2 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit 577717
Packit 577717
	eventcnt = 2;
Packit 577717
	retval = PAPI_list_events( EventSet1, events, &eventcnt );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_list_events", retval );
Packit 577717
Packit 577717
	for ( i = eventcnt - 1; i >= 0; i-- ) {
Packit 577717
		retval = PAPI_event_code_to_name( events[i], event_name );
Packit 577717
		if ( retval != PAPI_OK )
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
Packit 577717
Packit 577717
		retval = PAPI_add_event( EventSet2, events[i] );
Packit 577717
		if ( retval != PAPI_OK )
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  );
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  );
Packit 577717
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_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet1, values1 );
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_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet2, values2 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
Packit 577717
	elapsed_us = PAPI_get_real_usec(  ) - elapsed_us;
Packit 577717
Packit 577717
	elapsed_cyc = PAPI_get_real_cyc(  ) - elapsed_cyc;
Packit 577717
Packit 577717
	retval = PAPI_cleanup_eventset( EventSet1 );	/* JT */
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
Packit 577717
Packit 577717
	retval = PAPI_destroy_eventset( &EventSet1 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", retval );
Packit 577717
Packit 577717
	retval = PAPI_cleanup_eventset( EventSet2 );	/* JT */
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
Packit 577717
Packit 577717
	retval = PAPI_destroy_eventset( &EventSet2 );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", retval );
Packit 577717
Packit 577717
	if ( !quiet ) {
Packit 577717
		printf( "Test case 0: start, stop.\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    : \t           1\t           2\n" );
Packit 577717
Packit 577717
		sprintf( add_event_str, "%-12s : \t", event_name );
Packit 577717
		printf( TAB2, add_event_str, values1[0], values2[1] );
Packit 577717
		printf( TAB2, "PAPI_TOT_CYC : \t", values1[1], values2[0] );
Packit 577717
		printf( TAB1, "Real usec    : \t", elapsed_us );
Packit 577717
		printf( TAB1, "Real cycles  : \t", elapsed_cyc );
Packit 577717
Packit 577717
		printf
Packit 577717
			( "-------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
		printf( "Verification: none\n" );
Packit 577717
	}
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
Packit 577717
}