Seltsam



  • Hallo Leute

    Ich hab da mal ein relativ seltsames Problem. Ich schätze, daß die clock() unter Linux irgendwie nicht stimmt, sonst kann ich mir das nicht wirklich erklähren.

    Die definition der Struktur:

    #ifdef WIN32
    #	include <windows.h>
    #else
    	//! Structure to hold our timing stuff for all non win32 systems
    	typedef union _LARGE_INTEGER {
    	struct {
    		unsigned long   LowPart  ;
    		signed   long   HighPart ;
    	};
    	unsigned long long QuadPart;
    	} LARGE_INTEGER;
    #endif
    

    Der Code, der die Ticks ermittelt:

    #ifdef  __GNUC__
    			GetRDTSC( startTCK.HighPart, startTCK.LowPart );
    #else
    			__asm {
    				rdtsc
    				mov startTCK.HighPart, edx
    				mov startTCK.LowPart, eax
    			}
    #endif
    			start = clock();
    
    			do { } while( CLOCKS_PER_SEC > ( clock() - start ) );
    
    #ifdef __GNUC__
    			GetRDTSC( stopTCK.HighPart, stopTCK.LowPart );
    #else
    			__asm {
    				rdtsc
    				mov stopTCK.HighPart, edx
    				mov stopTCK.LowPart, eax
    			}
    #endif
    
    			end = clock();
    
    			_freq.QuadPart = ( stopTCK.QuadPart - startTCK.QuadPart ) * CLOCKS_PER_SEC / ( end - start );
    

    Unter Windows bekomme ich somit die passende Tacktrate - also 1666 Mhz.
    Unter Linux mit der externen ASM funktion bekomme ich 1950Mhz.

    Die ASM func schaut so aus:

    GetRDTSC
    	push ebp		; Store stack ptr
    	mov ebp, esp		; Into base ptr
    
    	push ebx		; Store registers
    	push ecx		;
    	push edx
    
    	mov ebx, [ebp + 8]	; Store addresses
    	mov ecx, [ebp + 12]	;
    
    	RDTSC
    
    	mov DWORD [ebx], edx	; Store
    	mov DWORD [ecx], eax	;
    
    	pop edx			; Restore registers
    	pop ecx			;
    	pop ebx			;
    
    	leave			;
    	ret			; Return
    

    Hat dafür jemand eine Erklährung? Ist ein Bug in meinem ASM code?

    Danke schon mal
    Sven



  • P.S. auf einem P4 2k mit Debian ist der Output ok.
    nur auf meinem Athlon XP 2k mit Gentoo nicht.

    Beide 2.4.21 Kernel


Anmelden zum Antworten