1

我有一个用 clang++ 编译的内联程序集:

    asm volatile ("LFENCE\n\t"
              "RDTSC\n\t"
              "shl $32, %%rdx\n\t"
              "or %%rdx, %%rax\n\t"
              : "=a" (retval)
              :: "%rax", "%rdx");

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

我正在运行 Ubuntu 14.04

问题:

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

PS:我完全意识到 rdtsc 的测量错误、管道冲洗等问题。我可以忍受它们,并且我会在需要的地方采取预防措施。我只希望 rdtsc 快。

4

1 回答 1

3

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

如果再加上人们假设它以恒定速率滴答作响(它不在旧 CPU 上)引起的问题;然后是人们假设它与性能有关(它不在较新的 CPU 上)引起的问题;然后是那些简单地错误使用它的人(例如,在错误很大的地方计时一个短序列);这似乎是一个更糟糕的主意。

如果您在多 CPU 系统(尤其是 NUMA 系统)上添加“out-of_sync TSC”问题;它变得更糟(特别是对于试图保持它“可能同步”的内核)。

最后,如果您查看性能监控计数器、分析器等内容;您意识到 RDTSC 是该工作的错误工具。然后你在“一天中的时间”和“经过的时间”功能中寻找另一个方向,并意识到那里也有体面/便携的替代品。

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

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

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

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

最后; 从“RDTSC + 你的代码”结果中减去 RDTSC 单独的平均开销,以找出你的代码自己需要多长时间。

于 2014-11-26T15:05:06.427 回答