【问题标题】:rdtsc() giving strange results [duplicate]rdtsc() 给出奇怪的结果
【发布时间】:2013-08-20 18:01:12
【问题描述】:

我写了一个非常简单的C程序,试图理解C(Linux)中的rdtsc。程序如下。

#include <stdio.h>

static inline unsigned long long tick()
{
        unsigned long long d;
        __asm__ __volatile__ ("rdtsc" : "=A" (d) );
        return d;
}

int main()
{
        long long res;
        int a = 1;
        int b = 3;
        int c = 0;
        res=tick();
        c = (a + b)*11000;
        res=tick()-res;
        printf("%lld\n",res);
        return 0;
}

我的处理器配置如下。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 30
Stepping:              5
CPU MHz:               1197.000
BogoMIPS:              5862.24
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

从输出来看,处理器似乎是 1.2GHz,在我看来这意味着每秒会有 1200 x 10^6 滴答声。

当我在我的机器上运行上述程序时,它的输出始终是 88。令人惊讶的是,即使我删除了 'c = (a + b)*11000;'在两个刻度之间,输出仍然是 88。

1) 为什么输出没有增加。(根据执行上述语句所用的周期,它应该显示稍高。)

2) 除了 CPU MHz 之外,上面 cpuinfo 中列出的任何其他参数是否会影响这一点。

【问题讨论】:

  • 我猜你的优化编译器不会为表达式c = (a + b)*11000; 发出代码,因为它可以看到结果没有在任何地方使用。你看过你的编译器生成的程序集吗?
  • 尝试将 a、b 和 c 声明为 volatile
  • "=A" (d) 只是在 x86-64 上选择 RAX,而不是 edx:eax,因为单个寄存器可以保存整个值。

标签: c linux optimization rdtsc


【解决方案1】:

在 X86_64 上使用 rdtsc 时有一个错误。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21249

tick() 必须更正如下:

static inline unsigned long long tick()
{

    unsigned long low, high;
    __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
    return ((unsigned long long)high << 32) | low);


}

【讨论】:

  • 这不是 gcc 中的错误,该错误使用"=A" 并假设它会选择edx:eax。它实际上选择了rax
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多