Mercurial > mplayer.hg
annotate TOOLS/fastmemcpybench.c @ 28868:a10ddae3de31
whitespace cosmetics:
- Remove all tabs and trailing whitespace.
- Indent with 4 spaces.
- K&R-ify and prettyprint some parts.
author | diego |
---|---|
date | Mon, 09 Mar 2009 11:28:31 +0000 |
parents | 07c168210a73 |
children | 04a232eb5f0d |
rev | line source |
---|---|
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
1 /* |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
2 fastmemcpybench.c used to benchmark fastmemcpy.h code from libvo. |
28868 | 3 |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
4 Note: this code can not be used on PentMMX-PII because they contain |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
5 a bug in rdtsc. For Intel processors since P6(PII) rdpmc should be used |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
6 instead. For PIII it's disputable and seems bug was fixed but I don't |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
7 tested it. |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
8 */ |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
9 |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
10 /* According to Uoti this code is broken. */ |
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
11 |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
12 #include <stdio.h> |
572 | 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> | |
13839 | 20 #include <inttypes.h> |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
21 |
572 | 22 //#define ARR_SIZE 100000 |
23 #define ARR_SIZE (1024*768*2) | |
24 | |
27365
13c920fdf7f5
Change a bunch of video-output-specific preprocessor directives from a HAVE_
diego
parents:
26759
diff
changeset
|
25 #ifdef CONFIG_MGA |
572 | 26 |
17017 | 27 #include "drivers/mga_vid.h" |
572 | 28 |
29 static mga_vid_config_t mga_vid_config; | |
28868 | 30 static unsigned char* frame = NULL; |
572 | 31 static int f; |
32 | |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
33 static int mga_init(void) |
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
34 { |
28868 | 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; | |
39 } | |
572 | 40 |
28868 | 41 mga_vid_config.num_frames = 1; |
42 mga_vid_config.frame_size = ARR_SIZE; | |
43 mga_vid_config.format = MGA_VID_FORMAT_YUY2; | |
44 | |
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; | |
572 | 52 |
28868 | 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); | |
58 } | |
59 ioctl(f, MGA_VID_ON, 0); | |
572 | 60 |
28868 | 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); | |
66 } | |
572 | 67 |
28868 | 68 //clear the buffer |
69 //memset(frames[0], 0x80, mga_vid_config.frame_size*mga_vid_config.num_frames); | |
572 | 70 |
28868 | 71 return 0; |
572 | 72 } |
73 | |
74 #endif | |
75 | |
76 // Returns current time in microseconds | |
28232
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
77 static unsigned int GetTimer(void) |
8df85ad26746
Add missing 'void' keyword to parameterless function declarations.
diego
parents:
27757
diff
changeset
|
78 { |
28868 | 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; | |
85 } | |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
86 |
28868 | 87 static inline unsigned long long int read_tsc(void) |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
88 { |
28868 | 89 unsigned long long int retval; |
90 __asm__ volatile ("rdtsc":"=A" (retval)::"memory"); | |
91 return retval; | |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
92 } |
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
93 |
28868 | 94 unsigned char __attribute__((aligned(4096)))arr1[ARR_SIZE], arr2[ARR_SIZE]; |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
95 |
28868 | 96 int main(void) |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
97 { |
28868 | 98 unsigned long long int v1, v2; |
99 unsigned char *marr1, *marr2; | |
100 int i; | |
101 unsigned int t; | |
27365
13c920fdf7f5
Change a bunch of video-output-specific preprocessor directives from a HAVE_
diego
parents:
26759
diff
changeset
|
102 #ifdef CONFIG_MGA |
28868 | 103 mga_init(); |
104 marr1 = &frame[3]; | |
572 | 105 #else |
28868 | 106 marr1 = &arr1[0]; |
572 | 107 #endif |
28868 | 108 marr2 = &arr2[0]; |
3076
bfc881c0e591
newly allocated memory seems to point to only 1 zero filled 4k page or something so there is a near 100% cache hit rate ... not very realistic, writeing something in the source array fixes that so the benchmark scores are meaningfull now
michael
parents:
687
diff
changeset
|
109 |
28868 | 110 for (i = 0; i < ARR_SIZE - 16; i++) |
111 marr1[i] = marr2[i] = i; | |
3076
bfc881c0e591
newly allocated memory seems to point to only 1 zero filled 4k page or something so there is a near 100% cache hit rate ... not very realistic, writeing something in the source array fixes that so the benchmark scores are meaningfull now
michael
parents:
687
diff
changeset
|
112 |
28868 | 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; | |
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
123 } |