Blame src/ctests/hl_rates.c

Packit Service a1973e
/* file hl_rates.c
Packit Service a1973e
 * This test exercises the four PAPI High Level rate calls:
Packit Service a1973e
 *    PAPI_flops, PAPI_flips, PAPI_ipc, and PAPI_epc
Packit Service a1973e
 * flops and flips report cumulative real and process time since the first call,
Packit Service a1973e
 * and either floating point operations or instructions since the first call.
Packit Service a1973e
 * Also reported is incremental flop or flip rate since the last call.
Packit Service a1973e
 *
Packit Service a1973e
 * PAPI_ipc reports the same cumulative information, substituting
Packit Service a1973e
 * total instructions for flops or flips, and also reports
Packit Service a1973e
 * instructions per (process) cycle as a measure of execution efficiency.
Packit Service a1973e
 *
Packit Service a1973e
 * PAPI_epc is new in PAPI 5.2. It reports the same information as PAPI_IPC,
Packit Service a1973e
 * but for an arbitrary event instead of total cycles. It also reports
Packit Service a1973e
 * incremental core and (where available) reference cycles to allow the
Packit Service a1973e
 * computation of effective clock rates in the presence of clock scaling
Packit Service a1973e
 * like speed step or turbo-boost.
Packit Service a1973e
 *
Packit Service a1973e
 * This test computes a 1000 x 1000 matrix multiply for orders of indexing for
Packit Service a1973e
 * each of the four rate calls. It also accepts a command line parameter
Packit Service a1973e
 * for the event to be measured for PAPI_epc. If not provided, PAPI_TOT_INS
Packit Service a1973e
 * is measured.
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
#include "testcode.h"
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
main( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
	int retval, event = 0;
Packit Service a1973e
	float rtime, ptime, mflips, mflops, ipc, epc;
Packit Service a1973e
	long long flpins, flpops, ins, ref, core, evt;
Packit Service a1973e
Packit Service a1973e
	double mflips_classic,mflips_swapped;
Packit Service a1973e
	double mflops_classic,mflops_swapped;
Packit Service a1973e
	double ipc_classic,ipc_swapped;
Packit Service a1973e
	double epc_classic,epc_swapped;
Packit Service a1973e
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
	/* Initialize the test matrix */
Packit Service a1973e
	flops_float_init_matrix();
Packit Service a1973e
Packit Service a1973e
	/************************/
Packit Service a1973e
	/* FLIPS		*/
Packit Service a1973e
	/************************/
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\n----------------------------------\n" );
Packit Service a1973e
		printf( "PAPI_flips\n");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Run flips at start */
Packit Service a1973e
	retval=PAPI_flips(&rtime, &ptime, &flpins, &mflips);
Packit Service a1973e
	if (retval!=PAPI_OK) {
Packit Service a1973e
		if (!quiet) PAPI_perror( "PAPI_flips" );
Packit Service a1973e
		if (retval==PAPI_ENOEVNT) {
Packit Service a1973e
			test_skip(__FILE__,__LINE__,"Could not add event",0);
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nStart\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Instructions: %lld\n", flpins);
Packit Service a1973e
		printf( "MFLIPS           %f\n", mflips);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Be sure we are all zero at beginning */
Packit Service a1973e
	if ((rtime!=0) || (ptime!=0) || (flpins!=0) || (mflips!=0)) {
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Not initialized to zero",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Flips classic
Packit Service a1973e
	flops_float_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_flips(&rtime, &ptime, &flpins, &mflips)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_flips" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nClassic\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Instructions: %lld\n", flpins);
Packit Service a1973e
		printf( "MFLIPS           %f\n", mflips);
Packit Service a1973e
	}
Packit Service a1973e
	mflips_classic=mflips;
Packit Service a1973e
Packit Service a1973e
	// Flips swapped
Packit Service a1973e
	flops_float_swapped_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_flips(&rtime, &ptime, &flpins, &mflips)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_flips" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nSwapped\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Instructions: %lld\n", flpins);
Packit Service a1973e
		printf( "MFLIPS           %f\n", mflips);
Packit Service a1973e
	}
Packit Service a1973e
	mflips_swapped=mflips;
Packit Service a1973e
Packit Service a1973e
	// turn off flips
Packit Service a1973e
	if ( PAPI_stop_counters(NULL, 0)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_stop_counters" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/************************/
Packit Service a1973e
	/* FLOPS		*/
Packit Service a1973e
	/************************/
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\n----------------------------------\n" );
Packit Service a1973e
		printf( "PAPI_flops\n");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Start flops
Packit Service a1973e
	if ( PAPI_flops(&rtime, &ptime, &flpops, &mflops)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_flops" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nStart\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Operations:   %lld\n", flpops);
Packit Service a1973e
		printf( "MFLOPS           %f\n", mflops);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Be sure we are all zero at beginning */
Packit Service a1973e
	if ((rtime!=0) || (ptime!=0) || (flpops!=0) || (mflops!=0)) {
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Not initialized to zero",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Classic flops
Packit Service a1973e
	flops_float_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_flops(&rtime, &ptime, &flpops, &mflops)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_flops" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nClassic\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Operations:   %lld\n", flpops);
Packit Service a1973e
		printf( "MFLOPS           %f\n", mflops);
Packit Service a1973e
	}
Packit Service a1973e
	mflops_classic=mflops;
Packit Service a1973e
Packit Service a1973e
	// Swapped flops
Packit Service a1973e
	flops_float_swapped_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_flops(&rtime, &ptime, &flpops, &mflops)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_flops" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nSwapped\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "FP Operations:   %lld\n", flpops);
Packit Service a1973e
		printf( "MFLOPS           %f\n", mflops);
Packit Service a1973e
	}
Packit Service a1973e
	mflops_swapped=mflops;
Packit Service a1973e
Packit Service a1973e
	// turn off flops
Packit Service a1973e
	if ( PAPI_stop_counters(NULL, 0)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_stop_counters" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/************************/
Packit Service a1973e
	/* IPC  		*/
Packit Service a1973e
	/************************/
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\n----------------------------------\n" );
Packit Service a1973e
		printf( "PAPI_ipc\n");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Start ipc
Packit Service a1973e
	if ( PAPI_ipc(&rtime, &ptime, &ins, &ipc)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_ipc" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nStart\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Instructions:    %lld\n", ins);
Packit Service a1973e
		printf( "IPC              %f\n", ipc);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Be sure we are all zero at beginning */
Packit Service a1973e
	if ((rtime!=0) || (ptime!=0) || (ins!=0) || (ipc!=0)) {
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Not initialized to zero",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Classic ipc
Packit Service a1973e
	flops_float_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_ipc(&rtime, &ptime, &ins, &ipc)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_ipc" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nClassic\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Instructions:    %lld\n", ins);
Packit Service a1973e
		printf( "IPC              %f\n", ipc);
Packit Service a1973e
	}
Packit Service a1973e
	ipc_classic=ipc;
Packit Service a1973e
Packit Service a1973e
	// Swapped ipc
Packit Service a1973e
	flops_float_swapped_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_ipc(&rtime, &ptime, &ins, &ipc)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_ipc" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nSwapped\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Instructions:    %lld\n", ins);
Packit Service a1973e
		printf( "IPC              %f\n", ipc);
Packit Service a1973e
	}
Packit Service a1973e
	ipc_swapped=ipc;
Packit Service a1973e
Packit Service a1973e
	// turn off ipc
Packit Service a1973e
	if ( PAPI_stop_counters(NULL, 0)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_stop_counters" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	/************************/
Packit Service a1973e
	/* EPC  		*/
Packit Service a1973e
	/************************/
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\n----------------------------------\n" );
Packit Service a1973e
		printf( "PAPI_epc\n");
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* This unfortunately conflicts a bit with the TESTS_QUIET */
Packit Service a1973e
	/* command line paramater nonsense.			   */
Packit Service a1973e
Packit Service a1973e
	if ( argc >= 2) {
Packit Service a1973e
		retval = PAPI_event_name_to_code( argv[1], &event );
Packit Service a1973e
		if (retval != PAPI_OK) {
Packit Service a1973e
		 	if (!quiet) printf("Can't find %s; Using PAPI_TOT_INS\n", argv[1]);
Packit Service a1973e
		 	event = PAPI_TOT_INS;
Packit Service a1973e
		} else {
Packit Service a1973e
		 	if (!quiet) printf("Using event %s\n", argv[1]);
Packit Service a1973e
		}
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Start epc
Packit Service a1973e
	if ( PAPI_epc(event, &rtime, &ptime, &ref, &core, &evt, &epc)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_epc" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nStart\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Ref Cycles:      %lld\n", ref);
Packit Service a1973e
		printf( "Core Cycles:     %lld\n", core);
Packit Service a1973e
		printf( "Events:          %lld\n", evt);
Packit Service a1973e
		printf( "EPC:             %f\n", epc);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Be sure we are all zero at beginning */
Packit Service a1973e
	if ((rtime!=0) || (ptime!=0) || (ref!=0) || (core!=0)
Packit Service a1973e
			|| (evt!=0) || (epc!=0)) {
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Not initialized to zero",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	// Classic epc
Packit Service a1973e
	flops_float_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_epc(event, &rtime, &ptime, &ref, &core, &evt, &epc)  != PAPI_OK )
Packit Service a1973e
		PAPI_perror( "PAPI_epc" );
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nClassic\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Ref Cycles:      %lld\n", ref);
Packit Service a1973e
		printf( "Core Cycles:     %lld\n", core);
Packit Service a1973e
		printf( "Events:          %lld\n", evt);
Packit Service a1973e
		printf( "EPC:             %f\n", epc);
Packit Service a1973e
	}
Packit Service a1973e
	epc_classic=epc;
Packit Service a1973e
Packit Service a1973e
	// Swapped epc
Packit Service a1973e
	flops_float_swapped_matrix_matrix_multiply();
Packit Service a1973e
	if ( PAPI_epc(event, &rtime, &ptime, &ref, &core, &evt, &epc)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_epc" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\nSwapped\n");
Packit Service a1973e
		printf( "real time:       %f\n", rtime);
Packit Service a1973e
		printf( "process time:    %f\n", ptime);
Packit Service a1973e
		printf( "Ref Cycles:      %lld\n", ref);
Packit Service a1973e
		printf( "Core Cycles:     %lld\n", core);
Packit Service a1973e
		printf( "Events:          %lld\n", evt);
Packit Service a1973e
		printf( "EPC:             %f\n", epc);
Packit Service a1973e
	}
Packit Service a1973e
	epc_swapped=epc;
Packit Service a1973e
Packit Service a1973e
	// turn off epc
Packit Service a1973e
	if ( PAPI_stop_counters(NULL, 0)  != PAPI_OK ) {
Packit Service a1973e
		PAPI_perror( "PAPI_stop_counters" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "\n----------------------------------\n" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Validate */
Packit Service a1973e
	if (mflips_swapped
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"FLIPS should be better when swapped",0);
Packit Service a1973e
	}
Packit Service a1973e
	if (mflops_swapped
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"FLOPS should be better when swapped",0);
Packit Service a1973e
	}
Packit Service a1973e
	if (ipc_swapped
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"IPC should be better when swapped",0);
Packit Service a1973e
	}
Packit Service a1973e
	if (epc_swapped
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"EPC should be better when swapped",0);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	test_pass( __FILE__ );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}