112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo// Some work exercising the cache simulator
212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo// with a simple call graph
312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo#include "../callgrind.h"
512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo#include <stdio.h>
712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo#include <stdlib.h>
812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo#define SIZE 100000
1012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
1112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendodouble *a, *b, *c;
1212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
1312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendovoid init()
1412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo{
1512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   int i;
1612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   for(i = 0; i< SIZE; i++) a[i] = b[i] = 1.0;
1712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo}
1812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
1912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendovoid do_add()
2012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo{
2112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   int i;
2212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   for(i = 0; i< SIZE; i++) {
2312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo	a[i] += 1.0;
2412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo	c[i] = a[i] + b[i];
2512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   }
2612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo}
2712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
2812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendodouble do_sum()
2912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo{
3012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   int i;
3112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   double sum=0.0;
3212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
3312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   do_add();
3412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   for(i = 0; i< SIZE; i++) sum += c[i];
3512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
3612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   return sum;
3712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo}
3812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
3912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendodouble do_some_work(int iter)
4012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo{
4112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   double sum=0.0;
4212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
4312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   if (iter > 0) sum += do_some_work(iter-1);
4412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   do_add();
4512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   sum += do_sum();
4612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
4712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   return sum;
4812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo}
4912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
5012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendoint main(void)
5112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo{
5212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   double res;
5312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
5412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   a = (double*) malloc(SIZE * sizeof(double));
5512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   b = (double*) malloc(SIZE * sizeof(double));
5612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   c = (double*) malloc(SIZE * sizeof(double));
5712c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
5812c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   CALLGRIND_ZERO_STATS;
5912c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   init();
6012c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   res = do_some_work(1);
6112c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   CALLGRIND_DUMP_STATS;
6212c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
6312c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   printf("Sum: %.0f\n", res);
6412c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo   return RUNNING_ON_VALGRIND;
6512c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo}
6612c73f1d177d9edcdb3edfdc3ec29010f3bcd617weidendo
67