使用rdtscp指令测量延迟时,如何获得0个时钟滴答?

时间:2018-10-19 12:39:34

标签: x86 performance-testing inline-assembly low-latency rdtsc

我想测量一小段代码的延迟。因此,我在代码前后添加了rdtscp指令。问题是,我使用它测得的延迟为0。

static inline __attribute__((always_inline)) uint64_t rdtscp()
{
      uint64_t cycles_high, cycles_low;
      asm volatile
        ("rdtscp\n\t"
         "mov %%rdx, %0\n\t"
         "mov %%rax, %1\n\t"
         : "=r" (cycles_high), "=r" (cycles_low) :: "%rax", "%rbx", "%rcx", "%rdx");          

      return (cycles_high << 32) + cycles_low;
}

该进程固定在一个特定的内核上,因此不同CPU的tsc寄存器不同步不会成为问题。我知道我没有使用像cpuid这样的序列化指令,因此rdtscp指令可以在乱序的CPU中重新排列。但是,这些仍然应该是两个不同的指令。据我所知,tsc寄存器在每个时钟周期都会更新。因此,两条指令读取的值不能相同!

为此,我想到的唯一可能的原因是超线程CPU恰好在同一时间发布了两条指令。这是对的吗?

0 个答案:

没有答案