Blame src/ctests/p4_lst_ins.c

Packit 577717
/* This code demonstrates the behavior of PAPI_LD_INS, PAPI_SR_INS and PAPI_LST_INS
Packit 577717
	on a Pentium 4 processor. Because of the way these events are implemented in
Packit 577717
	hardware, LD and SR cannot be counted in the presence of either of the other 
Packit 577717
	two events.
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, num_tests = 6, tmp;
Packit 577717
	long long **values;
Packit 577717
	int EventSet = PAPI_NULL;
Packit 577717
	const PAPI_hw_info_t *hw_info;
Packit 577717
Packit 577717
	tests_quiet( argc, argv );	/* Set TESTS_QUIET variable */
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
	hw_info = PAPI_get_hardware_info(  );
Packit 577717
	if ( hw_info == NULL )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", 2 );
Packit 577717
Packit 577717
	if ( hw_info->vendor == PAPI_VENDOR_INTEL ) {
Packit 577717
	    /* Check for Pentium4 */
Packit 577717
	    if ( hw_info->cpuid_family != 15 ) {
Packit 577717
		test_skip( __FILE__, __LINE__,
Packit 577717
			"This test is intended only for Pentium 4.", 1 );
Packit 577717
	    }
Packit 577717
	} else {
Packit 577717
	    test_skip( __FILE__, __LINE__, 
Packit 577717
		    "This test is intended only for Pentium 4.", 1 );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_create_eventset( &EventSet );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit 577717
Packit 577717
	values = allocate_test_space( num_tests, 2 );
Packit 577717
Packit 577717
/* First test: just PAPI_LD_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_LD_INS", retval );
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 / 10 );
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
	retval = PAPI_remove_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_LD_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
/* Second test: just PAPI_SR_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_SR_INS", retval );
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 / 10 );
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
	retval = PAPI_remove_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_SR_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
/* Third test: just PAPI_LST_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_LST_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_LST_INS", retval );
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 / 10 );
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
/* Fourth test: PAPI_LST_INS and PAPI_LD_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_LD_INS", retval );
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 / 10 );
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_remove_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_LD_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
/* Fifth test: PAPI_LST_INS and PAPI_SR_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_SR_INS", retval );
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 / 10 );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[4] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
Packit 577717
	retval = PAPI_remove_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_SR_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
	retval = PAPI_remove_event( EventSet, PAPI_LST_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_LST_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
/* Sixth test: PAPI_LD_INS and PAPI_SR_INS */
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_LD_INS", retval );
Packit 577717
Packit 577717
	retval = PAPI_add_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_add_event: PAPI_SR_INS", retval );
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 / 10 );
Packit 577717
Packit 577717
	retval = PAPI_stop( EventSet, values[5] );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
Packit 577717
Packit 577717
	retval = PAPI_remove_event( EventSet, PAPI_LD_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_LD_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
	retval = PAPI_remove_event( EventSet, PAPI_SR_INS );
Packit 577717
	if ( retval != PAPI_OK )
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_remove_event: PAPI_SR_INS",
Packit 577717
				   retval );
Packit 577717
Packit 577717
Packit 577717
Packit 577717
	if ( !TESTS_QUIET ) {
Packit 577717
		printf( "Pentium 4 Load / Store tests.\n" );
Packit 577717
		printf
Packit 577717
			( "These PAPI events are counted by setting a tag at the front of the pipeline,\n" );
Packit 577717
		printf
Packit 577717
			( "and counting tags at the back of the pipeline. All the tags are the same 'color'\n" );
Packit 577717
		printf
Packit 577717
			( "and can't be distinguished from each other. Therefore, PAPI_LD_INS and PAPI_SR_INS\n" );
Packit 577717
		printf
Packit 577717
			( "cannot be counted with the other two events, or the answer will always == PAPI_LST_INS.\n" );
Packit 577717
		printf
Packit 577717
			( "-------------------------------------------------------------------------------------------\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 / 10 );
Packit 577717
		printf
Packit 577717
			( "-------------------------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
		printf
Packit 577717
			( "Test:                1            2            3            4            5            6\n" );
Packit 577717
		printf( "%s %12lld %12s %12s %12lld %12s %12lld\n", "PAPI_LD_INS: ",
Packit 577717
				( values[0] )[0], "------", "------", ( values[3] )[1],
Packit 577717
				"------", ( values[5] )[0] );
Packit 577717
		printf( "%s %12s %12lld %12s %12s %12lld %12lld\n", "PAPI_SR_INS: ",
Packit 577717
				"------", ( values[1] )[0], "------", "------",
Packit 577717
				( values[4] )[1], ( values[5] )[1] );
Packit 577717
		printf( "%s %12s %12s %12lld %12lld %12lld %12s\n", "PAPI_LST_INS:",
Packit 577717
				"------", "------", ( values[2] )[0], ( values[3] )[0],
Packit 577717
				( values[4] )[0], "------" );
Packit 577717
		printf
Packit 577717
			( "-------------------------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
		printf( "Test 1: PAPI_LD_INS only.\n" );
Packit 577717
		printf( "Test 2: PAPI_SR_INS only.\n" );
Packit 577717
		printf( "Test 3: PAPI_LST_INS only.\n" );
Packit 577717
		printf( "Test 4: PAPI_LD_INS and PAPI_LST_INS.\n" );
Packit 577717
		printf( "Test 5: PAPI_SR_INS and PAPI_LST_INS.\n" );
Packit 577717
		printf( "Test 6: PAPI_LD_INS and PAPI_SR_INS.\n" );
Packit 577717
		printf
Packit 577717
			( "Verification: Values within each column should be the same.\n" );
Packit 577717
		printf( "              R3C3 ~= (R1C1 + R2C2) ~= all other entries.\n" );
Packit 577717
	}
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
Packit 577717
}