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[8] = {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 += 8) {
101 gettimeofday(&end, 0);
103 printf("% 9.2f ", (double)(size * lsize) *
104 (1000000 / (1024.0 * 1024.0)) * count /
105 (double) usec_diff(&start, &end));
111 gettimeofday(&start, 0);
112 for (k = 0; k < latcount; k++) {
114 for (i = 0; i < size; i++)
115 tmp[0] += buf[random() & mask];
118 gettimeofday(&end, 0);
120 printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
121 ((double) (size * latcount )));
126 /* Write bandwidth */
128 gettimeofday(&start, 0);
129 for (k = 0; k < count; k++)
130 for (i = 0; i < size; i += 8) {
140 gettimeofday(&end, 0);
142 printf("% 9.2f ", (double)(size * lsize) *
143 (1000000 / (1024.0 * 1024.0)) * count /
144 (double) usec_diff(&start, &end));
150 gettimeofday(&start, 0);
151 for (k = 0; k < latcount; k++)
152 for (i = 0; i < size; i++)
153 buf[random() % mask] = i;
154 gettimeofday(&end, 0);
156 printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
157 ((double) (size * latcount )));
162 count = count ? count : 1;
163 latcount = count / 10;
164 latcount = latcount ? latcount : 1;