Blame src/ctests/mpifirst.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
   - Start counters
Packit 577717
   - Do flops
Packit 577717
   - Read counters
Packit 577717
   - Reset counters
Packit 577717
   - Do flops
Packit 577717
   - Read counters
Packit 577717
   - Do flops
Packit 577717
   - Read counters
Packit 577717
   - Do flops
Packit 577717
   - Stop and read counters
Packit 577717
   - Read counters
Packit 577717
*/
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <string.h>
Packit 577717
#include <mpi.h>
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_test.h"
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int retval, num_tests = 5, num_events, tmp;
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
Packit 577717
	MPI_Init( 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_INS ) == PAPI_OK ) {
Packit 577717
		PAPI_event = PAPI_FP_INS;
Packit 577717
		mask = MASK_FP_INS | MASK_TOT_CYC;
Packit 577717
	} else {
Packit 577717
		PAPI_event = PAPI_TOT_INS;
Packit 577717
		mask = MASK_TOT_INS | MASK_TOT_CYC;
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
	sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
Packit 577717
Packit 577717
	EventSet = add_test_events( &num_events, &mask );
Packit 577717
Packit 577717
	values = allocate_test_space( num_tests, num_events );
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
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[0] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
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
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[1] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
Packit 577717
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_read( EventSet, values[2] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_read", retval );
Packit 577717
Packit 577717
	do_flops( NUM_FLOPS );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[3] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
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
	remove_test_events( &EventSet, mask );
Packit 577717
Packit 577717
	if ( !quiet ) {
Packit 577717
		printf( "Test case 1: Non-overlapping start, stop, read.\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   : \t1\t\t2\t\t3\t\t4\t\t5\n" );
Packit 577717
		sprintf( add_event_str, "%s : ", event_name );
Packit 577717
		printf( TAB5, add_event_str,
Packit 577717
				( values[0] )[0], ( values[1] )[0], ( values[2] )[0],
Packit 577717
				( values[3] )[0], ( values[4] )[0] );
Packit 577717
		printf( TAB5, "PAPI_TOT_CYC: ", ( values[0] )[1], ( values[1] )[1],
Packit 577717
				( values[2] )[1], ( values[3] )[1], ( values[4] )[1] );
Packit 577717
		printf
Packit 577717
			( "-------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
		printf( "Verification:\n" );
Packit 577717
		printf( "Column 1 approximately equals column 2\n" );
Packit 577717
		printf( "Column 3 approximately equals 2 * column 2\n" );
Packit 577717
		printf( "Column 4 approximately equals 3 * column 2\n" );
Packit 577717
		printf( "Column 4 exactly equals column 5\n" );
Packit 577717
	}
Packit 577717
Packit 577717
	{
Packit 577717
		long long min, max;
Packit 577717
		min = ( long long ) ( values[1][0] * .9 );
Packit 577717
		max = ( long long ) ( values[1][0] * 1.1 );
Packit 577717
Packit 577717
		if ( values[0][0] > max || values[0][0] < min ||
Packit 577717
			 values[2][0] > ( 2 * max )
Packit 577717
			 || values[2][0] < ( 2 * min ) || values[3][0] > ( 3 * max )
Packit 577717
			 || values[3][0] < ( 3 * min )
Packit 577717
			 || values[3][0] != values[4][0] ) {
Packit 577717
			printf( "min: " );
Packit 577717
			printf( LLDFMT, min );
Packit 577717
			printf( "max: " );
Packit 577717
			printf( LLDFMT, max );
Packit 577717
			printf( "1st: " );
Packit 577717
			printf( LLDFMT, values[0][0] );
Packit 577717
			printf( "2nd: " );
Packit 577717
			printf( LLDFMT, values[1][0] );
Packit 577717
			printf( "3rd: " );
Packit 577717
			printf( LLDFMT, values[2][0] );
Packit 577717
			printf( "4th: " );
Packit 577717
			printf( LLDFMT, values[3][0] );
Packit 577717
			printf( "5th: " );
Packit 577717
			printf( LLDFMT, values[4][0] );
Packit 577717
			printf( "\n" );
Packit 577717
			test_fail( __FILE__, __LINE__, event_name, 1 );
Packit 577717
		}
Packit 577717
Packit 577717
		min = ( long long ) ( values[1][1] * .9 );
Packit 577717
		max = ( long long ) ( values[1][1] * 1.1 );
Packit 577717
		if ( values[0][1] > max || values[0][1] < min ||
Packit 577717
			 values[2][1] > ( 2 * max )
Packit 577717
			 || values[2][1] < ( 2 * min ) || values[3][1] > ( 3 * max )
Packit 577717
			 || values[3][1] < ( 3 * min )
Packit 577717
			 || values[3][1] != values[4][1] ) {
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_TOT_CYC", 1 );
Packit 577717
		}
Packit 577717
	}
Packit 577717
	test_pass( __FILE__, values, num_tests );
Packit 577717
Packit 577717
	MPI_Finalize(  );
Packit 577717
	exit( 1 );
Packit 577717
}