Mercurial > mplayer.hg
annotate TOOLS/fastmemcpybench.c @ 28869:04a232eb5f0d
comment/output cosmetics
author | diego |
---|---|
date | Mon, 09 Mar 2009 11:32:43 +0000 |
parents | a10ddae3de31 |
children | 5643b5e6bee0 |
rev | line source |
---|---|
562
312fee2a6816
Initial release, used to benchmark fastmemcpy.h code from libvo.
atmosfear
parents:
diff
changeset
|
1 /* |
28869 | 2 * benchmark tool for fast_memcpy code from libvo |
3 * | |
4 * NOTE: This code can not be used on Pentium MMX / II 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 it seems the bug was fixed but this | |
7 * was not confirmed through testing. | |
562
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) { | |
28869 | 37 fprintf(stderr, "Couldn't open /dev/mga_vid.\n"); |
28868 | 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) { | |
28869 | 64 printf("Can't mmap MGA frame.\n"); |
28868 | 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 | |
28869 | 120 printf(NAME ": CPU clocks=%llu = %dus (%5.3ffps) %5.1fMB/s\n", v2-v1, t, |
28868 | 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 } |