【问题标题】:R benchmarking of Spectre and Meltdown mitigations on WindowsWindows 上 Spectre 和 Meltdown 缓解措施的 R 基准测试
【发布时间】:2018-06-20 05:12:15
【问题描述】:

像许多人一样,我怀疑,我有点担心最近的 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 倍。这是预期的吗?有没有其他人做过类似的练习?知道其他人正在经历的影响范围会很有趣,因为我只使用一种特定类型的计算来做这件事,这在我的一些工作中是一个瓶颈,而其他计算可能会受到更大的影响。我很欣赏这是在推动 stackoverflow 所针对的问题类型的界限,但由于这可能会影响几乎所有人,因此分享经验的答案可能会很有用。

只是一点背景背景: 我用尽可能少的其他进程运行这些测试。

  • 处理器:i5-2500(显然没有微码更新!)
  • 操作系统:Windows 7,更新前后 KB4056897
  • R 版本 3.4.3

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

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))

【问题讨论】:

    标签: r benchmarking


    【解决方案1】:

    感谢您提供一些实数,包括特定的 CPU 型号和基准代码。

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

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


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

    从内核返回用户空间时页表失效也会增加用户时间,但无论如何用户时间都很大。 (正如我所说,R 很可能不会触及许多不同的页面,因此只需要一些 TLB 未命中 -> 页面遍历即可在系统调用或中断后恢复“速度”。)

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

    【讨论】:

    • 谢谢。这就说得通了。从你所说的来看,我猜涉及大量内核/用户空间转换的代码将受到最严重的打击,尽管具体计算 R 中涉及的哪种计算需要比我拥有的 R 知识更深入!
    • @Knackiedoo:是的,当然。内存分配/释放,或者甚至多线程互斥函数可能是罪魁祸首,如果它使用一些互斥锁,在无争用情况下总是调用内核而不试图留在用户空间:preshing.com/20111124/always-use-a-lightweight-mutex。显然,Windows 有一些不是轻量级的锁原语。
    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多