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