5 #define lsize sizeof(unsigned long)
7 long long usec_diff(const struct timeval *a, const struct timeval *b)
9 long long usec_a, usec_b;
10 usec_a = a->tv_sec * 1000000 + a->tv_usec;
11 usec_b = b->tv_sec * 1000000 + b->tv_usec;
12 return usec_b - usec_a;
15 int main(int argc, char *argv[])
17 int iterations, j, k, count, size, mask, latcount;
18 unsigned long *buf, i, tmp = 0;
19 struct timeval start, end;
21 printf("Benchmark sequential access bandwidth "
22 "and random access latency\n\n");
25 iterations = atoi(argv[1]);
30 count = atoi(argv[2]) * 1024;
33 latcount = count / 10;
35 printf("Doing %d runs with buffer size goin up to %dk\n",
36 iterations, 1 << (iterations - 10));
37 printf("Running each round %d times\n", count);
38 printf("Size of unsigned long is %d bits\n\n", (int)lsize * 8);
56 "-----------------------"
57 "-----------------------\n"
62 "-----------------------"
63 "-----------------------\n"
66 for (; j < iterations + 1; j++) {
67 size = (1 << j) / lsize;
68 buf = malloc(size * lsize);
72 printf("Malloc failed\n");
77 for (i = 0; i < size; i++)
80 printf("%8dk |", (int)(size * lsize / 1024));
86 gettimeofday(&start, 0);
87 for (k = 0; k < count; k++) {
89 for (i = 0; i < size; i++)
93 gettimeofday(&end, 0);
95 printf("% 9.2f ", (double)(size * lsize) *
96 (1000000 / (1024.0 * 1024.0)) * count /
97 (double) usec_diff(&start, &end));
103 gettimeofday(&start, 0);
104 for (k = 0; k < latcount; k++) {
106 for (i = 0; i < size; i++)
107 tmp += buf[random() & mask];
110 gettimeofday(&end, 0);
112 printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
113 ((double) (size * latcount )));
118 /* Write bandwidth */
120 gettimeofday(&start, 0);
121 for (k = 0; k < count; k++)
122 for (i = 0; i < size; i++)
124 gettimeofday(&end, 0);
126 printf("% 9.2f ", (double)(size * lsize) *
127 (1000000 / (1024.0 * 1024.0)) * count /
128 (double) usec_diff(&start, &end));
134 gettimeofday(&start, 0);
135 for (k = 0; k < latcount; k++)
136 for (i = 0; i < size; i++)
137 buf[random() % mask] = i;
138 gettimeofday(&end, 0);
140 printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
141 ((double) (size * latcount )));
146 count = count ? count : 1;
147 latcount = count / 10;
148 latcount = latcount ? latcount : 1;