variuos old test code
[pandora-misc.git] / tests / memspeed.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <string.h>
5 #include <malloc.h>
6 #include <sys/time.h>
7
8 extern void *memcpy_neon(void *dst, const void *src, size_t size);
9
10 #define BUFSIZE (8*1024*1024)
11 #define ITER 128
12
13 static unsigned
14 tv_diff(struct timeval *tv1, struct timeval *tv2)
15 {
16     return (tv2->tv_sec - tv1->tv_sec) * 1000000 +
17         (tv2->tv_usec - tv1->tv_usec);
18 }
19
20 static void do_test(const char *name, void *p1, void *p2, size_t size,
21                     void *(*cpy)(void *, const void *, size_t))
22 {
23     struct timeval t1, t2;
24     int i;
25
26     gettimeofday(&t1, NULL);
27     for (i = 0; i < ITER; i++)
28         cpy(p1, p2, size);
29     gettimeofday(&t2, NULL);
30
31     printf("%-8s %llu B/s\n", name,
32            (uint64_t)size * ITER * 1000000 / tv_diff(&t1, &t2));
33 }
34
35 static void *int32_cpy(void *dst, const void *src, size_t size)
36 {
37     const uint32_t *s = src;
38     uint32_t *d = dst;
39     int i;
40
41     size /= 4;
42
43     for (i = 0; i < size; i++)
44         d[i] = s[i];
45
46     return dst;
47 }
48
49 static void *vec_cpy(void *dst, const void *src, size_t size)
50 {
51     typedef int v4si __attribute__ ((vector_size(16)));
52     const v4si *s = src;
53     v4si *d = dst;
54
55     size /= 16;
56
57     while (size--)
58         *d++ = *s++;
59
60     return dst;
61 }
62
63 int main(int argc, char **argv)
64 {
65     void *buf1, *buf2;
66
67     buf1 = memalign(64, BUFSIZE);
68     buf2 = memalign(64, BUFSIZE);
69
70     memset(buf2, 0, BUFSIZE);
71
72     do_test("memcpy",   buf1, buf2, BUFSIZE, memcpy);
73     do_test("INT32",    buf1, buf2, BUFSIZE, int32_cpy);
74     do_test("C SIMD",   buf1, buf2, BUFSIZE, vec_cpy);
75     do_test("ASM SIMD", buf1, buf2, BUFSIZE, memcpy_neon);
76
77     free(buf1);
78     free(buf2);
79
80     return 0;
81 }