// Some work exercising the cache simulator
// with a simple call graph
#include "../callgrind.h"
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100000
double *a, *b, *c;
void init()
{
int i;
for(i = 0; i< SIZE; i++) a[i] = b[i] = 1.0;
}
void do_add()
{
int i;
for(i = 0; i< SIZE; i++) {
a[i] += 1.0;
c[i] = a[i] + b[i];
}
}
double do_sum()
{
int i;
double sum=0.0;
do_add();
for(i = 0; i< SIZE; i++) sum += c[i];
return sum;
}
double do_some_work(int iter)
{
double sum=0.0;
if (iter > 0) sum += do_some_work(iter-1);
do_add();
sum += do_sum();
return sum;
}
int main(void)
{
double res;
a = (double*) malloc(SIZE * sizeof(double));
b = (double*) malloc(SIZE * sizeof(double));
c = (double*) malloc(SIZE * sizeof(double));
CALLGRIND_ZERO_STATS;
init();
res = do_some_work(1);
CALLGRIND_DUMP_STATS;
printf("Sum: %.0f\n", res);
return RUNNING_ON_VALGRIND;
}