cpu - 现代 CPU 是否跳过乘法为零?

标签 cpu instructions multiplication

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

最佳答案

这取决于 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 通常一次至少处理两个位,甚至可能更多。它不是一个单一的硬件执行多次迭代,它通常会为乘法的每个阶段使用单独的(尽管本质上相同)硬件流水线操作(尽管这些通常不会在正常的流水线图中显示为单独的阶段)处理器)。

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

关于cpu - 现代 CPU 是否跳过乘法为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9332670/

相关文章:

php - FFMPEG 使我的服务器崩溃

cpu - 缓存地址映射如何工作?

assembly - x86-64中movq和movabsq之间的区别

assembly - imul 汇编指令 - 一个操作数?

c - C 中的乘法问题

c - 以下哪种 C 乘法算法更容易使用 CPU 并且开销更低?

java - 在桌面和移动 CPU 上使用 Java 进行并行处理

java - 每个 JVM 或每个 CPU 核心的线程数

c - 将低字节从 int 复制到 char : Simpler to just do a byte load? 的指令

首次使用的 Javascript 说明