首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RDTSC慢速在Ubuntu

RDTSC慢速在Ubuntu
EN

Stack Overflow用户
提问于 2014-11-26 13:24:42
回答 1查看 692关注 0票数 1

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

代码语言:javascript
复制
    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快点。

EN

回答 1

Stack Overflow用户

发布于 2014-11-26 15:05:06

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

如果你再加上一些人认为它是以恒定的速度滴答作响的问题(而不是老的CPU);那么人们认为它与性能有任何关系所引起的问题(在较新的CPU上没有);那么那些只是简单地使用错误的人(例如,在错误很大的情况下对一个短序列进行计时);这似乎是一个更糟糕的想法。

如果在多CPU系统(特别是NUMA系统)上添加“失时TSC”的问题,情况会变得更糟(特别是对于内核试图保持它“某种程度的同步可能”)。

最后,如果您查看性能监视计数器、分析器等,您会发现RDTSC是该工作的错误工具。然后,在“一天中的时间”和“经过的时间”函数中向另一个方向看,并意识到那里也有不错的/可移植的替代方案。

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

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

正确使用RDTSC;从循环中的"nothing“计时开始,同时丢弃”高于正常“结果(由IRQ、任务切换等引起)。使用此方法查找"nothing“的平均值(仅RDTSC的平均开销)。

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

最后,从"RDTSC +您的代码“结果中减去RDTSC的平均开销,以找出您的代码单独使用多长时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27150416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档