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