]> git.itanic.dy.fi Git - membench/blobdiff - membench.c
Vectorize memory transfers
[membench] / membench.c
index aae48425eb812ce24cabe4d3b46dd0a57c282e46..6167b6cb639928bee8a42746997e4b9f35ff2c53 100644 (file)
@@ -15,24 +15,27 @@ long long usec_diff(const struct timeval *a, const struct timeval *b)
 int main(int argc, char *argv[])
 {
        int iterations, j, k, count, size, mask, latcount;
-       unsigned long *buf, i, tmp = 0;
+       unsigned long *buf, i, tmp[8] = {0};
        struct timeval start, end;
 
+       printf("Benchmark sequential access bandwidth "
+               "and random access latency\n\n");
+
        if (argc > 1)
                iterations = atoi(argv[1]);
        else
                iterations = 24;
 
        if (argc > 2)
-               count = atoi(argv[2]);
+               count = atoi(argv[2]) * 1024;
        else
-               count = 1024;
+               count = 1024 * 64;
        latcount = count / 10;
 
        printf("Doing %d runs with buffer size goin up to %dk\n",
               iterations, 1 << (iterations - 10));
        printf("Running each round %d times\n", count);
-       printf("Size of unsigned long is %lu bits\n\n", lsize * 8);
+       printf("Size of unsigned long is %d bits\n\n", (int)lsize * 8);
 
        switch (lsize) {
        case 4:
@@ -74,7 +77,7 @@ int main(int argc, char *argv[])
                for (i = 0; i < size; i++)
                        buf[i] = i;
 
-               printf("%8luk |", size * lsize / 1024);
+               printf("%8dk |", (int)(size * lsize / 1024));
 
                /* Read bandwidth*/
 
@@ -82,9 +85,17 @@ int main(int argc, char *argv[])
 
                gettimeofday(&start, 0);
                for (k = 0; k < count; k++) {
-                       buf[0] = tmp;
-                       for (i = 0; i < size; i++)
-                               tmp += buf[i];
+                       buf[0] = tmp[0];
+                       for (i = 0; i < size; i += 8) {
+                               tmp[0] += buf[i];
+                               tmp[1] += buf[i+1];
+                               tmp[2] += buf[i+2];
+                               tmp[3] += buf[i+3];
+                               tmp[4] += buf[i+4];
+                               tmp[5] += buf[i+5];
+                               tmp[6] += buf[i+6];
+                               tmp[7] += buf[i+7];
+                       }
                }
 
                gettimeofday(&end, 0);
@@ -99,9 +110,9 @@ int main(int argc, char *argv[])
 
                gettimeofday(&start, 0);
                for (k = 0; k < latcount; k++) {
-                       buf[0] = tmp;
+                       buf[0] = tmp[0];
                        for (i = 0; i < size; i++)
-                               tmp += buf[random() & mask];
+                               tmp[0] += buf[random() & mask];
                }
 
                gettimeofday(&end, 0);
@@ -116,8 +127,16 @@ int main(int argc, char *argv[])
 
                gettimeofday(&start, 0);
                for (k = 0; k < count; k++)
-                       for (i = 0; i < size; i++)
-                                buf[i] = i;
+                       for (i = 0; i < size; i += 8) {
+                               buf[i  ] = tmp[0];
+                               buf[i+1] = tmp[1];
+                               buf[i+2] = tmp[2];
+                               buf[i+3] = tmp[3];
+                               buf[i+4] = tmp[4];
+                               buf[i+5] = tmp[5];
+                               buf[i+6] = tmp[6];
+                               buf[i+7] = tmp[7];
+                       }
                gettimeofday(&end, 0);
 
                printf("% 9.2f  ", (double)(size * lsize) * 
@@ -139,6 +158,11 @@ int main(int argc, char *argv[])
        
                printf("\n");
 
+               count /= 2;
+               count = count ? count : 1;
+               latcount = count / 10;
+               latcount = latcount ? latcount : 1;
+
                free(buf);
        }
        return 0;