PAPI  5.7.0.0
do_loops.c
Go to the documentation of this file.
1 /* Compile me with -O0 or else you'll get none. */
2 
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <assert.h>
7 #include <fcntl.h>
8 #include <sys/time.h>
9 
10 #include "do_loops.h"
11 
13 volatile int buf_dummy = 0;
14 volatile int *flush = NULL;
15 volatile int flush_dummy = 0;
16 volatile double a = 0.5, b = 2.2;
17 
18 void
19 do_reads( int n )
20 {
21  int i, retval;
22  static int fd = -1;
23  char buf;
24 
25  if ( fd == -1 ) {
26  fd = open( "/dev/zero", O_RDONLY );
27  if ( fd == -1 ) {
28  perror( "open(/dev/zero)" );
29  exit( 1 );
30  }
31  }
32 
33  for ( i = 0; i < n; i++ ) {
34  retval = ( int ) read( fd, &buf, sizeof ( buf ) );
35  if ( retval != sizeof ( buf ) ) {
36  if ( retval < 0 )
37  perror( "/dev/zero cannot be read" );
38  else
39  fprintf( stderr,
40  "/dev/zero cannot be read: only got %d bytes.\n",
41  retval );
42  exit( 1 );
43  }
44  }
45 }
46 
47 void
48 fdo_reads( int *n )
49 {
50  do_reads( *n );
51 }
52 
53 void
54 fdo_reads_( int *n )
55 {
56  do_reads( *n );
57 }
58 
59 void
60 fdo_reads__( int *n )
61 {
62  do_reads( *n );
63 }
64 
65 void
66 FDO_READS( int *n )
67 {
68  do_reads( *n );
69 }
70 
71 void
72 _FDO_READS( int *n )
73 {
74  do_reads( *n );
75 }
76 
77 void
78 do_flops( int n )
79 {
80  int i;
81  double c = 0.11;
82 
83  for ( i = 0; i < n; i++ ) {
84  c += a * b;
85  }
86  dummy( ( void * ) &c );
87 }
88 
89 void
90 fdo_flops( int *n )
91 {
92  do_flops( *n );
93 }
94 
95 void
96 fdo_flops_( int *n )
97 {
98  do_flops( *n );
99 }
100 
101 void
102 fdo_flops__( int *n )
103 {
104  do_flops( *n );
105 }
106 
107 void
108 FDO_FLOPS( int *n )
109 {
110  do_flops( *n );
111 }
112 
113 void
114 _FDO_FLOPS( int *n )
115 {
116  do_flops( *n );
117 }
118 
119 void
120 do_misses( int n, int bytes )
121 {
122  register int i, j, tmp = buf_dummy, len = bytes / ( int ) sizeof ( int );
123  dummy( ( void * ) buf );
124  dummy( ( void * ) &buf_dummy );
125  assert( len <= CACHE_FLUSH_BUFFER_SIZE_INTS );
126  for ( j = 0; j < n; j++ ) {
127  for ( i = 0; i < len; i++ ) {
128  /* We need to read, modify, write here to look
129  out for the write allocate policies. */
130  buf[i] += tmp;
131  /* Fake out some naive prefetchers */
132  buf[len - 1 - i] -= tmp;
133  }
134  tmp += len;
135  }
136  buf_dummy = tmp;
137  dummy( ( void * ) buf );
138  dummy( ( void * ) &buf_dummy );
139 }
140 
141 void
142 fdo_misses( int *n, int *size )
143 {
144  do_misses( *n, *size );
145 }
146 
147 void
148 fdo_misses_( int *n, int *size )
149 {
150  do_misses( *n, *size );
151 }
152 
153 void
154 fdo_misses__( int *n, int *size )
155 {
156  do_misses( *n, *size );
157 }
158 
159 void
160 FDO_MISSES( int *n, int *size )
161 {
162  do_misses( *n, *size );
163 }
164 
165 void
166 _FDO_MISSES( int *n, int *size )
167 {
168  do_misses( *n, *size );
169 }
170 
171 void
172 do_flush( void )
173 {
174  register int i;
175  if ( flush == NULL )
176  flush = ( int * ) malloc( ( 1024 * 1024 * 16 ) * sizeof ( int ) );
177  if ( !flush )
178  return;
179 
180  dummy( ( void * ) flush );
181  for ( i = 0; i < ( 1024 * 1024 * 16 ); i++ ) {
182  flush[i] += flush_dummy;
183  }
184  flush_dummy++;
185  dummy( ( void * ) flush );
186  dummy( ( void * ) &flush_dummy );
187 }
188 
189 void
190 fdo_flush( void )
191 {
192  do_flush( );
193 }
194 
195 void
196 fdo_flush_( void )
197 {
198  do_flush( );
199 }
200 
201 void
202 fdo_flush__( void )
203 {
204  do_flush( );
205 }
206 
207 void
208 FDO_FLUSH( void )
209 {
210  do_flush( );
211 }
212 
213 void
214 _FDO_FLUSH( void )
215 {
216  do_flush( );
217 }
218 
219 void
220 do_l1misses( int n )
221 {
223 }
224 
225 void
226 fdo_l1misses( int *n )
227 {
228  do_l1misses( *n );
229 }
230 
231 void
232 fdo_l1misses_( int *n )
233 {
234  do_l1misses( *n );
235 }
236 
237 void
238 fdo_l1misses__( int *n )
239 {
240  do_l1misses( *n );
241 }
242 
243 void
244 FDO_L1MISSES( int *n )
245 {
246  do_l1misses( *n );
247 }
248 
249 void
250 _FDO_L1MISSES( int *n )
251 {
252  do_l1misses( *n );
253 }
254 
255 void
256 do_stuff( void )
257 {
258  static int loops = 0;
259 
260  if ( loops == 0 ) {
261  struct timeval now, then;
262  gettimeofday( &then, NULL );
263  do {
264  do_flops( NUM_FLOPS );
265  do_reads( NUM_READS );
266  do_misses( 1, 1024 * 1024 );
267  gettimeofday( &now, NULL );
268  loops++;
269  } while ( now.tv_sec - then.tv_sec < NUM_WORK_SECONDS );
270  } else {
271  int i = 0;
272  do {
273  do_flops( NUM_FLOPS );
274  do_reads( NUM_READS );
275  do_misses( 1, 1024 * 1024 );
276  i++;
277  } while ( i < loops );
278  }
279 }
280 
281 void
282 do_stuff_( void )
283 {
284  do_stuff( );
285 }
286 
287 void
288 do_stuff__( void )
289 {
290  do_stuff( );
291 }
292 
293 void
294 DO_STUFF( void )
295 {
296  do_stuff( );
297 }
298 
299 void
300 _DO_STUFF( void )
301 {
302  do_stuff( );
303 }
304 
305 void
306 dummy( void *array )
307 {
308 /* Confuse the compiler so as not to optimize
309  away the flops in the calling routine */
310 /* Cast the array as a void to eliminate unused argument warning */
311  ( void ) array;
312 }
313 
314 void
315 dummy_( void *array )
316 {
317  ( void ) array;
318 }
319 
320 void
321 dummy__( void *array )
322 {
323  ( void ) array;
324 }
325 
326 void
327 DUMMY( void *array )
328 {
329  ( void ) array;
330 }
331 
332 void
333 _DUMMY( void *array )
334 {
335  ( void ) array;
336 }
337 
338 /* We have to actually touch the memory to confuse some
339  * systems, so they actually allocate the memory.
340  * -KSL
341  */
342 void
343 touch_dummy( double *array, int size )
344 {
345  int i;
346  double *tmp = array;
347  for ( i = 0; i < size; i++, tmp++ )
348  *tmp = ( double ) rand( );
349 }
void do_stuff__(void)
Definition: do_loops.c:288
void fdo_flush(void)
Definition: do_loops.c:190
ssize_t read(int fd, void *buf, size_t count)
Definition: appio.c:225
volatile int flush_dummy
Definition: do_loops.c:15
void _DO_STUFF(void)
Definition: do_loops.c:300
void _FDO_L1MISSES(int *n)
Definition: do_loops.c:250
void do_reads(int n)
Definition: do_loops.c:19
void fdo_l1misses(int *n)
Definition: do_loops.c:226
#define NUM_WORK_SECONDS
Definition: do_loops.h:1
void FDO_READS(int *n)
Definition: do_loops.c:66
void FDO_FLOPS(int *n)
Definition: do_loops.c:108
void fdo_misses__(int *n, int *size)
Definition: do_loops.c:154
void do_stuff(void)
Definition: do_loops.c:256
int fd
Definition: iozone.c:1291
static double array[ARRAYSIZE]
Definition: papi_l1_dca.c:23
void DUMMY(void *array)
Definition: do_loops.c:327
void _FDO_FLOPS(int *n)
Definition: do_loops.c:114
void dummy(void *array)
Definition: do_loops.c:306
int retval
Definition: zero_fork.c:53
#define CACHE_FLUSH_BUFFER_SIZE_INTS
Definition: do_loops.h:12
#define NUM_FLOPS
Definition: sdsc-mpx.c:24
double c
Definition: multiplex.c:22
void do_l1misses(int n)
Definition: do_loops.c:220
volatile int * flush
Definition: do_loops.c:14
void DO_STUFF(void)
Definition: do_loops.c:294
double tmp
void touch_dummy(double *array, int size)
Definition: do_loops.c:343
void fdo_l1misses__(int *n)
Definition: do_loops.c:238
void _FDO_FLUSH(void)
Definition: do_loops.c:214
#define NUM_READS
Definition: do_loops.h:4
void do_stuff_(void)
Definition: do_loops.c:282
int open(const char *pathname, int flags, mode_t mode)
Definition: appio.c:184
void fdo_flops__(int *n)
Definition: do_loops.c:102
void FDO_FLUSH(void)
Definition: do_loops.c:208
void fdo_l1misses_(int *n)
Definition: do_loops.c:232
void do_misses(int n, int bytes)
Definition: do_loops.c:120
void fdo_reads_(int *n)
Definition: do_loops.c:54
void do_flops(int n)
Definition: do_loops.c:78
void fdo_flush_(void)
Definition: do_loops.c:196
void FDO_L1MISSES(int *n)
Definition: do_loops.c:244
void fdo_flush__(void)
Definition: do_loops.c:202
void fdo_misses(int *n, int *size)
Definition: do_loops.c:142
void _DUMMY(void *array)
Definition: do_loops.c:333
__time_t tv_sec
void do_flush(void)
Definition: do_loops.c:172
int gettimeofday(void *ptr1, void *ptr2)
void fdo_reads__(int *n)
Definition: do_loops.c:60
volatile double b
Definition: do_loops.c:16
void _FDO_MISSES(int *n, int *size)
Definition: do_loops.c:166
int rand()
void dummy__(void *array)
Definition: do_loops.c:321
void _FDO_READS(int *n)
Definition: do_loops.c:72
void fdo_misses_(int *n, int *size)
Definition: do_loops.c:148
void fdo_flops_(int *n)
Definition: do_loops.c:96
#define L1_MISS_BUFFER_SIZE_INTS
Definition: do_loops.h:11
void fdo_reads(int *n)
Definition: do_loops.c:48
volatile double a
Definition: do_loops.c:16
void fdo_flops(int *n)
Definition: do_loops.c:90
void FDO_MISSES(int *n, int *size)
Definition: do_loops.c:160
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
Definition: do_loops.c:12
volatile int buf_dummy
Definition: do_loops.c:13
void exit()
int i
Definition: fileop.c:140
void dummy_(void *array)
Definition: do_loops.c:315