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