RDTSC 在 Ubuntu 中很慢

RDTSC slow in Ubuntu

本文关键字:Ubuntu RDTSC      更新时间:2023-10-16

我有一段内联程序集,我用 clang++ 编译:

    asm volatile ("LFENCEnt"
              "RDTSCnt"
              "shl $32, %%rdxnt"
              "or %%rdx, %%raxnt"
              : "=a" (retval)
              :: "%rax", "%rdx");

在OSX上,如上所述检查rdtsc的总成本约为10-20个周期。当我在 Linux(不是虚拟机)上编译相同的代码时,大约需要 2500 个周期。这让我怀疑Linux正在做一些愚蠢的事情,比如在用户空间中禁用RDTSC。从这些文章中,看起来至少已经考虑过Linux:

  • RDTSC,周期太多
  • http://lwn.net/Articles/388188/

我正在运行 Ubuntu 14.04

问题:

  • 内核模式是否只rdtsc真正进入 Ubuntu 内核?
  • 如果存在,如何检测当前设置?
  • 如何让用户模式rdtsc再次工作?

PS:我完全意识到rdtsc的问题,即测量错误,管道冲洗等。我可以和他们住在一起,我正在采取必要的预防措施。我只是希望rdtsc快。

自 20 年前推出以来,英特尔一直在说"安全操作系统会在系统初始化期间设置 TSD 标志,以禁用用户对时间戳计数器的访问"。大多数操作系统忽略了英特尔;每隔 5 年左右,某个地方的一些安全研究人员就会"发现"一种使用如此精确时间削弱密码、加密密钥等的新方法。示例:http://people.csail.mit.edu/tromer/papers/cache.pdf、http://www.daemonology.net/papers/htt.pdf

如果你再加上人们假设它以恒定的速度滴答作响(它不在旧CPU上)引起的问题;然后人们认为它与性能无关(它在较新的CPU上没有)引起的问题;然后是那些完全错误使用它的人(例如,为误差巨大的单个短序列计时);它开始看起来像一个更糟糕的想法。

如果你再加上多CPU系统(尤其是NUMA系统)上的"外of_sync TSC"问题;情况会变得更糟(特别是对于试图保持它"有点同步"的内核)。

最后,如果你看一下性能监视计数器、探查器等东西;你就会意识到RDTSC是不适合这项工作的工具。然后,您从另一个方向查看"一天中的时间"和"经过的时间"功能,并意识到那里也有体面/便携式的替代方案。

注意:我不知道 Ubuntu 是否在所有系统上的用户空间中禁用了 RDTSC,或者只是在某些系统上(例如,速率不是恒定和/或 CPU 之间不同步的系统),或者即使他们根本没有禁用它。我所知道的是,它应该在20年前被禁用。

编辑:以上是所问问题的答案。以下是您需要的答案。

要正确使用 RDTSC;首先在循环中对"无"进行计时,同时丢弃"高于正常"的结果(由 IRQ、任务切换等引起)。使用它来查找"无"的平均值(仅 RDTSC 的平均开销)。

接下来,对要测试的代码执行完全相同的操作(包括丢弃"高于正常值"的结果),以查找"RDTSC + 您的代码"的平均开销。

最后,从"RDTSC + 你的代码"结果中减去RDTSC的平均开销,找出你的代码本身需要多长时间。