Blame src/testlib/do_loops.c

Packit 577717
/* Compile me with -O0 or else you'll get none. */
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
#include <unistd.h>
Packit 577717
#include <assert.h>
Packit 577717
#include <fcntl.h>
Packit 577717
#include <sys/time.h>
Packit 577717
Packit 577717
#include "do_loops.h"
Packit 577717
Packit 577717
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS];
Packit 577717
volatile int buf_dummy = 0;
Packit 577717
volatile int *flush = NULL;
Packit 577717
volatile int flush_dummy = 0;
Packit 577717
volatile double a = 0.5, b = 2.2;
Packit 577717
Packit 577717
void
Packit 577717
do_reads( int n )
Packit 577717
{
Packit 577717
	int i, retval;
Packit 577717
	static int fd = -1;
Packit 577717
	char buf;
Packit 577717
Packit 577717
	if ( fd == -1 ) {
Packit 577717
		fd = open( "/dev/zero", O_RDONLY );
Packit 577717
		if ( fd == -1 ) {
Packit 577717
			perror( "open(/dev/zero)" );
Packit 577717
			exit( 1 );
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	for ( i = 0; i < n; i++ ) {
Packit 577717
		retval = ( int ) read( fd, &buf, sizeof ( buf ) );
Packit 577717
		if ( retval != sizeof ( buf ) ) {
Packit 577717
			if ( retval < 0 )
Packit 577717
				perror( "/dev/zero cannot be read" );
Packit 577717
			else
Packit 577717
				fprintf( stderr,
Packit 577717
						 "/dev/zero cannot be read: only got %d bytes.\n",
Packit 577717
						 retval );
Packit 577717
			exit( 1 );
Packit 577717
		}
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_reads( int *n )
Packit 577717
{
Packit 577717
	do_reads( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_reads_( int *n )
Packit 577717
{
Packit 577717
	do_reads( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_reads__( int *n )
Packit 577717
{
Packit 577717
	do_reads( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
FDO_READS( int *n )
Packit 577717
{
Packit 577717
	do_reads( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_FDO_READS( int *n )
Packit 577717
{
Packit 577717
	do_reads( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_flops( int n )
Packit 577717
{
Packit 577717
	int i;
Packit 577717
	double c = 0.11;
Packit 577717
Packit 577717
	for ( i = 0; i < n; i++ ) {
Packit 577717
		c += a * b;
Packit 577717
	}
Packit 577717
	dummy( ( void * ) &c );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flops( int *n )
Packit 577717
{
Packit 577717
	do_flops( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flops_( int *n )
Packit 577717
{
Packit 577717
	do_flops( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flops__( int *n )
Packit 577717
{
Packit 577717
	do_flops( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
FDO_FLOPS( int *n )
Packit 577717
{
Packit 577717
	do_flops( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_FDO_FLOPS( int *n )
Packit 577717
{
Packit 577717
	do_flops( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_misses( int n, int bytes )
Packit 577717
{
Packit 577717
	register int i, j, tmp = buf_dummy, len = bytes / ( int ) sizeof ( int );
Packit 577717
	dummy( ( void * ) buf );
Packit 577717
	dummy( ( void * ) &buf_dummy );
Packit 577717
	assert( len <= CACHE_FLUSH_BUFFER_SIZE_INTS );
Packit 577717
	for ( j = 0; j < n; j++ ) {
Packit 577717
		for ( i = 0; i < len; i++ ) {
Packit 577717
			/* We need to read, modify, write here to look
Packit 577717
			   out for the write allocate policies. */
Packit 577717
			buf[i] += tmp;
Packit 577717
			/* Fake out some naive prefetchers */
Packit 577717
			buf[len - 1 - i] -= tmp;
Packit 577717
		}
Packit 577717
		tmp += len;
Packit 577717
	}
Packit 577717
	buf_dummy = tmp;
Packit 577717
	dummy( ( void * ) buf );
Packit 577717
	dummy( ( void * ) &buf_dummy );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_misses( int *n, int *size )
Packit 577717
{
Packit 577717
	do_misses( *n, *size );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_misses_( int *n, int *size )
Packit 577717
{
Packit 577717
	do_misses( *n, *size );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_misses__( int *n, int *size )
Packit 577717
{
Packit 577717
	do_misses( *n, *size );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
FDO_MISSES( int *n, int *size )
Packit 577717
{
Packit 577717
	do_misses( *n, *size );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_FDO_MISSES( int *n, int *size )
Packit 577717
{
Packit 577717
	do_misses( *n, *size );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_flush( void )
Packit 577717
{
Packit 577717
	register int i;
Packit 577717
	if ( flush == NULL )
Packit 577717
		flush = ( int * ) malloc( ( 1024 * 1024 * 16 ) * sizeof ( int ) );
Packit 577717
	if ( !flush )
Packit 577717
		return;
Packit 577717
Packit 577717
	dummy( ( void * ) flush );
Packit 577717
	for ( i = 0; i < ( 1024 * 1024 * 16 ); i++ ) {
Packit 577717
		flush[i] += flush_dummy;
Packit 577717
	}
Packit 577717
	flush_dummy++;
Packit 577717
	dummy( ( void * ) flush );
Packit 577717
	dummy( ( void * ) &flush_dummy );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flush( void )
Packit 577717
{
Packit 577717
	do_flush(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flush_( void )
Packit 577717
{
Packit 577717
	do_flush(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_flush__( void )
Packit 577717
{
Packit 577717
	do_flush(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
FDO_FLUSH( void )
Packit 577717
{
Packit 577717
	do_flush(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_FDO_FLUSH( void )
Packit 577717
{
Packit 577717
	do_flush(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_l1misses( int n )
Packit 577717
{
Packit 577717
	do_misses( n, L1_MISS_BUFFER_SIZE_INTS );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_l1misses( int *n )
Packit 577717
{
Packit 577717
	do_l1misses( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_l1misses_( int *n )
Packit 577717
{
Packit 577717
	do_l1misses( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
fdo_l1misses__( int *n )
Packit 577717
{
Packit 577717
	do_l1misses( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
FDO_L1MISSES( int *n )
Packit 577717
{
Packit 577717
	do_l1misses( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_FDO_L1MISSES( int *n )
Packit 577717
{
Packit 577717
	do_l1misses( *n );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_stuff( void )
Packit 577717
{
Packit 577717
	static int loops = 0;
Packit 577717
Packit 577717
	if ( loops == 0 ) {
Packit 577717
		struct timeval now, then;
Packit 577717
		gettimeofday( &then, NULL );
Packit 577717
		do {
Packit 577717
			do_flops( NUM_FLOPS );
Packit 577717
			do_reads( NUM_READS );
Packit 577717
			do_misses( 1, 1024 * 1024 );
Packit 577717
			gettimeofday( &now, NULL );
Packit 577717
			loops++;
Packit 577717
		} while ( now.tv_sec - then.tv_sec < NUM_WORK_SECONDS );
Packit 577717
	} else {
Packit 577717
		int i = 0;
Packit 577717
		do {
Packit 577717
			do_flops( NUM_FLOPS );
Packit 577717
			do_reads( NUM_READS );
Packit 577717
			do_misses( 1, 1024 * 1024 );
Packit 577717
			i++;
Packit 577717
		} while ( i < loops );
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_stuff_( void )
Packit 577717
{
Packit 577717
	do_stuff(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
do_stuff__( void )
Packit 577717
{
Packit 577717
	do_stuff(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
DO_STUFF( void )
Packit 577717
{
Packit 577717
	do_stuff(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_DO_STUFF( void )
Packit 577717
{
Packit 577717
	do_stuff(  );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
dummy( void *array )
Packit 577717
{
Packit 577717
/* Confuse the compiler so as not to optimize
Packit 577717
   away the flops in the calling routine    */
Packit 577717
/* Cast the array as a void to eliminate unused argument warning */
Packit 577717
	( void ) array;
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
dummy_( void *array )
Packit 577717
{
Packit 577717
	( void ) array;
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
dummy__( void *array )
Packit 577717
{
Packit 577717
	( void ) array;
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
DUMMY( void *array )
Packit 577717
{
Packit 577717
	( void ) array;
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
_DUMMY( void *array )
Packit 577717
{
Packit 577717
	( void ) array;
Packit 577717
}
Packit 577717
Packit 577717
/* We have to actually touch the memory to confuse some
Packit 577717
 * systems, so they actually allocate the memory.
Packit 577717
 * -KSL
Packit 577717
 */
Packit 577717
void
Packit 577717
touch_dummy( double *array, int size )
Packit 577717
{
Packit 577717
	int i;
Packit 577717
	double *tmp = array;
Packit 577717
	for ( i = 0; i < size; i++, tmp++ )
Packit 577717
		*tmp = ( double ) rand(  );
Packit 577717
}