PAPI 7.1.0.0
Loading...
Searching...
No Matches
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
13volatile int buf_dummy = 0;
14volatile int *flush = NULL;
15volatile int flush_dummy = 0;
16volatile double a = 0.5, b = 2.2;
17
18void
19do_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
47void
48fdo_reads( int *n )
49{
50 do_reads( *n );
51}
52
53void
54fdo_reads_( int *n )
55{
56 do_reads( *n );
57}
58
59void
60fdo_reads__( int *n )
61{
62 do_reads( *n );
63}
64
65void
66FDO_READS( int *n )
67{
68 do_reads( *n );
69}
70
71void
72_FDO_READS( int *n )
73{
74 do_reads( *n );
75}
76
77void
78do_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
89void
90fdo_flops( int *n )
91{
92 do_flops( *n );
93}
94
95void
96fdo_flops_( int *n )
97{
98 do_flops( *n );
99}
100
101void
102fdo_flops__( int *n )
103{
104 do_flops( *n );
105}
106
107void
108FDO_FLOPS( int *n )
109{
110 do_flops( *n );
111}
112
113void
114_FDO_FLOPS( int *n )
115{
116 do_flops( *n );
117}
118
119void
120do_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
141void
142fdo_misses( int *n, int *size )
143{
144 do_misses( *n, *size );
145}
146
147void
148fdo_misses_( int *n, int *size )
149{
150 do_misses( *n, *size );
151}
152
153void
154fdo_misses__( int *n, int *size )
155{
156 do_misses( *n, *size );
157}
158
159void
160FDO_MISSES( int *n, int *size )
161{
162 do_misses( *n, *size );
163}
164
165void
166_FDO_MISSES( int *n, int *size )
167{
168 do_misses( *n, *size );
169}
170
171void
172do_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
189void
191{
192 do_flush( );
193}
194
195void
197{
198 do_flush( );
199}
200
201void
203{
204 do_flush( );
205}
206
207void
209{
210 do_flush( );
211}
212
213void
215{
216 do_flush( );
217}
218
219void
221{
223}
224
225void
227{
228 do_l1misses( *n );
229}
230
231void
233{
234 do_l1misses( *n );
235}
236
237void
239{
240 do_l1misses( *n );
241}
242
243void
245{
246 do_l1misses( *n );
247}
248
249void
251{
252 do_l1misses( *n );
253}
254
255void
256do_stuff( void )
257{
258 static int loops = 0;
259
260 if ( loops == 0 ) {
261 struct timeval now, then;
262 gettimeofday( &then, NULL );
263 do {
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 {
275 do_misses( 1, 1024 * 1024 );
276 i++;
277 } while ( i < loops );
278 }
279}
280
281void
283{
284 do_stuff( );
285}
286
287void
289{
290 do_stuff( );
291}
292
293void
294DO_STUFF( void )
295{
296 do_stuff( );
297}
298
299void
301{
302 do_stuff( );
303}
304
305void
306dummy( 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
314void
315dummy_( void *array )
316{
317 ( void ) array;
318}
319
320void
322{
323 ( void ) array;
324}
325
326void
327DUMMY( void *array )
328{
329 ( void ) array;
330}
331
332void
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 */
342void
343touch_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}
double tmp
int i
int open(const char *pathname, int flags, mode_t mode)
Definition: appio.c:188
ssize_t read(int fd, void *buf, size_t count)
Definition: appio.c:229
void fdo_l1misses__(int *n)
Definition: do_loops.c:238
void dummy__(void *array)
Definition: do_loops.c:321
void _FDO_L1MISSES(int *n)
Definition: do_loops.c:250
void _DO_STUFF(void)
Definition: do_loops.c:300
void do_flops(int n)
Definition: do_loops.c:78
void fdo_flush__(void)
Definition: do_loops.c:202
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
Definition: do_loops.c:12
volatile int buf_dummy
Definition: do_loops.c:13
void FDO_MISSES(int *n, int *size)
Definition: do_loops.c:160
void fdo_reads__(int *n)
Definition: do_loops.c:60
void DUMMY(void *array)
Definition: do_loops.c:327
void fdo_flops__(int *n)
Definition: do_loops.c:102
void fdo_l1misses(int *n)
Definition: do_loops.c:226
void dummy_(void *array)
Definition: do_loops.c:315
void _FDO_FLUSH(void)
Definition: do_loops.c:214
volatile double b
Definition: do_loops.c:16
void _FDO_MISSES(int *n, int *size)
Definition: do_loops.c:166
void _DUMMY(void *array)
Definition: do_loops.c:333
void FDO_FLUSH(void)
Definition: do_loops.c:208
void fdo_reads(int *n)
Definition: do_loops.c:48
void fdo_misses__(int *n, int *size)
Definition: do_loops.c:154
void _FDO_READS(int *n)
Definition: do_loops.c:72
void do_stuff_(void)
Definition: do_loops.c:282
void fdo_flush(void)
Definition: do_loops.c:190
void FDO_READS(int *n)
Definition: do_loops.c:66
void _FDO_FLOPS(int *n)
Definition: do_loops.c:114
volatile int * flush
Definition: do_loops.c:14
volatile int flush_dummy
Definition: do_loops.c:15
void do_reads(int n)
Definition: do_loops.c:19
void fdo_flush_(void)
Definition: do_loops.c:196
void fdo_flops_(int *n)
Definition: do_loops.c:96
void do_l1misses(int n)
Definition: do_loops.c:220
void do_stuff__(void)
Definition: do_loops.c:288
void do_stuff(void)
Definition: do_loops.c:256
void DO_STUFF(void)
Definition: do_loops.c:294
void FDO_L1MISSES(int *n)
Definition: do_loops.c:244
void fdo_misses_(int *n, int *size)
Definition: do_loops.c:148
void fdo_misses(int *n, int *size)
Definition: do_loops.c:142
void touch_dummy(double *array, int size)
Definition: do_loops.c:343
void fdo_reads_(int *n)
Definition: do_loops.c:54
void do_flush(void)
Definition: do_loops.c:172
void FDO_FLOPS(int *n)
Definition: do_loops.c:108
void do_misses(int n, int bytes)
Definition: do_loops.c:120
volatile double a
Definition: do_loops.c:16
void fdo_l1misses_(int *n)
Definition: do_loops.c:232
void dummy(void *array)
Definition: do_loops.c:306
void fdo_flops(int *n)
Definition: do_loops.c:90
#define CACHE_FLUSH_BUFFER_SIZE_INTS
Definition: do_loops.h:12
#define NUM_READS
Definition: do_loops.h:4
#define L1_MISS_BUFFER_SIZE_INTS
Definition: do_loops.h:11
#define NUM_WORK_SECONDS
Definition: do_loops.h:1
static double c[MATRIX_SIZE][MATRIX_SIZE]
Definition: libmsr_basic.c:40
FILE * stderr
static double array[ARRAYSIZE]
Definition: papi_l1_dca.c:23
int
Definition: sde_internal.h:89
#define NUM_FLOPS
Definition: sdsc-mpx.c:24
__time_t tv_sec
int retval
Definition: zero_fork.c:53