PAPI  5.0.1.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     n = n / 2;
00120     for ( j = 0; j < n; j++ ) {
00121         for ( i = 0; i < len; i++ ) {
00122             /* We need to read, modify, write here to look
00123                out for the write allocate policies. */
00124             buf[i] += tmp;
00125             /* Fake out some naive prefetchers */
00126             buf[len - 1 - i] -= tmp;
00127         }
00128         tmp += len;
00129     }
00130     buf_dummy = tmp;
00131     dummy( ( void * ) buf );
00132     dummy( ( void * ) &buf_dummy );
00133 }
00134 
00135 void
00136 fdo_misses( int *n, int *size )
00137 {
00138     do_misses( *n, *size );
00139 }
00140 
00141 void
00142 fdo_misses_( int *n, int *size )
00143 {
00144     do_misses( *n, *size );
00145 }
00146 
00147 void
00148 fdo_misses__( int *n, int *size )
00149 {
00150     do_misses( *n, *size );
00151 }
00152 
00153 void
00154 FDO_MISSES( int *n, int *size )
00155 {
00156     do_misses( *n, *size );
00157 }
00158 
00159 void
00160 _FDO_MISSES( int *n, int *size )
00161 {
00162     do_misses( *n, *size );
00163 }
00164 
00165 void
00166 do_flush( void )
00167 {
00168     register int i;
00169     if ( flush == NULL )
00170         flush = ( int * ) malloc( ( 1024 * 1024 * 16 ) * sizeof ( int ) );
00171     if ( !flush )
00172         return;
00173 
00174     dummy( ( void * ) flush );
00175     for ( i = 0; i < ( 1024 * 1024 * 16 ); i++ ) {
00176         flush[i] += flush_dummy;
00177     }
00178     flush_dummy++;
00179     dummy( ( void * ) flush );
00180     dummy( ( void * ) &flush_dummy );
00181 }
00182 
00183 void
00184 fdo_flush( void )
00185 {
00186     do_flush(  );
00187 }
00188 
00189 void
00190 fdo_flush_( void )
00191 {
00192     do_flush(  );
00193 }
00194 
00195 void
00196 fdo_flush__( void )
00197 {
00198     do_flush(  );
00199 }
00200 
00201 void
00202 FDO_FLUSH( void )
00203 {
00204     do_flush(  );
00205 }
00206 
00207 void
00208 _FDO_FLUSH( void )
00209 {
00210     do_flush(  );
00211 }
00212 
00213 void
00214 do_l1misses( int n )
00215 {
00216     do_misses( n, L1_MISS_BUFFER_SIZE_INTS );
00217 }
00218 
00219 void
00220 fdo_l1misses( int *n )
00221 {
00222     do_l1misses( *n );
00223 }
00224 
00225 void
00226 fdo_l1misses_( int *n )
00227 {
00228     do_l1misses( *n );
00229 }
00230 
00231 void
00232 fdo_l1misses__( int *n )
00233 {
00234     do_l1misses( *n );
00235 }
00236 
00237 void
00238 FDO_L1MISSES( int *n )
00239 {
00240     do_l1misses( *n );
00241 }
00242 
00243 void
00244 _FDO_L1MISSES( int *n )
00245 {
00246     do_l1misses( *n );
00247 }
00248 
00249 void
00250 do_stuff( void )
00251 {
00252     static int loops = 0;
00253 
00254     if ( loops == 0 ) {
00255         struct timeval now, then;
00256         gettimeofday( &then, NULL );
00257         do {
00258             do_flops( NUM_FLOPS );
00259             do_reads( NUM_READS );
00260             do_misses( 1, 1024 * 1024 );
00261             gettimeofday( &now, NULL );
00262             loops++;
00263         } while ( now.tv_sec - then.tv_sec < NUM_WORK_SECONDS );
00264     } else {
00265         int i = 0;
00266         do {
00267             do_flops( NUM_FLOPS );
00268             do_reads( NUM_READS );
00269             do_misses( 1, 1024 * 1024 );
00270             i++;
00271         } while ( i < loops );
00272     }
00273 }
00274 
00275 void
00276 do_stuff_( void )
00277 {
00278     do_stuff(  );
00279 }
00280 
00281 void
00282 do_stuff__( void )
00283 {
00284     do_stuff(  );
00285 }
00286 
00287 void
00288 DO_STUFF( void )
00289 {
00290     do_stuff(  );
00291 }
00292 
00293 void
00294 _DO_STUFF( void )
00295 {
00296     do_stuff(  );
00297 }
00298 
00299 #ifdef DUMMY_DRIVER
00300 int main(int argc, char **argv)
00301 {
00302   int c, i = NUM_FLOPS;
00303   if (argc > 1) {
00304      c =  atoi(argv[1]);
00305      if (c >= 0) {
00306        i = c;     
00307      }
00308   }
00309   do_flops(i);
00310   exit(0);
00311 }
00312 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines