我正在尝试通过 Linux 内核模块以非常高的精度测量 Linux 内核中某些代码所花费的时间。
为此,我尝试了 rdtscl(),它给出了代码中使用的时钟滴答数,如下所示:
unsigned long ini, end;
rdtscl(ini);
//some code...
rdtscl(end);
printk("time taken=%lu ticks",end-ini);
正如我所提到的 http://en.wikipedia.org/wiki/Time_Stamp_Counter其中表示 TSC 是自 Pentium 以来所有 x86 处理器上都存在的 64 位寄存器。那么,如果我有双核处理器,这个计数器会出现在两个内核中还是只有一个,因为它只有一个处理器但双核?
第二个问题是:我有 Intel Xeon i3 处理器,它有 4 个处理器,每个处理器有 2 个内核。然后,测量时钟滴答声,将给出单个处理器的滴答声或所有 4 个处理器的添加?
最佳答案
如果您没有得到任何时钟滴答声,那么您的代码就存在严重错误。您是否编写了自己的 rdtscl
[或从来源不佳的地方复制它?]
顺便说一句,现代英特尔(和 AMD)处理器很可能具有“恒定 TSC”,因此停止、休眠、运行速度较慢等的处理器仍将以与其他处理器相同的速率滴答作响 - 它可能仍然不同步,但那是另一回事。
尝试只运行一个循环来打印计数器的值 - 仅 RDTSC 指令本身就需要大约 30-50 个时钟周期,因此您应该会看到它在移动。
编辑:这是我的 rdtsc 函数:
void rdtscl(unsigned long long *ll)
{
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
*ll = ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
alernatitvely,作为一个返回值的函数:
unsigned long long rdtscl(void)
{
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
我注意到你的代码没有传递你的 unsigned long 的指针,这让我怀疑你实际上并没有将时间戳计数器传递回调用者,而是只是保留它恰好具有的任何值 - 这可能两个值都相同。
关于c - 使用 TSC(时间戳计数器)计算时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14017894/