我试图通过一个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是自奔腾以来所有x86处理器上都存在的64位寄存器。所以,如果我有双核处理器,这个计数器会出现在两个内核中,还是只有一个,因为它只有一个处理器,但双核?
第二个问题是:我有英特尔至强i3处理器,它有4个处理器,每个处理器有2个内核。然后,测量时钟节拍,会给出单处理器的节拍还是全部4个处理器的节拍相加?
最佳答案:
如果你没有时钟信号,那么你的代码就有严重的问题。你是自己写的还是从不好的地方复制的?]
顺便说一句,现代英特尔(和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 );
}
作为返回值的函数:
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 );
}
我注意到您的代码没有传递无符号long的指针,这使我怀疑您实际上并没有将时间戳计数器传递回调用者,而是只保留它碰巧具有的任何值—这两个值很可能相同。