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
13 #include <sys/ioctl.h>
20 #include "../libvo/fastmemcpy.h"
22 //#define ARR_SIZE 100000
23 #define ARR_SIZE (1024*768*2)
27 #include "../drivers/mga_vid.h"
29 static int mga_next_frame
=0;
31 static mga_vid_config_t mga_vid_config
;
32 static unsigned char* frame
=NULL
;
35 static int mga_init(){
38 f
= open("/dev/mga_vid",O_RDWR
);
41 fprintf(stderr
,"Couldn't open /dev/mga_vid\n");
45 mga_vid_config
.num_frames
=1;
46 mga_vid_config
.frame_size
=ARR_SIZE
;
47 mga_vid_config
.format
=MGA_VID_FORMAT_YUY2
;
49 mga_vid_config
.colkey_on
=0;
50 mga_vid_config
.src_width
= 640;
51 mga_vid_config
.src_height
= 480;
52 mga_vid_config
.dest_width
= 320;
53 mga_vid_config
.dest_height
= 200;
54 mga_vid_config
.x_org
= 0;
55 mga_vid_config
.y_org
= 0;
57 mga_vid_config
.version
=MGA_VID_VERSION
;
58 if (ioctl(f
,MGA_VID_CONFIG
,&mga_vid_config
))
60 perror("Error in mga_vid_config ioctl()");
61 printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
64 ioctl(f
,MGA_VID_ON
,0);
66 frame
= (char*)mmap(0,mga_vid_config
.frame_size
*mga_vid_config
.num_frames
,PROT_WRITE
,MAP_SHARED
,f
,0);
68 printf("Can't mmap mga frame\n");
73 //memset(frames[0],0x80,mga_vid_config.frame_size*mga_vid_config.num_frames);
81 // Returns current time in microseconds
82 unsigned int GetTimer(){
86 gettimeofday(&tv
,&tz
);
87 // s=tv.tv_usec;s*=0.000001;s+=tv.tv_sec;
88 return (tv
.tv_sec
*1000000+tv
.tv_usec
);
91 static inline unsigned long long int read_tsc( void )
93 unsigned long long int retval
;
94 __asm
__volatile ("rdtsc":"=A"(retval
)::"memory");
98 unsigned char __attribute__((aligned(4096)))arr1
[ARR_SIZE
],arr2
[ARR_SIZE
];
102 unsigned long long int v1
,v2
;
103 unsigned char * marr1
,*marr2
;
114 for(i
=0; i
<ARR_SIZE
-16; i
++) marr1
[i
] = marr2
[i
] = i
;
118 for(i
=0;i
<100;i
++) memcpy(marr1
,marr2
,ARR_SIZE
-16);
121 // ARR_SIZE*100/(1024*1024)/(t/1000000) = ARR_SIZE*95.36743/t
122 printf(NAME
": cpu clocks=%llu = %dus (%5.3ffps) %5.1fMB/s\n",v2
-v1
,t
,100000000.0f
/(float)t
,(float)ARR_SIZE
*95.36743f
/(float)t
);