我有一段使用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
重新开始工作?答案 0 :(得分:3)
英特尔一直在说“安全操作系统会在系统初始化期间设置TSD标志,以禁止用户访问时间戳计数器”,因为它自20年前推出以来。大多数操作系统忽略了英特并且每隔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的平均开销,以查找您的代码将自行使用多长时间。