MOD操作比乘法更加CPU密集吗?

时间:2010-11-05 19:30:06

标签: c++ division multiplication

为什么MOD操作比multiplication更贵,比factor of 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.
}

5 个答案:

答案 0 :(得分:12)

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

有关MOD操作的更多信息,请访问:http://en.wikipedia.org/wiki/Modulo_operation

答案 1 :(得分:5)

答案 2 :(得分:5)

用于除法的算法(处理器执行除法和门中实现的算法的乘法)比乘法更昂贵。事实上,一些具有良好复杂性的划分算法正在使用乘法作为基本步骤。

即使你使用在学校学到的天真算法。它们都具有相同的渐近复杂度,但是除法的常数更大(你必须找出数字并且这不是微不足道的,所以你可以搞砸并且必须解决这个问题)。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

mod本质上与除法相同(出于某些原因,某些系统提供了“ divmod”)。

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

这意味着您可以很容易地重新排列和并行化长乘法中的加法,但是对于长除法则不能这样做。我在https://stackoverflow.com/a/53346554/5083516

上写了一个更长的答案