我有一个内联的程序集,我用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快点。
发布于 2014-11-26 15:05:06
自从20年前推出以来,英特尔就一直在说“安全操作系统将在系统初始化期间设置TSD标志,以禁止用户访问时间戳计数器”。大多数操作系统忽略了英特尔;每隔5年左右,就会有一些安全研究人员“发现”了一种利用这种精确定时来削弱密码、加密密钥等的新方法,例如:http://people.csail.mit.edu/tromer/papers/cache.pdf、http://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的平均开销,以找出您的代码单独使用多长时间。
https://stackoverflow.com/questions/27150416
复制相似问题