|
PAPI
5.3.0.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 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 }