您的位置:首页 > 其它

rdtsc 指令测试 cpu 频率

2015-02-04 17:23 357 查看
#include <crtdefs.h>
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>

#ifdef  __cplusplus
extern "C" {
#endif
_CRTIMP void __cdecl _wassert(_In_z_ const wchar_t* _Message, _In_z_ const wchar_t* _File, _In_ unsigned _Line);
#ifdef  __cplusplus
}
#endif

#define ENFORCE(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression),_CRT_WIDE(__FILE__),__LINE__),0))

int main ( void )
{
unsigned __int64 timeStart64, cpu_fm64;
unsigned __int32 timeToRDTSC;

LARGE_INTEGER pfq, lpQFCount;
ENFORCE(QueryPerformanceFrequency(&pfq));

ENFORCE ( SetThreadAffinityMask ( GetCurrentThread(), 1 ) );

HANDLE CurProcessHandle = GetCurrentProcess();
HANDLE CurThreadHandle  = GetCurrentThread ();

DWORD OldPriClassFlags  = GetPriorityClass ( CurProcessHandle );
DWORD OldPriThreadFlags = GetThreadPriority( CurThreadHandle );

ENFORCE ( SetPriorityClass ( CurProcessHandle, REALTIME_PRIORITY_CLASS ) );
ENFORCE ( SetThreadPriority( CurThreadHandle,  THREAD_PRIORITY_HIGHEST ) );

__asm pxor xmm0, xmm0
__asm pxor xmm1, xmm1
__asm pxor xmm2, xmm2
__asm pxor xmm3, xmm3
__asm pxor xmm4, xmm4
__asm pxor xmm5, xmm5
__asm pxor xmm6, xmm6
__asm pxor xmm7, xmm7

__asm pxor mm0, mm0
__asm pxor mm1, mm1
__asm pxor mm2, mm2
__asm pxor mm3, mm3
__asm pxor mm4, mm4
__asm pxor mm5, mm5
__asm pxor mm6, mm6
__asm pxor mm7, mm7

__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax
__asm xor eax, eax

__asm
{
rdtsc
mov ebx, eax /* call rdtsc * 1 */
rdtsc
sub eax, ebx
mov timeToRDTSC, eax
}

QueryPerformanceCounter(&lpQFCount);

timeStart64 = lpQFCount.QuadPart;

__asm lea edi, cpu_fm64
__asm rdtsc
__asm mov dword ptr [ edi ], eax
__asm mov dword ptr [ edi + 4 ], edx

while ((lpQFCount.QuadPart - timeStart64) <= pfq.QuadPart )
{
QueryPerformanceCounter(&lpQFCount);
}
// trouble ... this asm code really write rubbish :(
__asm rdtsc
__asm mov ebx, dword ptr [ edi ]
__asm mov ecx, dword ptr [ edi + 4 ]
__asm mov dword ptr [ edi ], eax
__asm sub dword ptr [ edi ], ebx
__asm mov dword ptr [ edi + 4 ], edx
__asm sbb dword ptr [ edi + 4 ], ecx

cpu_fm64 -= timeToRDTSC;

ENFORCE ( timeToRDTSC < 800 );
ENFORCE ( SetPriorityClass ( CurProcessHandle, OldPriClassFlags ) );
ENFORCE ( SetThreadPriority( CurThreadHandle,  OldPriThreadFlags ) );

printf ( "%d", cpu_fm64 );

return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: