在 x86 上获取当前时间的说明

Instruction to get the current time on x86

有x86指令获取当前时间吗?

基本上...类似于 clock_get_time 的替代品...开销最小的东西...我真的不关心以任何特定格式获取时间...只要因为这是我可以使用的格式。

基本上我正在做一些工作 "Detect how much PHYSICAL REAL LIFE TIME" 已经过去了......我希望能够尽可能频繁地测量时间!

我猜你可以想象我正在做一些类似分析应用程序的事情...:)

我真的需要积极有效地访问硬件时间。所以理想情况下......一些 ASM 来获得时间......将它存储在某个地方......然后稍后将其按摩成我可以实际处理的某种格式。

我对 _rdtsc 不感兴趣,因为它测量经过的周期数。我需要知道执行了多少物理时间...而不是由于热波动等原因而变化的周期...

对于分析,通常根据 CPU 时钟周期而不是挂钟时间进行分析是最有用的。 CPU 动态时钟(turbo 和省电)让 CPU 在测量周期开始前加速到全速很烦人。

如果之后还需要挂钟时间:

最近的 x86 CPUs 有一个以固定速率运行的 TSC,而不管 CPU 频率调整以节省功率。此外,当 CPU 停止时,TSC 不会停止。 (即无工作可做,因此 运行 HLT 指令在低功耗模式下等待中断。)

事实证明,在硬件中有效访问有用的时间源比实际的时钟周期计数器更有用,所以这就是 RDTSC 演变成的东西,几代 CPU它的介绍之后。现在我们回到使用硬件性能计数器来测量时钟周期。

在 Linux 中,在 /proc/cpuinfo 的 CPU 特征标志中寻找 constant_tscnonstop_tsc。 IDK 如果有 CPUID 位。如果不是,请使用 Linux 的代码(如果您可以使用 GPLed 代码)。

在具有这两个主要功能的 CPU 上,Linux 使用 TSC 作为其时钟源 IIRC。

在 user-space 中获取当前时间的开销最低的方法是计算 RDTSC 滴答和实时之间的转换。分析时,您可能只存储 64 位 TSC 快照,稍后再转换为实时快照。 (这样你就可以处理 TSC 环绕)。 RDTSC 只需要大约 24 个周期(Agner Fog 的指令 table,Intel Haswell)。我认为系统调用的开销会比这高出一个数量级。 (无论如何,内核都必须在某处执行 RDTSC)。

Agner Fog 有 documented his profiling / timing methods,并且有一些示例代码。我最近没看,但它可能对这个应用程序有用。