Windows 上的 Spectre 和 Meltdown 缓解措施的 R 基准测试

R benchmarking of Spectre and Meltdown mitigations on Windows

像许多人一样,我怀疑,我有点担心最近 Windows 解决 Meltdown 和 Spectre 的更新是否会对 R 中的计算时间产生重大不利影响。我做了很多生存分析使用大型(ish)数据集,这已经花费了很长时间。不幸的是,我只是在更新我的主 PC 后才想到它,所以决定在相关 Windows 更新前后使用旧电脑进行一些基准测试。结果很有趣。

      test replications elapsed relative user.self sys.self
Pre-Update          100  287.31        1    281.41     5.68
PostUpdate          100  334.71        1    290.42    44.27
PostUpdate          100   338.9        1    294.22     44.5

经过时间的增加令人恼火,但可以控制。真正引人注目的是,这种放缓主要是由于系统时间增加了近 8 倍。这是预期的吗?有没有其他人做过类似的练习?了解其他人正在经历的影响的 运行ge 会很有趣,因为我只用一种特定类型的计算来做到这一点,这在我的某些工作中是瓶颈,而其他计算可能会受到更大的影响。我很欣赏这正在突破 Whosebug 旨在解决的问题类型的界限,但由于这可能会影响几乎所有人,分享经验的答案可能会有用。

一些背景信息: 我 运行 使用尽可能少的其他进程进行这些测试 运行ning。

为了完整起见,代码 运行 是:

library("survival")
library("rbenchmark")
set.seed(42)
n = 1e6
censTimes <- seq(from = 0, to = 1, length.out = n)
failTimes <- rweibull(n, 1, -1/log(0.9))
Event <- failTimes < censTimes
obsTimes <- ifelse(Event, failTimes, censTimes)
survObj <- Surv(obsTimes, Event)
Group <- rbinom(n, 4, 0.5)
benchmark(coxph(survObj ~ Group))

感谢您获得一些实数,包括特定的 CPU 模型和基准代码。

是的,由于 Meltdown 缓解,大部分影响在 system 时间内发生是有道理的。每次内核/用户space转换都要修改页面tables,导致TLB失效。与 R 相比,内核可能必须触及更多不同的页面,因为 R 可能主要使用较少的大型分配,而不检查分散在各处的变量/数据结构。

如果 Windows 也在进行 Spectre 缓解,它可能会做一些很慢的事情。 IDK,除了 之外,我还没有研究过操作系统如何尝试缓解 Spectre。 (故意使用 return-地址预测器导致对已知位置的错误预测,而不是受到启动预测器的恶意代码的分支目标注入)。


(尽管对 R 的 IDK 足够了解为什么它进行足够多的系统调用以占用大部分时间,甚至是预更新。)

Page-table 当 return 从内核到 user-space 时失效也会增加用户时间,但无论如何用户时间都很大。 (正如我所说,R 很可能不会触及许多不同的页面,因此只需要几次 TLB 未命中 -> 页面遍历以在系统调用或中断后返回 "up to speed"。)

相关:more microarchitectural details about Meltdown,以及为什么 CPU 设计在任何人想到 Meltdown 攻击之前就有意义。