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