4

CPU 負荷のシナリオをチェックするために、この小さなプログラムを C++ で作成しました。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int main()
{

    double x = 1;
    int t1 = GetTickCount();
    srand(10000);

    for (unsigned long i = 0; i < 10000000; i++)
    {
        int r = rand();
        double l = sqrt((double)r);
        x *= log(l/3) * pow(x, r);
    }

    int t2 = GetTickCount();
    printf("Time: %d\r\n", t2-t1);
    getchar();
}

x86 用と win7 x64 上の x64 用の両方をコンパイルしました。
x64版だとなぜか3秒くらいで終わっ
たのに、x86版でやってみると48(!!!)秒かかりました。
何度も試しましたが、いつも同じような結果が得られました。
この違いの原因は何ですか?

4

4 に答える 4

14

(最大の最適化)を使用したアセンブラーの出力を見ると/Ox、x86 ビルドと x64 ビルドの速度の違いは明らかです。

; cl /Ox /Fa tick.cpp
; x86 Line 17: x *= log(l/3) * pow(x, r)
fld     QWORD PTR _x$[esp+32]
mov     eax, esi
test    esi, esi
; ...

この計算には x87 命令が使用されていることがわかります。これを x64 ビルドと比較します。

; cl /Ox /Fa tick.cpp
; x64 Line 17: x *= log(l/3) * pow(x, r)
movapd  xmm1, xmm8
mov     ecx, ebx
movapd  xmm5, xmm0
test    ebx, ebx
; ...

代わりに SSE 命令が使用されていることがわかります。

Visual Studio 2010 を試行錯誤して同様の命令を生成することはできますが、64 ビット コンパイラは、目の前のタスクに対してはるかに高速なアセンブリを生成するだけ/arch:SSE2のようです

最後に、浮動小数点モデルを緩和すると、x86 と x64 のパフォーマンスはほぼ同じになります。

タイミング、非科学的な最高の 3:

  • x86 /Ox、: 22704 ティック
  • x64、: /Ox822 ティック
  • x86 /Ox /arch:SSE2、: 3432 ティック
  • x64、: /Ox /favor:INTEL641014 ティック
  • x86 /Ox /arch:SSE2 /fp:fast、: 834 ティック
于 2012-04-25T14:52:04.133 に答える
5

その理由は確かに SSE に関連しています。VS の 64 ビット リリース ビルドはデフォルトで SSE2 命令を生成しますが、32 ビット ビルドでは/arch:SSE2スイッチを使用して明示的に有効にする必要があります。これを行うと、32 ビットと 64 ビットのビルドで同等の実行時間が得られます。

于 2012-04-25T14:57:35.823 に答える
3

ここでの可能性の多くは、x86とx64の関係はほとんどまたはまったくありません。明らかな可能性の1つは、ほとんどの(すべて?)コンパイラーが浮動小数点にSSEを使用することです。ここで、ほとんどの場合、x86モードで8087スタイルの命令を使用します。コードは浮動小数点に重いため、これは大きな違いを生む可能性があります。

もう1つの可能性は、x64のプロセスまたは書き換え中に、少なくとも特定の状況下で、コードジェネレーターのいくつかの問題に気づき/修正して、大幅に優れたコードを生成できるようにすることです。

ここでは当てはまらないように見えますが、一部のコードは、64ビットモードで使用できるレジスタのサイズや数が増えることで大きなメリットが得られます。

于 2012-04-25T14:43:12.950 に答える
1

その一部は間違いなく SSE ですが、x64 が SSE モードを使用する大きな理由があります。すべての AMD64 CPU には SSE2 が必要です。別の部分は、レジスター数の増加でもある可能性があります

于 2012-06-09T16:57:47.103 に答える