Blame src/ctests/profile.c

Packit 577717
/*
Packit 577717
* File:    profile.c
Packit 577717
* Author:  Philip Mucci
Packit 577717
*          mucci@cs.utk.edu
Packit 577717
* Mods:    Dan Terpstra
Packit 577717
*          terpstra@cs.utk.edu
Packit 577717
* Mods:    Maynard Johnson
Packit 577717
*          maynardj@us.ibm.com
Packit 577717
*/
Packit 577717
Packit 577717
/* This file performs the following test:
Packit 577717
	profiling and program info option call
Packit 577717
Packit 577717
   - This tests the SVR4 profiling interface of PAPI. These are counted
Packit 577717
   in the default counting domain and default granularity, depending on
Packit 577717
   the platform. Usually this is the user domain (PAPI_DOM_USER) and
Packit 577717
   thread context (PAPI_GRN_THR).
Packit 577717
Packit 577717
     The Eventset contains:
Packit 577717
     + PAPI_FP_INS (to profile)
Packit 577717
     + PAPI_TOT_CYC
Packit 577717
Packit 577717
   - Set up profile
Packit 577717
   - Start eventset 1
Packit 577717
   - Do both (flops and reads)
Packit 577717
   - Stop eventset 1
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
#include "prof_utils.h"
Packit 577717
Packit 577717
#include "do_loops.h"
Packit 577717
Packit 577717
#define PROFILE_ALL
Packit 577717
Packit 577717
static int
Packit 577717
do_profile( caddr_t start, unsigned long plength, unsigned scale, int thresh,
Packit 577717
			int bucket )
Packit 577717
{
Packit 577717
	int i, retval;
Packit 577717
	unsigned long blength;
Packit 577717
	int num_buckets;
Packit 577717
Packit 577717
	const char *profstr[5] = { "PAPI_PROFIL_POSIX",
Packit 577717
		"PAPI_PROFIL_RANDOM",
Packit 577717
		"PAPI_PROFIL_WEIGHTED",
Packit 577717
		"PAPI_PROFIL_COMPRESS",
Packit 577717
		"PAPI_PROFIL_<all>"
Packit 577717
	};
Packit 577717
Packit 577717
	int profflags[5] = { PAPI_PROFIL_POSIX,
Packit 577717
		PAPI_PROFIL_POSIX | PAPI_PROFIL_RANDOM,
Packit 577717
		PAPI_PROFIL_POSIX | PAPI_PROFIL_WEIGHTED,
Packit 577717
		PAPI_PROFIL_POSIX | PAPI_PROFIL_COMPRESS,
Packit 577717
		PAPI_PROFIL_POSIX | PAPI_PROFIL_WEIGHTED |
Packit 577717
			PAPI_PROFIL_RANDOM | PAPI_PROFIL_COMPRESS
Packit 577717
	};
Packit 577717
Packit 577717
	do_no_profile( TESTS_QUIET );
Packit 577717
	blength = prof_size( plength, scale, bucket, &num_buckets );
Packit 577717
	prof_alloc( 5, blength );
Packit 577717
Packit 577717
	for ( i = 0; i < 5; i++ ) {
Packit 577717
		if ( !TESTS_QUIET ) {
Packit 577717
			printf( "Test type   : \t%s\n", profstr[i] );
Packit 577717
		}
Packit 577717
Packit 577717
#ifndef SWPROFILE
Packit 577717
		if ( ( retval =
Packit 577717
			   PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
Packit 577717
							EventSet, PAPI_event, thresh,
Packit 577717
							profflags[i] | bucket ) ) != PAPI_OK ) {
Packit 577717
		   if (retval==PAPI_ENOSUPP) {
Packit 577717
		      char warning[BUFSIZ];
Packit 577717
Packit 577717
		      sprintf(warning,"PAPI_profil %s not supported",
Packit 577717
			      profstr[i]);
Packit 577717
		      test_warn( __FILE__, __LINE__, warning, 1 );
Packit 577717
		   }
Packit 577717
		   else {
Packit 577717
		      test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
Packit 577717
		   }
Packit 577717
		}
Packit 577717
#else
Packit 577717
		if ( ( retval =
Packit 577717
			   PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
Packit 577717
							EventSet, PAPI_event, thresh,
Packit 577717
							profflags[i] | bucket | PAPI_PROFIL_FORCE_SW ) ) !=
Packit 577717
			 PAPI_OK ) {
Packit 577717
		   test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
Packit 577717
		}
Packit 577717
#endif
Packit 577717
Packit 577717
		if ( retval != PAPI_OK )
Packit 577717
			break;
Packit 577717
Packit 577717
		if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK )
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_start", retval );
Packit 577717
Packit 577717
		do_flops( getenv( "NUM_FLOPS" ) ? atoi( getenv( "NUM_FLOPS" ) ) :
Packit 577717
				  NUM_FLOPS );
Packit 577717
Packit 577717
		if ( ( retval = PAPI_stop( EventSet, values[1] ) ) != PAPI_OK )
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
Packit 577717
		if ( !TESTS_QUIET ) {
Packit 577717
			printf( TAB1, event_name, ( values[1] )[0] );
Packit 577717
			printf( TAB1, "PAPI_TOT_CYC", ( values[1] )[1] );
Packit 577717
		}
Packit 577717
		retval = PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
Packit 577717
							EventSet, PAPI_event, 0,
Packit 577717
							profflags[i] );
Packit 577717
		if (retval != PAPI_OK ) {
Packit 577717
			test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if ( retval == PAPI_OK ) {
Packit 577717
		if (!TESTS_QUIET) prof_head( blength, bucket, num_buckets,
Packit 577717
				   "address\t\t\tflat\trandom\tweight\tcomprs\tall\n" );
Packit 577717
		if (!TESTS_QUIET) prof_out( start, 5, bucket, num_buckets, scale );
Packit 577717
		retval = prof_check( 5, bucket, num_buckets );
Packit 577717
	}
Packit 577717
Packit 577717
	for ( i = 0; i < 5; i++ ) {
Packit 577717
		free( profbuf[i] );
Packit 577717
	}
Packit 577717
Packit 577717
	return retval;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int num_tests = 6;
Packit 577717
	long length;
Packit 577717
	int mask;
Packit 577717
	int retval;
Packit 577717
	int mythreshold = THRESHOLD;
Packit 577717
	const PAPI_exe_info_t *prginfo;
Packit 577717
	caddr_t start, end;
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
Packit 577717
        if ( ( prginfo = PAPI_get_executable_info(  ) ) == NULL ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_get_executable_info", 1 );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_query_event(PAPI_TOT_CYC);
Packit 577717
	if (retval!=PAPI_OK) {
Packit 577717
		if (!quiet) printf("No events found\n");
Packit 577717
		test_skip(__FILE__, __LINE__,"No events found",1);
Packit 577717
	}
Packit 577717
Packit 577717
	mask = prof_events( num_tests );
Packit 577717
Packit 577717
#ifdef PROFILE_ALL
Packit 577717
/* use these lines to profile entire code address space */
Packit 577717
	start = prginfo->address_info.text_start;
Packit 577717
	end = prginfo->address_info.text_end;
Packit 577717
#else
Packit 577717
/* use these lines to profile only do_flops address space */
Packit 577717
	start = ( caddr_t ) do_flops;
Packit 577717
	end = ( caddr_t ) fdo_flops;
Packit 577717
/* Itanium and ppc64 processors return function descriptors instead of function addresses.
Packit 577717
   You must dereference the descriptor to get the address.
Packit 577717
*/
Packit 577717
#if defined(ITANIUM1) || defined(ITANIUM2) || defined(__powerpc64__)
Packit 577717
	start = ( caddr_t ) ( ( ( struct fdesc * ) start )->ip );
Packit 577717
	end = ( caddr_t ) ( ( ( struct fdesc * ) end )->ip );
Packit 577717
#endif
Packit 577717
#endif
Packit 577717
Packit 577717
#if defined(linux)
Packit 577717
	{
Packit 577717
		char *tmp = getenv( "THRESHOLD" );
Packit 577717
		if ( tmp )
Packit 577717
			mythreshold = atoi( tmp );
Packit 577717
	}
Packit 577717
#endif
Packit 577717
Packit 577717
	length = end - start;
Packit 577717
	if ( length < 0 ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "Profile length < 0!", ( int ) length );
Packit 577717
	}
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		prof_print_address( "Test case profile: "
Packit 577717
			"POSIX compatible profiling with hardware counters.\n",
Packit 577717
			prginfo );
Packit 577717
		prof_print_prof_info( start, end, mythreshold, event_name );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = do_profile( start, ( unsigned long ) length, FULL_SCALE,
Packit 577717
				mythreshold, PAPI_PROFIL_BUCKET_16 );
Packit 577717
	if ( retval == PAPI_OK ) {
Packit 577717
		retval = do_profile( start, ( unsigned long ) length,
Packit 577717
						FULL_SCALE, mythreshold,
Packit 577717
						PAPI_PROFIL_BUCKET_32 );
Packit 577717
	}
Packit 577717
	if ( retval == PAPI_OK ) {
Packit 577717
		retval = do_profile( start, ( unsigned long ) length,
Packit 577717
						FULL_SCALE, mythreshold,
Packit 577717
						PAPI_PROFIL_BUCKET_64 );
Packit 577717
	}
Packit 577717
Packit 577717
	remove_test_events( &EventSet, mask );
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
}
Packit 577717