【问题标题】:Is MOD operation more CPU intensive than multiplication?MOD 运算是否比乘法更占用 CPU?
【发布时间】:2011-05-05 18:59:51
【问题描述】:

为什么 mod (%) 运算比乘法 (*) 的成本要高出2 倍

请详细说明CPU如何进行除法运算并返回MOD运算的结果。

在以下示例中,每个线程运行一秒钟。测试是在SPARC 处理器上执行的。

// multiplication
void someThread() {

    int a = 10234;
    while (true) {
        opers++;
        a = a * a;
        a++;
    }

    // opers ~ 26 * 10^6 in a sec.
}

// MOD
void someThread() {

    int a = 10234;
    while (true) {
        opers++;
        a = a % 10000007;
        a++;
    }

    // opers ~ 12 * 10^6 in a sec.
}

【问题讨论】:

标签: c++ cpu-architecture multiplication division


【解决方案1】:

mod 与除法本质上是相同的过程(出于这个原因,一些系统提供了“divmod”)。

二进制长乘法和二进制长除法的最大区别在于,长除法要求您在每次减法后执行溢出测试,而长乘法在初始屏蔽过程后无条件地执行加法。

这意味着您可以轻松地重新排列和并行化长乘法中的加法,但您不能对长除法做同样的事情。我在https://stackoverflow.com/a/53346554/5083516写了一个更长的答案@

【讨论】:

    【解决方案2】:

    除法算法(处理器通过门中实现的算法执行除法和乘法运算)比乘法运算成本更高。事实上,一些复杂度较高的除法算法都是以乘法为基本步骤的。

    即使您使用在学校学到的简单算法。它们都具有相同的渐近复杂度,但除法的常数更大(您必须找出数字,这不是微不足道的,因此您可能会搞砸并必须修复混乱)。

    【讨论】:

      【解决方案3】:

      Instruction latencies and throughput for AMD and Intel x86 processors

      一个操作在 CPU 上天生就比较慢 :)

      【讨论】:

        【解决方案4】:

        MOD 是除法运算,而不是乘法运算。除法比乘法更昂贵。

        更多关于MOD操作的信息在这里:http://en.wikipedia.org/wiki/Modulo_operation

        【讨论】:

        • 罗伯特:除法也可以这样说——即除法更昂贵,因为它是一个 MOD 运算,而 MOD 比乘法更昂贵。我想了解更多关于 CPU 级别的详细信息,为什么除法/模比乘法更昂贵。这个答案重复了我的问题。
        • 这是正确的答案,显然 OP 并没有认真地比较 mod 和 div。互联网上的某个地方应该有一个尘土飞扬的角落谈论 sparc 处理器的内部结构。
        • 如果正确答案除了说明显而易见的事情之外什么都没说,那么问题一定很糟糕。之后,我改进了问题并要求提供有关 CPU 使用率的更多详细信息。
        【解决方案5】:

        是的,mod 比乘法更昂贵,因为它是通过除法实现的。 (CPU 通常在除法时返回商和余数。)但是你的两个线程都使用乘法。复制/粘贴错误?

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 2011-12-15
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2015-07-16
          • 1970-01-01
          • 2016-11-15
          相关资源
          最近更新 更多