]> git.itanic.dy.fi Git - membench/blob - membench.c
4aaa8b9745656e2726839a86b984cb6387969b7b
[membench] / membench.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4
5 #define lsize sizeof(unsigned long)
6
7 long long usec_diff(const struct timeval *a, const struct timeval *b)
8 {
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;
13 }
14
15 int main(int argc, char *argv[])
16 {
17         int iterations, j, k, count, size, mask, latcount;
18         unsigned long *buf, i, tmp = 0;
19         struct timeval start, end;
20
21         printf("Benchmark sequential access bandwidth "
22                 "and random access latency\n\n");
23
24         if (argc > 1)
25                 iterations = atoi(argv[1]);
26         else
27                 iterations = 24;
28
29         if (argc > 2)
30                 count = atoi(argv[2]);
31         else
32                 count = 1024;
33         latcount = count / 10;
34
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);
39
40         switch (lsize) {
41         case 4:
42                 j = 12;
43                 break;
44         case 8:
45                 j = 10;
46                 break;
47         default:
48                 printf("WTF?\n");
49                 exit(1);
50         }
51
52         printf("          |"
53                "         Read         |"
54                "         Write        |\n"
55                "          |"
56                "-----------------------"
57                "-----------------------\n"
58                "    Size  |"
59                "    MiB/s         ns  |"
60                "    MiB/s         ns  |\n"
61                "----------|"
62                "-----------------------"
63                "-----------------------\n"
64                 );
65
66         for (; j < iterations + 1; j++) {
67                 size = (1 << j) / lsize;
68                 buf = malloc(size * lsize);
69                 mask = size - 1;
70
71                 if (buf == NULL) {
72                         printf("Malloc failed\n");
73                         exit(1);
74                 }
75
76                 /* Touch the pages */
77                 for (i = 0; i < size; i++)
78                         buf[i] = i;
79
80                 printf("%8dk |", (int)(size * lsize / 1024));
81
82                 /* Read bandwidth*/
83
84                 fflush(stdout);
85
86                 gettimeofday(&start, 0);
87                 for (k = 0; k < count; k++) {
88                         buf[0] = tmp;
89                         for (i = 0; i < size; i++)
90                                 tmp += buf[i];
91                 }
92
93                 gettimeofday(&end, 0);
94
95                 printf("% 9.2f  ", (double)(size * lsize) * 
96                        (1000000 / (1024.0 * 1024.0)) * count / 
97                        (double) usec_diff(&start, &end));
98
99                 fflush(stdout);
100
101                 /* Read latency */
102
103                 gettimeofday(&start, 0);
104                 for (k = 0; k < latcount; k++) {
105                         buf[0] = tmp;
106                         for (i = 0; i < size; i++)
107                                 tmp += buf[random() & mask];
108                 }
109
110                 gettimeofday(&end, 0);
111
112                 printf("% 9.3f  |", usec_diff(&start, &end) * 1000 / 
113                        ((double) (size * latcount )));
114
115
116                 fflush(stdout);
117
118                 /* Write bandwidth */
119
120                 gettimeofday(&start, 0);
121                 for (k = 0; k < count; k++)
122                         for (i = 0; i < size; i++)
123                                  buf[i] = i;
124                 gettimeofday(&end, 0);
125
126                 printf("% 9.2f  ", (double)(size * lsize) * 
127                        (1000000 / (1024.0 * 1024.0)) * count / 
128                        (double) usec_diff(&start, &end));
129         
130                 fflush(stdout);
131
132                 /* Write latency */
133
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);
139
140                 printf("% 9.3f  |", usec_diff(&start, &end) * 1000 / 
141                        ((double) (size * latcount )));
142         
143                 printf("\n");
144
145                 free(buf);
146         }
147         return 0;
148 }