【问题标题】:Do modern cpus skip multiplications by zero?现代CPU是否跳过零乘法?
【发布时间】:2012-03-09 02:43:45
【问题描述】:

我想知道当前的 cpus 是否在其中至少一个为零时避免将两个数字相乘。谢谢

【问题讨论】:

  • 它如何“跳过”乘法?如果结果为 0,无论它执行得有多快,它实际上已经完成了乘法运算。
  • Megan Wachs 在她的RiscV keynote 中提到了这个问题。她还提到了一个重要的观点:这对于安全性来说是可怕的,因为它会使许多算法对定时攻击开放。它打开了一个侧通道,当跨越这样的“零点”时,许多计算会比其他计算运行得更短。

标签: cpu instructions multiplication


【解决方案1】:

这取决于 CPU 和(在某些情况下)操作数的类型。

较旧/较简单的 CPU 通常使用如下乘法算法:

integer operator*(integer const &other) {
    unsigned temp1 = other.value;
    unsigned temp2 = value;
    unsigned answer = 0;

    while (temp1 != 0) {
        if (temp1 & 1) 
            answer += temp2;
        temp2 <<= 1;
        temp1 >>=1;
    }
    return integer(answer);
}

由于循环仅在/如果temp1 != 0 时执行,因此如果temp1 开始为0,则循环显然不会执行(但正如此处所写,不会尝试对另一个操作数为0 进行任何优化)。

然而,这基本上是一次一位的算法。例如,当乘以 32 位操作数时,如果每个位有 50:50 的机会被设置,我们预计平均大约 16 次迭代。

更新的高端 CPU 通常一次至少使用两个位,甚至可能更多。它通常不会使用单个硬件执行多次迭代,而是为乘法的每个阶段使用单独的(尽管本质上相同)硬件对操作进行流水线操作(尽管这些通常不会在正常的流水线图中显示为单独的阶段对于处理器)。

这意味着无论操作数如何,执行都将具有相同的延迟(和吞吐量)。平均而言,它会稍微改善延迟并大大提高吞吐量,但确实会导致每个操作以相同的速度发生,而不管操作数如何。

【讨论】:

    【解决方案2】:

    我希望现代台式机 CPU 中会有这样的东西。

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2011-05-05
      • 2014-04-12
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      相关资源
      最近更新 更多