whitespace cosmetics:
[mplayer/glamo.git] / TOOLS / fastmemcpybench.c
blob66bb1671c53c2af3a7fcf68aa80ea5cc91a4966f
1 /*
2 fastmemcpybench.c used to benchmark fastmemcpy.h code from libvo.
4 Note: this code can not be used on PentMMX-PII because they contain
5 a bug in rdtsc. For Intel processors since P6(PII) rdpmc should be used
6 instead. For PIII it's disputable and seems bug was fixed but I don't
7 tested it.
8 */
10 /* According to Uoti this code is broken. */
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <sys/ioctl.h>
16 #include <unistd.h>
17 #include <fcntl.h>
18 #include <sys/mman.h>
19 #include <sys/time.h>
20 #include <inttypes.h>
22 //#define ARR_SIZE 100000
23 #define ARR_SIZE (1024*768*2)
25 #ifdef CONFIG_MGA
27 #include "drivers/mga_vid.h"
29 static mga_vid_config_t mga_vid_config;
30 static unsigned char* frame = NULL;
31 static int f;
33 static int mga_init(void)
35 f = open("/dev/mga_vid", O_RDWR);
36 if (f == -1) {
37 fprintf(stderr, "Couldn't open /dev/mga_vid\n");
38 return -1;
41 mga_vid_config.num_frames = 1;
42 mga_vid_config.frame_size = ARR_SIZE;
43 mga_vid_config.format = MGA_VID_FORMAT_YUY2;
45 mga_vid_config.colkey_on = 0;
46 mga_vid_config.src_width = 640;
47 mga_vid_config.src_height = 480;
48 mga_vid_config.dest_width = 320;
49 mga_vid_config.dest_height = 200;
50 mga_vid_config.x_org = 0;
51 mga_vid_config.y_org = 0;
53 mga_vid_config.version = MGA_VID_VERSION;
54 if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config)) {
55 perror("Error in mga_vid_config ioctl()");
56 printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
57 exit(1);
59 ioctl(f, MGA_VID_ON, 0);
61 frame = (char*)mmap(0, mga_vid_config.frame_size*mga_vid_config.num_frames,
62 PROT_WRITE,MAP_SHARED, f, 0);
63 if (!frame) {
64 printf("Can't mmap mga frame\n");
65 exit(1);
68 //clear the buffer
69 //memset(frames[0], 0x80, mga_vid_config.frame_size*mga_vid_config.num_frames);
71 return 0;
74 #endif
76 // Returns current time in microseconds
77 static unsigned int GetTimer(void)
79 struct timeval tv;
80 struct timezone tz;
81 //float s;
82 gettimeofday(&tv, &tz);
83 //s = tv.tv_usec; s *= 0.000001; s += tv.tv_sec;
84 return tv.tv_sec * 1000000 + tv.tv_usec;
87 static inline unsigned long long int read_tsc(void)
89 unsigned long long int retval;
90 __asm__ volatile ("rdtsc":"=A" (retval)::"memory");
91 return retval;
94 unsigned char __attribute__((aligned(4096)))arr1[ARR_SIZE], arr2[ARR_SIZE];
96 int main(void)
98 unsigned long long int v1, v2;
99 unsigned char *marr1, *marr2;
100 int i;
101 unsigned int t;
102 #ifdef CONFIG_MGA
103 mga_init();
104 marr1 = &frame[3];
105 #else
106 marr1 = &arr1[0];
107 #endif
108 marr2 = &arr2[0];
110 for (i = 0; i < ARR_SIZE - 16; i++)
111 marr1[i] = marr2[i] = i;
113 t = GetTimer();
114 v1 = read_tsc();
115 for (i = 0; i < 100; i++)
116 memcpy(marr1, marr2, ARR_SIZE - 16);
117 v2 = read_tsc();
118 t = GetTimer() - t;
119 // ARR_SIZE*100 / (1024*1024) / (t/1000000) = ARR_SIZE*95.36743 / t
120 printf(NAME ": cpu clocks=%llu = %dus (%5.3ffps) %5.1fMB/s\n", v2-v1, t,
121 100000000.0f/(float)t, (float)ARR_SIZE*95.36743f/(float)t);
122 return 0;