PAPI  5.3.0.0
do_loops.c
Go to the documentation of this file.
00001 /* Compile me with -O0 or else you'll get none. */
00002 
00003 #include "papi_test.h"
00004 
00005 volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS];
00006 volatile int buf_dummy = 0;
00007 volatile int *flush = NULL;
00008 volatile int flush_dummy = 0;
00009 volatile double a = 0.5, b = 2.2;
00010 
00011 void
00012 do_reads( int n )
00013 {
00014     int i, retval;
00015     static int fd = -1;
00016     char buf;
00017 
00018     if ( fd == -1 ) {
00019         fd = open( "/dev/zero", O_RDONLY );
00020         if ( fd == -1 ) {
00021             perror( "open(/dev/zero)" );
00022             exit( 1 );
00023         }
00024     }
00025 
00026     for ( i = 0; i < n; i++ ) {
00027         retval = ( int ) read( fd, &buf, sizeof ( buf ) );
00028         if ( retval != sizeof ( buf ) ) {
00029             if ( retval < 0 )
00030                 perror( "/dev/zero cannot be read" );
00031             else
00032                 fprintf( stderr,
00033                          "/dev/zero cannot be read: only got %d bytes.\n",
00034                          retval );
00035             exit( 1 );
00036         }
00037     }
00038 }
00039 
00040 void
00041 fdo_reads( int *n )
00042 {
00043     do_reads( *n );
00044 }
00045 
00046 void
00047 fdo_reads_( int *n )
00048 {
00049     do_reads( *n );
00050 }
00051 
00052 void
00053 fdo_reads__( int *n )
00054 {
00055     do_reads( *n );
00056 }
00057 
00058 void
00059 FDO_READS( int *n )
00060 {
00061     do_reads( *n );
00062 }
00063 
00064 void
00065 _FDO_READS( int *n )
00066 {
00067     do_reads( *n );
00068 }
00069 
00070 void
00071 do_flops( int n )
00072 {
00073     int i;
00074     double c = 0.11;
00075 
00076     for ( i = 0; i < n; i++ ) {
00077         c += a * b;
00078     }
00079     dummy( ( void * ) &c );
00080 }
00081 
00082 void
00083 fdo_flops( int *n )
00084 {
00085     do_flops( *n );
00086 }
00087 
00088 void
00089 fdo_flops_( int *n )
00090 {
00091     do_flops( *n );
00092 }
00093 
00094 void
00095 fdo_flops__( int *n )
00096 {
00097     do_flops( *n );
00098 }
00099 
00100 void
00101 FDO_FLOPS( int *n )
00102 {
00103     do_flops( *n );
00104 }
00105 
00106 void
00107 _FDO_FLOPS( int *n )
00108 {
00109     do_flops( *n );
00110 }
00111 
00112 void
00113 do_misses( int n, int bytes )
00114 {
00115     register int i, j, tmp = buf_dummy, len = bytes / ( int ) sizeof ( int );
00116     dummy( ( void * ) buf );
00117     dummy( ( void * ) &buf_dummy );
00118     assert( len <= CACHE_FLUSH_BUFFER_SIZE_INTS );
00119     for ( j = 0; j < n; j++ ) {
00120         for ( i = 0; i < len; i++ ) {
00121             /* We need to read, modify, write here to look
00122                out for the write allocate policies. */
00123             buf[i] += tmp;
00124             /* Fake out some naive prefetchers */
00125             buf[len - 1 - i] -= tmp;
00126         }
00127         tmp += len;
00128     }
00129     buf_dummy = tmp;
00130     dummy( ( void * ) buf );
00131     dummy( ( void * ) &buf_dummy );
00132 }
00133 
00134 void
00135 fdo_misses( int *n, int *size )
00136 {
00137     do_misses( *n, *size );
00138 }
00139 
00140 void
00141 fdo_misses_( int *n, int *size )
00142 {
00143     do_misses( *n, *size );
00144 }
00145 
00146 void
00147 fdo_misses__( int *n, int *size )
00148 {
00149     do_misses( *n, *size );
00150 }
00151 
00152 void
00153 FDO_MISSES( int *n, int *size )
00154 {
00155     do_misses( *n, *size );
00156 }
00157 
00158 void
00159 _FDO_MISSES( int *n, int *size )
00160 {
00161     do_misses( *n, *size );
00162 }
00163 
00164 void
00165 do_flush( void )
00166 {
00167     register int i;
00168     if ( flush == NULL )
00169         flush = ( int * ) malloc( ( 1024 * 1024 * 16 ) * sizeof ( int ) );
00170     if ( !flush )
00171         return;
00172 
00173     dummy( ( void * ) flush );
00174     for ( i = 0; i < ( 1024 * 1024 * 16 ); i++ ) {
00175         flush[i] += flush_dummy;
00176     }
00177     flush_dummy++;
00178     dummy( ( void * ) flush );
00179     dummy( ( void * ) &flush_dummy );
00180 }
00181 
00182 void
00183 fdo_flush( void )
00184 {
00185     do_flush(  );
00186 }
00187 
00188 void
00189 fdo_flush_( void )
00190 {
00191     do_flush(  );
00192 }
00193 
00194 void
00195 fdo_flush__( void )
00196 {
00197     do_flush(  );
00198 }
00199 
00200 void
00201 FDO_FLUSH( void )
00202 {
00203     do_flush(  );
00204 }
00205 
00206 void
00207 _FDO_FLUSH( void )
00208 {
00209     do_flush(  );
00210 }
00211 
00212 void
00213 do_l1misses( int n )
00214 {
00215     do_misses( n, L1_MISS_BUFFER_SIZE_INTS );
00216 }
00217 
00218 void
00219 fdo_l1misses( int *n )
00220 {
00221     do_l1misses( *n );
00222 }
00223 
00224 void
00225 fdo_l1misses_( int *n )
00226 {
00227     do_l1misses( *n );
00228 }
00229 
00230 void
00231 fdo_l1misses__( int *n )
00232 {
00233     do_l1misses( *n );
00234 }
00235 
00236 void
00237 FDO_L1MISSES( int *n )
00238 {
00239     do_l1misses( *n );
00240 }
00241 
00242 void
00243 _FDO_L1MISSES( int *n )
00244 {
00245     do_l1misses( *n );
00246 }
00247 
00248 void
00249 do_stuff( void )
00250 {
00251     static int loops = 0;
00252 
00253     if ( loops == 0 ) {
00254         struct timeval now, then;
00255         gettimeofday( &then, NULL );
00256         do {
00257             do_flops( NUM_FLOPS );
00258             do_reads( NUM_READS );
00259             do_misses( 1, 1024 * 1024 );
00260             gettimeofday( &now, NULL );
00261             loops++;
00262         } while ( now.tv_sec - then.tv_sec < NUM_WORK_SECONDS );
00263     } else {
00264         int i = 0;
00265         do {
00266             do_flops( NUM_FLOPS );
00267             do_reads( NUM_READS );
00268             do_misses( 1, 1024 * 1024 );
00269             i++;
00270         } while ( i < loops );
00271     }
00272 }
00273 
00274 void
00275 do_stuff_( void )
00276 {
00277     do_stuff(  );
00278 }
00279 
00280 void
00281 do_stuff__( void )
00282 {
00283     do_stuff(  );
00284 }
00285 
00286 void
00287 DO_STUFF( void )
00288 {
00289     do_stuff(  );
00290 }
00291 
00292 void
00293 _DO_STUFF( void )
00294 {
00295     do_stuff(  );
00296 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines