我正在使用C++中的
以下是代码:
在未设置处理器亲和力的情况下运行时, 当像
为什么会这样呢?
rdtsc
计时多个NOP指令和一个单独的NOP指令。然而,我执行NOP指令的数量增加时,并没有在相应的周期数上看到增加。我不知道这是为什么。我的CPU型号是Intel Core i7-5600U @ 2.60Ghz。以下是代码:
#include <stdio.h>
int main() {
unsigned long long t;
t = __rdtsc();
asm volatile("nop");
t = __rdtsc() - t;
printf("rdtsc for one NOP: %llu\n", t);
t = __rdtsc();
asm volatile("nop; nop; nop; nop; nop; nop; nop;");
t = __rdtsc() - t;
printf("rdtsc for seven NOPs: %llu\n", t);
}
我得到的数值为:
rdtsc for one NOP: 78
rdtsc for seven NOPs: 91
rdtsc for one NOP: 78
rdtsc for seven NOPs: 78
在未设置处理器亲和力的情况下运行时, 当像
$ taskset -c 0 ./nop$
这样设置处理器亲和力时,结果为:rdtsc for one NOP: 78
rdtsc for seven NOPs: 78
rdtsc for one NOP: 130
rdtsc for seven NOPs: 169
rdtsc for one NOP: 78
rdtsc for seven NOPs: 143
为什么会这样呢?
nanosleep
函数,即使将睡眠间隔设置为仅一个纳秒,执行nanosleep
函数所需时间也会超过20000个周期(根据rdtsc
)。这就是为什么我要试图直接使用nops来引发非常微小的延迟。 - fraiserpause
指令。在 Skylake 及之后的处理器上,它会空闲约100个周期;在早期的 Intel 处理器上,它会空闲约5个周期。或者可以使用 RDTSC 自旋。在现代超标量/乱序 x86 处理器上,插入 NOPs 指令永远不会可靠地工作,因为这些处理器具有巨大的重排序缓冲区!你的“休眠”时间甚至可能不足以清空乱序执行缓冲区(ROB)。指令没有一个你可以简单相加的成本。如何预测现代超标量处理器上操作的延迟,并如何手动计算? - Peter Cordes