1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Some work exercising the cache simulator
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// with a simple call graph
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../callgrind.h"
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SIZE 100000
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndouble *a, *b, *c;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid init()
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for(i = 0; i< SIZE; i++) a[i] = b[i] = 1.0;
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_add()
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for(i = 0; i< SIZE; i++) {
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	a[i] += 1.0;
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	c[i] = a[i] + b[i];
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndouble do_sum()
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double sum=0.0;
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do_add();
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for(i = 0; i< SIZE; i++) sum += c[i];
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return sum;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndouble do_some_work(int iter)
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double sum=0.0;
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (iter > 0) sum += do_some_work(iter-1);
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do_add();
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sum += do_sum();
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return sum;
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void)
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   double res;
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   a = (double*) malloc(SIZE * sizeof(double));
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   b = (double*) malloc(SIZE * sizeof(double));
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   c = (double*) malloc(SIZE * sizeof(double));
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CALLGRIND_ZERO_STATS;
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   init();
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = do_some_work(1);
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CALLGRIND_DUMP_STATS;
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("Sum: %.0f\n", res);
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return RUNNING_ON_VALGRIND;
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67