7

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

4

2 回答 2

2

这取决于 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);
}

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

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

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

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

于 2014-01-10T18:58:22.877 回答
-3

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

于 2012-02-17T17:22:26.180 回答