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; }
相关文章推荐
- 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options
- QueryPerformanceFrequency,RDTSC,CPU频率
- 关于安卓智能手机CPU频率与续航时间的测试
- 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options
- 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间
- 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间
- 通过uboot降cpu,DDR频率测试
- QueryPerformanceFrequency,RDTSC,CPU频率
- QueryPerformanceFrequency,RDTSC,CPU频率
- 测试CPU品牌和当前工作频率
- 测试CPU品牌和当前工作频率
- 自己动手写CPU之第五阶段(5)——测试逻辑、移位与空指令的实现
- 多核时代不宜再用x86的RDTSC指令测试指令周期和时间
- 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间
- 安装VC,NTVDM CPU 遇到无效指令 --绝对能用的解决方法
- 【CPU + GPU版】Ubuntu16.04 + caffe + Anaconda2 + OpenCV3.x(附:问题集锦+测试案例)
- 压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate
- CPU vector operations(CPU vector指令 )
- Linux系统下CPU频率的调整
- cpu启动之后执行的第一条指令