|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <math.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "clockcore.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define NUM_ITERS 1000000
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static char *func_name[] = {
|
|
Packit |
577717 |
"PAPI_get_real_cyc",
|
|
Packit |
577717 |
"PAPI_get_real_usec",
|
|
Packit |
577717 |
"PAPI_get_virt_cyc",
|
|
Packit |
577717 |
"PAPI_get_virt_usec"
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
static int CLOCK_ERROR = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
clock_res_check( int flag, int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if ( CLOCK_ERROR ) {
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
long long *elapsed_cyc, total_cyc = 0, uniq_cyc = 0, diff_cyc = 0;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
double min, max, average, std, tmp;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
elapsed_cyc = ( long long * ) calloc( NUM_ITERS, sizeof ( long long ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Real */
|
|
Packit |
577717 |
switch ( flag ) {
|
|
Packit |
577717 |
case 0:
|
|
Packit |
577717 |
for ( i = 0; i < NUM_ITERS; i++ )
|
|
Packit |
577717 |
elapsed_cyc[i] = ( long long ) PAPI_get_real_cyc( );
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
case 1:
|
|
Packit |
577717 |
for ( i = 0; i < NUM_ITERS; i++ )
|
|
Packit |
577717 |
elapsed_cyc[i] = ( long long ) PAPI_get_real_usec( );
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
case 2:
|
|
Packit |
577717 |
for ( i = 0; i < NUM_ITERS; i++ )
|
|
Packit |
577717 |
elapsed_cyc[i] = ( long long ) PAPI_get_virt_cyc( );
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
case 3:
|
|
Packit |
577717 |
for ( i = 0; i < NUM_ITERS; i++ )
|
|
Packit |
577717 |
elapsed_cyc[i] = ( long long ) PAPI_get_virt_usec( );
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
default:
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
min = max = ( double ) ( elapsed_cyc[1] - elapsed_cyc[0] );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 1; i < NUM_ITERS; i++ ) {
|
|
Packit |
577717 |
if ( elapsed_cyc[i] - elapsed_cyc[i - 1] < 0 ) {
|
|
Packit |
577717 |
CLOCK_ERROR = 1;
|
|
Packit |
577717 |
fprintf(stderr,"Error! Negative elapsed time\n");
|
|
Packit |
577717 |
free( elapsed_cyc );
|
|
Packit |
577717 |
return -1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
diff_cyc = elapsed_cyc[i] - elapsed_cyc[i - 1];
|
|
Packit |
577717 |
if ( min > diff_cyc )
|
|
Packit |
577717 |
min = ( double ) diff_cyc;
|
|
Packit |
577717 |
if ( max < diff_cyc )
|
|
Packit |
577717 |
max = ( double ) diff_cyc;
|
|
Packit |
577717 |
if ( diff_cyc != 0 )
|
|
Packit |
577717 |
uniq_cyc++;
|
|
Packit |
577717 |
total_cyc += diff_cyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
average = ( double ) total_cyc / ( NUM_ITERS - 1 );
|
|
Packit |
577717 |
std = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 1; i < NUM_ITERS; i++ ) {
|
|
Packit |
577717 |
tmp = ( double ) ( elapsed_cyc[i] - elapsed_cyc[i - 1] );
|
|
Packit |
577717 |
tmp = tmp - average;
|
|
Packit |
577717 |
std += tmp * tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
std = sqrt( std / ( NUM_ITERS - 2 ) );
|
|
Packit |
577717 |
printf( "%s: min %.3lf max %.3lf \n", func_name[flag], min, max );
|
|
Packit |
577717 |
printf( " average %.3lf std %.3lf\n", average, std );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( uniq_cyc == NUM_ITERS - 1 ) {
|
|
Packit |
577717 |
printf( "%s : %7.3f <%7.3f\n", func_name[flag],
|
|
Packit |
577717 |
( double ) total_cyc / ( double ) ( NUM_ITERS ),
|
|
Packit |
577717 |
( double ) total_cyc / ( double ) uniq_cyc );
|
|
Packit |
577717 |
} else if ( uniq_cyc ) {
|
|
Packit |
577717 |
printf( "%s : %7.3f %7.3f\n", func_name[flag],
|
|
Packit |
577717 |
( double ) total_cyc / ( double ) ( NUM_ITERS ),
|
|
Packit |
577717 |
( double ) total_cyc / ( double ) uniq_cyc );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
printf( "%s : %7.3f >%7.3f\n", func_name[flag],
|
|
Packit |
577717 |
( double ) total_cyc / ( double ) ( NUM_ITERS ),
|
|
Packit |
577717 |
( double ) total_cyc );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
free( elapsed_cyc );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
clockcore( int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
/* check PAPI_get_real_cyc */
|
|
Packit |
577717 |
clock_res_check( 0, quiet );
|
|
Packit |
577717 |
/* check PAPI_get_real_usec */
|
|
Packit |
577717 |
clock_res_check( 1, quiet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* check PAPI_get_virt_cyc */
|
|
Packit |
577717 |
/* Virtual */
|
|
Packit |
577717 |
if ( PAPI_get_virt_cyc( ) != -1 ) {
|
|
Packit |
577717 |
clock_res_check( 2, quiet );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
return CLOCKCORE_VIRT_CYC_FAIL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* check PAPI_get_virt_usec */
|
|
Packit |
577717 |
if ( PAPI_get_virt_usec( ) != -1 ) {
|
|
Packit |
577717 |
clock_res_check( 3, quiet );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
return CLOCKCORE_VIRT_USEC_FAIL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|