UTSntu的RDTSC速度慢

时间:2014-11-26 13:24:43

标签: c++ ubuntu assembly rdtsc

我有一段使用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快点。

1 个答案:

答案 0 :(得分:3)

英特尔一直在说“安全操作系统会在系统初始化期间设置TSD标志,以禁止用户访问时间戳计数器”,因为它自20年前推出以来。大多数操作系统忽略了英特并且每隔5年左右,一些安全研究人员在某处“发现”使用这种精确计时来削弱密码,加密密钥等的新方法。示例:http://people.csail.mit.edu/tromer/papers/cache.pdfhttp://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的平均开销,以查找您的代码将自行使用多长时间。