RDTSC 在 Ubuntu 中很慢
RDTSC slow in Ubuntu
我有一段内联程序集,我用 clang++ 编译:
asm volatile ("LFENCEnt"
"RDTSCnt"
"shl $32, %%rdxnt"
"or %%rdx, %%raxnt"
: "=a" (retval)
:: "%rax", "%rdx");
在OSX上,如上所述检查rdtsc
的总成本约为10-20个周期。当我在 Linux(不是虚拟机)上编译相同的代码时,大约需要 2500 个周期。这让我怀疑Linux正在做一些愚蠢的事情,比如在用户空间中禁用RDTSC。从这些文章中,看起来至少已经考虑过Linux:
- RDTSC,周期太多
- http://lwn.net/Articles/388188/
我正在运行 Ubuntu 14.04
问题:
- 内核模式是否只
rdtsc
真正进入 Ubuntu 内核? - 如果存在,如何检测当前设置?
- 如何让用户模式
rdtsc
再次工作?
PS:我完全意识到rdtsc的问题,即测量错误,管道冲洗等。我可以和他们住在一起,我正在采取必要的预防措施。我只是希望rdtsc快。
自 20 年前推出以来,英特尔一直在说"安全操作系统会在系统初始化期间设置 TSD 标志,以禁用用户对时间戳计数器的访问"。大多数操作系统忽略了英特尔;每隔 5 年左右,某个地方的一些安全研究人员就会"发现"一种使用如此精确时间削弱密码、加密密钥等的新方法。示例:http://people.csail.mit.edu/tromer/papers/cache.pdf、http://www.daemonology.net/papers/htt.pdf
如果你再加上人们假设它以恒定的速度滴答作响(它不在旧CPU上)引起的问题;然后人们认为它与性能无关(它在较新的CPU上没有)引起的问题;然后是那些完全错误使用它的人(例如,为误差巨大的单个短序列计时);它开始看起来像一个更糟糕的想法。
如果你再加上多CPU系统(尤其是NUMA系统)上的"外of_sync TSC"问题;情况会变得更糟(特别是对于试图保持它"有点同步"的内核)。
最后,如果你看一下性能监视计数器、探查器等东西;你就会意识到RDTSC是不适合这项工作的工具。然后,您从另一个方向查看"一天中的时间"和"经过的时间"功能,并意识到那里也有体面/便携式的替代方案。
注意:我不知道 Ubuntu 是否在所有系统上的用户空间中禁用了 RDTSC,或者只是在某些系统上(例如,速率不是恒定和/或 CPU 之间不同步的系统),或者即使他们根本没有禁用它。我所知道的是,它应该在20年前被禁用。
编辑:以上是所问问题的答案。以下是您需要的答案。
要正确使用 RDTSC;首先在循环中对"无"进行计时,同时丢弃"高于正常"的结果(由 IRQ、任务切换等引起)。使用它来查找"无"的平均值(仅 RDTSC 的平均开销)。
接下来,对要测试的代码执行完全相同的操作(包括丢弃"高于正常值"的结果),以查找"RDTSC + 您的代码"的平均开销。
最后,从"RDTSC + 你的代码"结果中减去RDTSC的平均开销,找出你的代码本身需要多长时间。
- 在Ubuntu 16.04上安装Cilk时出现问题
- 如何在Ubuntu中使用cmake设置qt4
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 无法在Ubuntu上将共享库与Eclipse链接
- 使用rdtsc进行基准测试的缺点是什么
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2) - C++编译器问题
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 如何在 Ubuntu 上安装 OpenCV for C/C++
- 估计 Ubuntu C++内存使用情况
- 在 Ubuntu 中创建自动安装程序
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- OpenGL 在 VMWare Fusion 版本 10.1.3 上安装的虚拟机 (Ubuntu 16.04) 上崩溃
- 在 ubuntu 上安装 node js pulsar 客户端
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 这是 ubuntu 16.04 中的 gdb 错误吗?
- 生成文件:6:目标'all'的配方在 Ubuntu-16.04 上失败
- LinuxdeployQT 今天如何创建 Appimage,自 ubuntu 16.04 发布以来,它可以在每个 Lin
- RDTSC 在 Ubuntu 中很慢