|
PAPI
5.0.1.0
|
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