我想测量一小段代码的延迟。因此,我在代码前后添加了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恰好在同一时间发布了两条指令。这是对的吗?