Blame src/validation_tests/flops_validation.c

Packit 577717
/* flops.c, based on the hl_rates.c ctest
Packit 577717
 *
Packit 577717
 * This test runs a "classic" matrix multiply
Packit 577717
 * and then runs it again with the inner loop swapped.
Packit 577717
 * the swapped version should have better MFLIPS/MFLOPS/IPC and we test that.
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 "testcode.h"
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	int retval;
Packit 577717
	double rtime, ptime, mflips, mflops, ipc;
Packit 577717
	long long flips=0, flops=0, ins[2];
Packit 577717
Packit 577717
	double rtime_start,rtime_end;
Packit 577717
	double ptime_start,ptime_end;
Packit 577717
Packit 577717
	double rtime_classic,rtime_swapped;
Packit 577717
	double mflips_classic,mflips_swapped;
Packit 577717
	double mflops_classic,mflops_swapped;
Packit 577717
	double ipc_classic,ipc_swapped;
Packit 577717
Packit 577717
	int quiet,event_added_flips,event_added_flops,event_added_ipc;
Packit 577717
Packit 577717
	int eventset=PAPI_NULL;
Packit 577717
Packit 577717
	/* Set TESTS_QUIET variable */
Packit 577717
	quiet=tests_quiet( argc, argv );
Packit 577717
Packit 577717
Packit 577717
	/* Init the PAPI library */
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
	/* Create the eventset */
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
Packit 577717
	/* Initialize the test matrix */
Packit 577717
	flops_float_init_matrix();
Packit 577717
Packit 577717
	/************************/
Packit 577717
	/* FLIPS		*/
Packit 577717
	/************************/
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\n----------------------------------\n" );
Packit 577717
		printf( "PAPI_flips\n");
Packit 577717
	}
Packit 577717
Packit 577717
	/* Add FP_INS event */
Packit 577717
	retval=PAPI_add_named_event(eventset,"PAPI_FP_INS");
Packit 577717
	if (retval!=PAPI_OK) {
Packit 577717
		if (!quiet) fprintf(stderr,"PAPI_FP_INS not available!\n");
Packit 577717
		event_added_flips=0;
Packit 577717
	}
Packit 577717
	else {
Packit 577717
		event_added_flips=1;
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_flips) {
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	// Flips classic
Packit 577717
	flops_float_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flips) {
Packit 577717
		PAPI_stop(eventset,&flips);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	mflips=flips/rtime;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nClassic\n");
Packit 577717
		printf( "real time:       %lf\n", rtime);
Packit 577717
		printf( "process time:    %lf\n", ptime);
Packit 577717
		printf( "FP Instructions: %lld\n", flips);
Packit 577717
		printf( "MFLIPS           %lf\n", mflips);
Packit 577717
	}
Packit 577717
	mflips_classic=mflips;
Packit 577717
Packit 577717
Packit 577717
	// Flips swapped
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flips) {
Packit 577717
		PAPI_reset(eventset);
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	flops_float_swapped_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flips) {
Packit 577717
		PAPI_stop(eventset,&flips);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	mflips=flips/rtime;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nSwapped\n");
Packit 577717
		printf( "real time:       %f\n", rtime);
Packit 577717
		printf( "process time:    %f\n", ptime);
Packit 577717
		printf( "FP Instructions: %lld\n", flips);
Packit 577717
		printf( "MFLIPS           %f\n", mflips);
Packit 577717
	}
Packit 577717
	mflips_swapped=mflips;
Packit 577717
Packit 577717
	// turn off flips
Packit 577717
	if (event_added_flips) {
Packit 577717
		retval=PAPI_remove_named_event(eventset,"PAPI_FP_INS");
Packit 577717
		if (retval!=PAPI_OK) {
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
				"PAPI_remove_named_event", retval );
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/************************/
Packit 577717
	/* FLOPS		*/
Packit 577717
	/************************/
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\n----------------------------------\n" );
Packit 577717
		printf( "PAPI_flops\n");
Packit 577717
	}
Packit 577717
Packit 577717
	/* Add FP_OPS event */
Packit 577717
	retval=PAPI_add_named_event(eventset,"PAPI_FP_OPS");
Packit 577717
	if (retval!=PAPI_OK) {
Packit 577717
		if (!quiet) fprintf(stderr,"PAPI_FP_OPS not available!\n");
Packit 577717
		event_added_flops=0;
Packit 577717
	}
Packit 577717
	else {
Packit 577717
		event_added_flops=1;
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_flops) {
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	// Classic flops
Packit 577717
	flops_float_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flops) {
Packit 577717
		PAPI_stop(eventset,&flops);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	mflops=flops/rtime;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nClassic\n");
Packit 577717
		printf( "real time:       %f\n", rtime);
Packit 577717
		printf( "process time:    %f\n", ptime);
Packit 577717
		printf( "FP Operations:   %lld\n", flops);
Packit 577717
		printf( "MFLOPS           %f\n", mflops);
Packit 577717
	}
Packit 577717
	mflops_classic=mflops;
Packit 577717
Packit 577717
	// Swapped flops
Packit 577717
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flops) {
Packit 577717
		PAPI_reset(eventset);
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	flops_float_swapped_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_flops) {
Packit 577717
		PAPI_stop(eventset,&flops);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	mflops=flops/rtime;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nSwapped\n");
Packit 577717
		printf( "real time:       %f\n", rtime);
Packit 577717
		printf( "process time:    %f\n", ptime);
Packit 577717
		printf( "FP Operations:   %lld\n", flops);
Packit 577717
		printf( "MFLOPS           %f\n", mflops);
Packit 577717
	}
Packit 577717
	mflops_swapped=mflops;
Packit 577717
Packit 577717
	// turn off flops
Packit 577717
	if (event_added_flops) {
Packit 577717
		retval=PAPI_remove_named_event(eventset,"PAPI_FP_OPS");
Packit 577717
		if (retval!=PAPI_OK) {
Packit 577717
			test_fail( __FILE__, __LINE__,
Packit 577717
				"PAPI_remove_named_event", retval );
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/************************/
Packit 577717
	/* IPC  		*/
Packit 577717
	/************************/
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\n----------------------------------\n" );
Packit 577717
		printf( "PAPI_ipc\n");
Packit 577717
	}
Packit 577717
Packit 577717
	/* Add PAPI_TOT_INS event */
Packit 577717
	retval=PAPI_add_named_event(eventset,"PAPI_TOT_INS");
Packit 577717
	if (retval!=PAPI_OK) {
Packit 577717
		if (!quiet) fprintf(stderr,"PAPI_TOT_INS not available!\n");
Packit 577717
		event_added_ipc=0;
Packit 577717
	}
Packit 577717
	else {
Packit 577717
		event_added_ipc=1;
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		/* Add PAPI_TOT_CYC event */
Packit 577717
		retval=PAPI_add_named_event(eventset,"PAPI_TOT_CYC");
Packit 577717
		if (retval!=PAPI_OK) {
Packit 577717
			if (!quiet) fprintf(stderr,"PAPI_TOT_CYC not available!\n");
Packit 577717
			event_added_ipc=0;
Packit 577717
		}
Packit 577717
		else {
Packit 577717
			event_added_ipc=1;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	// Classic ipc
Packit 577717
	flops_float_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		PAPI_stop(eventset,ins);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	ipc=(double)ins[0]/(double)ins[1];
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nClassic\n");
Packit 577717
		printf( "real time:       %lf\n", rtime);
Packit 577717
		printf( "process time:    %lf\n", ptime);
Packit 577717
		printf( "Instructions:    %lld\n", ins[0]);
Packit 577717
		printf( "Cycles:          %lld\n", ins[1]);
Packit 577717
		printf( "IPC              %lf\n", ipc);
Packit 577717
	}
Packit 577717
	ipc_classic=ipc;
Packit 577717
	rtime_classic=rtime;
Packit 577717
Packit 577717
	// Swapped ipc
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		PAPI_reset(eventset);
Packit 577717
		PAPI_start(eventset);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime_start=PAPI_get_real_usec();
Packit 577717
	ptime_start=PAPI_get_virt_usec();
Packit 577717
Packit 577717
Packit 577717
	flops_float_swapped_matrix_matrix_multiply();
Packit 577717
Packit 577717
	rtime_end=PAPI_get_real_usec();
Packit 577717
	ptime_end=PAPI_get_virt_usec();
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		PAPI_stop(eventset,ins);
Packit 577717
	}
Packit 577717
Packit 577717
	rtime=rtime_end-rtime_start;
Packit 577717
	ptime=ptime_end-ptime_start;
Packit 577717
Packit 577717
	ipc=(double)ins[0]/(double)ins[1];
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf( "\nSwapped\n");
Packit 577717
		printf( "real time:       %lf\n", rtime);
Packit 577717
		printf( "process time:    %lf\n", ptime);
Packit 577717
		printf( "Instructions:    %lld\n", ins[0]);
Packit 577717
		printf( "Cycles:          %lld\n", ins[1]);
Packit 577717
		printf( "IPC              %lf\n", ipc);
Packit 577717
	}
Packit 577717
	ipc_swapped=ipc;
Packit 577717
	rtime_swapped=rtime;
Packit 577717
Packit 577717
Packit 577717
	/* Validate */
Packit 577717
	if (event_added_flips) {
Packit 577717
		if (mflips_swapped
Packit 577717
			test_fail(__FILE__,__LINE__,
Packit 577717
				"FLIPS should be better when swapped",0);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_flops) {
Packit 577717
		if (mflops_swapped
Packit 577717
			test_fail(__FILE__,__LINE__,
Packit 577717
				"FLOPS should be better when swapped",0);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if (event_added_ipc) {
Packit 577717
		if (ipc_swapped
Packit 577717
			test_fail(__FILE__,__LINE__,
Packit 577717
				"IPC should be better when swapped",0);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if (rtime_swapped>rtime_classic) {
Packit 577717
		test_fail(__FILE__,__LINE__,
Packit 577717
				"time should be better when swapped",0);
Packit 577717
	}
Packit 577717
Packit 577717
	test_pass( __FILE__ );
Packit 577717
Packit 577717
	return 0;
Packit 577717
}