Blame src/testlib/clockcore.c

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
}