// Some work exercising the cache simulator // with a simple call graph #include "../callgrind.h" #include #include #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; }