|
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 |
}
|