c - 使用 TSC(时间戳计数器)计算时间

标签 c linux performance linux-kernel multiprocessing

我正在尝试通过 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/

相关文章:

java - 防止请求在 JSON 文件更新时从 json 文件中获取数据

Linux 进程正在运行还是未运行?

linux - Ethernet.pm 模块在输出中抛出 DDD

c# - GDI+ 绘制矩形很慢

c - read() 函数不允许在换行符后打印任何内容

c - fatal error : bmpfile. h:没有这样的文件或目录

c++ - 忽略数据之前的 scanf 中的回车...以使用 conio.h 保持基于控制台的图形布局

java - 以某种模式在 Linux 中搜索 Java 文件

java - 第一次执行时缓慢的 Hibernate 查询

php - 如何存储大部分为空的数据?