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