14

mod( )演算は、2倍より少し大きい%乗算()よりもコストがかかるのはなぜですか?*

CPUが除算演算を実行し、MOD演算の結果を返す方法について具体的に説明してください。

次の例では、スレッドはそれぞれ1秒間実行されます。テストは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.
}
4

5 に答える 5

11

MODは除算演算であり、乗算演算ではありません。除算は乗算よりもコストがかかります。

MOD操作の詳細については、http://en.wikipedia.org/wiki/Modulo_operationを参照してください。

于 2010-11-05T19:32:23.113 に答える
5

除算のアルゴリズム(プロセッサはゲートに実装されたアルゴリズムによる除算と乗算を実行します)は、乗算よりもコストがかかります。実際のところ、非常に複雑な除算のアルゴリズムの中には、基本的なステップとして乗算を使用しているものがあります。

学校で学んだ素朴なアルゴリズムを使っても。どちらも同じ漸近的な複雑さを持っていますが、除算の定数は大きくなります(数字を見つける必要があり、それは些細なことではないので、混乱して修正する必要があります)。

于 2010-11-05T20:07:50.143 に答える
5

AMDおよびIntelx86プロセッサの命令レイテンシとスループット

1つの操作はCPUで本質的に遅くなります:)

于 2010-11-05T19:54:06.050 に答える
1

はい、modは除算によって実装されるため、乗算よりもコストがかかります。(CPUは通常、除算時に商と剰余の両方を返します。)ただし、両方のスレッドは乗算を使用します。コピー/貼り付けエラー?

于 2010-11-05T19:34:40.617 に答える
0

modは基本的に除算と同じプロセスです(このため、一部のシステムは「divmod」を提供します)。

バイナリロングマルチプリケーションとバイナリロングディビジョンの大きな違いは、ロングディビジョンでは各減算の後にオーバーフローテストを実行する必要があるのに対し、ロングマルチプリケーションは最初のマスキングプロセスの後に無条件に加算を実行することです。

つまり、長い乗算で加算を簡単に再配置して並列化することはできますが、長い除算では同じことを行うことはできません。私はhttps://stackoverflow.com/a/53346554/5083516でこれについてより長い答えを書きました

于 2019-03-01T16:17:24.777 に答える