TSC

wiki上的说明:http://en.wikipedia.org/wiki/Time_Stamp_Counter

intel 有的CPU tsc的变化是固定的(不会随 cpu节电的影响)。 

判断CPU是否支持常量TSC,可以使用 “cat /proc/cpuinfo | grep constant_tsc“, 有输出就表示支持。

 

下面是tsc的读取代码,  cpuid是为了解决CPU乱序执行的问题。

GNU C++

#include <stdint.h>
extern "C" {
__inline__ uint64_t rdtsc() {
uint32_t lo, hi;
__asm__ __volatile__ (      // serialize
"xorl %%eax,%%eax \n        cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx");
/* We cannot use "=A", since this would use %rax on x86_64 */
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}
}
POSIX 调用 clock_gettime

Microsoft Visual C++

__declspec(naked)
unsigned __int64 __cdecl rdtsc(void)
{
__asm
{
rdtsc
ret       ; return value at EDX:EAX
}
}
Windows API QueryPerformanceCounter, QueryPerformanceFrequency
 
 
posted @ 2010-12-31 10:02  napoleon_liu  阅读(546)  评论(2编辑  收藏  举报