【发布时间】:2021-11-20 03:28:31
【问题描述】:
我试图在我的 rdtsc 函数之前调用 cpuid 以防止出现故障。我最初使用这个 rdtsc 函数来获取 2 个时间戳,并且经常得到负数,这是不可取的。这是rdtsc函数,我应该如何实现cpuid?还是叫 int main 函数?
inline uint64_t rdtsc() {
unsigned long a, d;
asm volatile ("rdtsc":"=a" (a), "=d" (d));
return a | ((uint16_t)d << 32);
}
【问题讨论】:
-
this question 中的一些信息。还有许多其他人处理这个问题。
-
通常您希望
lfence作为 OoO exec 的障碍,而不是慢速 CPUID。另请参阅 How to get the CPU cycle count in x86_64 from C++? 以了解运行rdtsc的工作代码,它避免将高 32 位截断为 16 位。 -
另见What's up with the "half fence" behavior of rdtscp?(以及页面顶部链接的重复项列表。其中一些显示
_mm_lfence(),或将lfence; rdtsc放入一个asm 模板中。) -
非常感谢。与使用 cpuid 相比,我们能否将 lfence/mfence 描述为一种更集中的序列化指令方式?我注意到使用 cpuid 速度较慢,测量需要更长的时间。