#include #include #include #include #define CACHE_MIN (1024) #define CACHE_MAX (1024*1024) #define SAMPLE 10 int x[CACHE_MAX]; double get_seconds() { struct tms rusage; times(&rusage); return (double) (rusage.tms_utime)/CLK_TCK; } double get_secondsr() { struct tms rusage; return (double) times(&rusage)/CLK_TCK; } void main() { int register i, index, stride, limit, temp; int steps, tsteps, csize; double sec0, sec; /* timing variables */ char buf[1000]; FILE *f; for (csize = CACHE_MIN; csize <= CACHE_MAX; csize=csize*2) { sprintf (buf, "u%d.dat", csize); f = fopen (buf, "w"); fprintf (f, "# Size %d, Stride, Read+write (user)\n", csize * sizeof(int)); for (stride = 1; stride <= csize/2; stride=stride*2) { sec = 0; limit = csize - stride + 1; steps = 0; do { sec0 = get_seconds(); for (i=SAMPLE*stride; i != 0; i--) { for (index = 0; index < limit; index = index + stride) { x[index] = x[index] + 1; } } steps = steps + 1; sec = sec + (get_seconds() - sec0); } while (sec < 1.0); tsteps = 0; do { sec0 = get_seconds(); for (i=SAMPLE*stride; i != 0; i--) { for (index = 0; index < limit; index = index + stride) { temp = temp + index; } } tsteps = tsteps + 1; sec = sec + (get_seconds() - sec0); } while (tsteps < steps); fprintf(f, "%7d %14.0f\n", stride*sizeof(int), (double)sec*1e9/(steps*SAMPLE*stride*((limit-1)/stride+1))); printf("Size: %7d Stride: %7d read+write: %14.0f ns\n", csize*sizeof(int), stride*sizeof(int), (double)sec*1e9/(steps*SAMPLE*stride*((limit-1)/stride+1))); } fclose (f); } for (csize = CACHE_MIN; csize <= CACHE_MAX; csize=csize*2) { sprintf (buf, "r%d.dat", csize); f = fopen (buf, "w"); fprintf (f, "# Size %d, Stride, Read+write (real)\n", csize * sizeof(int)); for (stride = 1; stride <= csize/2; stride=stride*2) { sec = 0; limit = csize - stride + 1; steps = 0; do { sec0 = get_secondsr(); for (i=SAMPLE*stride; i != 0; i--) { for (index = 0; index < limit; index = index + stride) { x[index] = x[index] + 1; } } steps = steps + 1; sec = sec + (get_secondsr() - sec0); } while (sec < 1.0); tsteps = 0; do { sec0 = get_secondsr(); for (i=SAMPLE*stride; i != 0; i--) { for (index = 0; index < limit; index = index + stride) { temp = temp + index; } } tsteps = tsteps + 1; sec = sec + (get_secondsr() - sec0); } while (tsteps < steps); fprintf(f, "%7d %14.0f\n", stride*sizeof(int), (double)sec*1e9/(steps*SAMPLE*stride*((limit-1)/stride+1))); printf("Size: %7d Stride: %7d read+write: %14.0f ns\n", csize*sizeof(int), stride*sizeof(int), (double)sec*1e9/(steps*SAMPLE*stride*((limit-1)/stride+1))); } fclose (f); } f = fopen ("cache.plt", "w"); fprintf (f, "plot \\\n"); for (csize = CACHE_MIN; csize <= CACHE_MAX; csize=csize*2) { fprintf (f, "'u%d.dat' with linespoints, \\\n", csize); fprintf (f, "'r%d.dat' with linespoints%c \\\n", csize, csize == CACHE_MAX ? ' ' : ','); } fclose (f); }