[MPlayer-dev-eng] [PATCH] revert CPU speed detection

D Richard Felker III dalias at aerifal.cx
Thu Oct 7 05:04:48 CEST 2004


On Thu, Oct 07, 2004 at 04:34:50AM +0200, Diego Biurrun wrote:
> Hi!
> 
> I've had a look at a way to make the CPU speed detection run only in
> verbose mode but then reconsidered.  Speed detection has never worked
> reliably and slows down startup noticeably.  Thus I propose the
> following patch that rips out CPU speed detection by reverting the
> commit from Atmos that added it:
> 
> http://mplayerhq.hu/pipermail/mplayer-cvslog/2003-September/016619.html
> 
> What do you think?

i'm against applying this patch as-is. it's just a reversed version of
the original patches. granted those seem to have had some cosmetics,
but reverting that now is just more cosmetics. also there's some
useful stuff, like the hasTSC flag, which shouldn't be reverted, and
it's especially bad to change this back in cpudetect.h which is
otherwise untouched by this patch.

i vote for just removing the speed detection code itself, and none of
the other reversals. that makes the new patch much cleaner and easy to
tell what it does (and clear that there are no bugs).

rich



> 
> Diego
> 
> 
> Index: cpudetect.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/cpudetect.c,v
> retrieving revision 1.31
> retrieving revision 1.29
> diff -u -r1.31 -r1.29
> --- cpudetect.c	28 Sep 2003 01:45:54 -0000	1.31
> +++ cpudetect.c	6 Sep 2003 12:06:59 -0000	1.29
> @@ -13,7 +13,6 @@
>  
>  #include <stdio.h>
>  #include <string.h>
> -#include "osdep/timer.h"
>  
>  #ifdef __NetBSD__
>  #include <sys/param.h>
> @@ -120,28 +119,26 @@
>  
>  		do_cpuid(0x00000001, regs2);
>  
> +		tmpstr=GetCpuFriendlyName(regs, regs2);
> +		mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
> +		free(tmpstr);
> +
>  		caps->cpuType=(regs2[0] >> 8)&0xf;
>  		if(caps->cpuType==0xf){
>  		    // use extended family (P4, IA64)
>  		    caps->cpuType=8+((regs2[0]>>20)&255);
>  		}
>  		caps->cpuStepping=regs2[0] & 0xf;
> +		mp_msg(MSGT_CPUDETECT,MSGL_INFO,"(Family: %d, Stepping: %d)\n",
> +		    caps->cpuType, caps->cpuStepping);
>  
>  		// general feature flags:
> -		caps->hasTSC  = (regs2[3] & (1 << 8  )) >>  8; // 0x0000010
>  		caps->hasMMX  = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
>  		caps->hasSSE  = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
>  		caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
>  		caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
>  		cl_size = ((regs2[1] >> 8) & 0xFF)*8;
>  		if(cl_size) caps->cl_size = cl_size;
> -
> -		tmpstr=GetCpuFriendlyName(regs, regs2);
> -		mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
> -		free(tmpstr);
> -		mp_msg(MSGT_CPUDETECT,MSGL_INFO,"(Family: %d, Stepping: %d)\n",
> -		    caps->cpuType, caps->cpuStepping);
> -
>  	}
>  	do_cpuid(0x80000000, regs);
>  	if (regs[0]>=0x80000001) {
> @@ -210,29 +207,6 @@
>  }
>  
>  
> -static inline unsigned long long int rdtsc( void )
> -{
> -  unsigned long long int retval;
> -  __asm __volatile ("rdtsc":"=A"(retval)::"memory");
> -  return retval;
> -}
> -
> -/* Returns CPU clock in khz */
> -static unsigned int GetCpuSpeed(void)
> -{
> -	unsigned long long int tscstart, tscstop;
> -	unsigned int start, stop;
> -
> -	tscstart = rdtsc();
> -	start = GetTimer();
> -	usec_sleep(50000);
> -	stop = GetTimer();
> -	tscstop = rdtsc();
> -
> -	return((tscstop-tscstart)/((stop-start)/1000.0));
> -}
> -
> -
>  #define CPUID_EXTFAMILY	((regs2[0] >> 20)&0xFF) /* 27..20 */
>  #define CPUID_EXTMODEL	((regs2[0] >> 16)&0x0F) /* 19..16 */
>  #define CPUID_TYPE		((regs2[0] >> 12)&0x04) /* 13..12 */
> @@ -242,37 +216,23 @@
>  
>  char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
>  #include "cputable.h" /* get cpuname and cpuvendors */
> -	char vendor[17], cpuspeed[16];
> +	char vendor[17];
>  	char *retname;
> -	int i=0;
> +	int i;
>  
>  	if (NULL==(retname=(char*)malloc(256))) {
>  		mp_msg(MSGT_CPUDETECT,MSGL_FATAL,"Error: GetCpuFriendlyName() not enough memory\n");
>  		exit(1);
>  	}
>  
> -	/* Measure CPU speed */
> -	if (gCpuCaps.hasTSC && (i = GetCpuSpeed()) > 0) {
> -		if (i < 1000000) {
> -			i += 50; /* for rounding */
> -			snprintf(cpuspeed,15, " %d.%d MHz", i/1000, (i/100)%10);
> -		} else {
> -			//i += 500; /* for rounding */
> -			snprintf(cpuspeed,15, " %d MHz", i/1000);
> -		}
> -	} else { /* No TSC Support */
> -		cpuspeed[0]='\0';
> -	}
> -	
> -
>  	sprintf(vendor,"%.4s%.4s%.4s",(char*)(regs+1),(char*)(regs+3),(char*)(regs+2));
>  
>  	for(i=0; i<MAX_VENDORS; i++){
>  		if(!strcmp(cpuvendors[i].string,vendor)){
>  			if(cpuname[i][CPUID_FAMILY][CPUID_MODEL]){
> -				snprintf(retname,255,"%s %s%s",cpuvendors[i].name,cpuname[i][CPUID_FAMILY][CPUID_MODEL],cpuspeed);
> +				snprintf(retname,255,"%s %s",cpuvendors[i].name,cpuname[i][CPUID_FAMILY][CPUID_MODEL]);
>  			} else {
> -				snprintf(retname,255,"unknown %s %d. Generation CPU%s",cpuvendors[i].name,CPUID_FAMILY,cpuspeed); 
> +				snprintf(retname,255,"unknown %s %d. Generation CPU",cpuvendors[i].name,CPUID_FAMILY); 
>  				mp_msg(MSGT_CPUDETECT,MSGL_WARN,"unknown %s CPU:\n",cpuvendors[i].name);
>  				mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Vendor:   %s\n",cpuvendors[i].string);
>  				mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Type:     %d\n",CPUID_TYPE);
> Index: cpudetect.h
> ===================================================================
> RCS file: /cvsroot/mplayer/main/cpudetect.h,v
> retrieving revision 1.10
> retrieving revision 1.9
> diff -u -r1.10 -r1.9
> --- cpudetect.h	19 Sep 2003 23:52:41 -0000	1.10
> +++ cpudetect.h	18 Jan 2003 19:29:45 -0000	1.9
> @@ -18,7 +18,6 @@
>  	int isX86;
>  	unsigned cl_size; /* size of cache line */
>          int hasAltiVec;
> -	int hasTSC;
>  } CpuCaps;
>  
>  extern CpuCaps gCpuCaps;
> 
> _______________________________________________
> MPlayer-dev-eng mailing list
> MPlayer-dev-eng at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng




More information about the MPlayer-dev-eng mailing list