我试图通过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位寄存器.那么,如果我有双核处理器,这个计数器是否会出现在两个核心中,或者只有一个,因为它只有一个处理器而是双核心?
第二个问题是:我有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的指针,这让我怀疑你实际上没有将时间戳计数器BACK传递给调用者,而只是保持它碰巧有的任何值 – 这可能是两个值都相同.
标签:c-3,performance,linux,linux-kernel,multiprocessing
来源: https://codeday.me/bug/20191008/1874407.html