确定Linux上的TSC频率

时间:2018-08-19 15:34:40

标签: linux performance x86 rdtsc

给出一个带有constant TSC的x86,这对实时测量非常有用,如何使用TSC在TSC参考周期的“单位”和正常的人类实时单位(例如纳秒)之间进行转换Linux在启动时计算出的校准系数?

也就是说,通过在某个时间间隔的两端进行TSC和时钟测量(例如,使用CLOCK_MONOTONIC)来确定TSC频率,可以肯定地计算出用户区域中的TSC频率,但是Linux已经做到了这种计算是在启动时进行的,因为它在内部使用TSC来帮助进行计时。

例如,您可以使用dmesg | grep tsc查看内核的结果:

[    0.000000] tsc: PIT calibration matches HPET. 2 loops
[    0.000000] tsc: Detected 3191.922 MHz processor
[    1.733060] tsc: Refined TSC clocksource calibration: 3192.007 MHz

在更坏的情况下,我猜您可以尝试在运行时从dmesg中提取结果,但是坦率地说,这似乎很可怕,脆弱,并且各种各样坏的 0 。 / p>

使用内核确定的校准时间有很多优点:

  1. 您不必自己编写TSC校准例程,并且可以肯定Linux是同类中最好的。
  2. 当使用您现有的二进制文件产生新内核时,您会自动采用TSC校准的新技术(例如,最近的芯片开始使用cpuid叶子0x15公布其TSC频率,因此校准不一定总是必要的。)
  3. 您不会因TSC校准而减慢启动速度。
  4. 您在每次运行过程中都使用相同的TSC值(至少在重新启动之前)。
  5. 您的TSC频率与gettimeofdayclock_gettime 1 之类的OS计时功能使用的TSC频率某种程度上“一致”。
  6. 内核能够在启动时很早地以内核模式进行TSC校准,而不受中断和其他进程的困扰,并且能够访问底层硬件计时器指令作为其校准源。

虽然还不是全部,但是使用Linux的TSC校准的一些缺点包括:

  1. 它不适用于所有Linux安装(例如,可能不使用tsc时钟源的安装)或完全不适用于其他OS,因此您可能仍会编写后备校准方法。
  2. 有一些理由认为“最近的”校准可能比旧的校准更准确,尤其是在开机后立即进行的校准:晶体的性能可能会发生变化,尤其是随着温度的变化,因此您可以获得的频率会更准确通过在您将要使用的位置附近手动进行操作。

0 例如:系统可能未安装dmesg,您可能无法以常规用户身份运行它,累积的输出可能已经环绕,因此没有如果存在时间更长,则您的grep可能会得到误报,内核消息是英文散文,并且可能会发生变化,可能很难启动子流程等,等等。

1 这是否重要还是有争议的-但是,如果将rdtsc调用与同样使用OS时间保持功能的代码混合在一起,则可能会提高精度。

0 个答案:

没有答案