linux 时间戳计数器,使用TSC(时间戳计数器)计算时间

我试图通过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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值