2009-10-15 10 views
6

私は次のシナリオで通常のC++アプリケーションの相対的性能を知りたい:32として構築され、インテルの64ビットプロセッサ(x64-64) 64ビットアーキテクチャと32ビットインテルアーキテクチャでアプリケーションをどのように実行する必要がありますか?

  • で実行32ビットアプリケーションとして構築

    1. Intel 32ビットプロセッサ(x86)で動作する-bitアプリケーション
    2. 64ビットアプリケーションとしてビルドされています。

    さらに、64ビットプロセッサでアプリケーションを高速に実行するためにアプリケーションを変更/開発する際には、どのような要素を考慮する必要がありますか?

  • +0

    Hmm。コメントなしで投票しました。これはあまりにも単純な質問ではありませんが、興味深い情報があります。 –

    答えて

    3

    パフォーマンスはアプリケーションによって大きく異なる可能性があります.64ビット環境で最適化されたライブラリを使用するかどうかによって、パフォーマンスが大きく異なる場合があります。スピードアップを期待したい場合は、命令セットのアーキテクチャを考慮するのではなく、アルゴリズムの改善に集中する必要があります。

    64ビット用の準備/開発は、タイプとそれぞれのサイズについて前提にしないことです。特定のサイズのタイプが必要な場合は、< stdint.h >で定義されているタイプを使用してください。 size_tまたはptrdiff_tを使用する関数が見つかるときは、他の型ではなくtypedefを使用する必要があります。

    7

    短い回答:おそらく大きな違いは感じられません。

    長い答え:64ビットx86にはより一般的な目的のレジスタがあります。これにより、ローカル変数をレジスタに最適化してより高速にアクセスできるようになります。コンパイラは、より現代的な特徴、例えば、 386のためのコードを最適化する必要はなく、あなたのCPUは浮動小数点演算のための古いx87 FPUの代わりにSSEのようなものを持っていると仮定することができます。ポインタは2倍の幅になりますが、これはキャッシュにとって悪いことです。

    +0

    +1ポインタの長さに言及します。これは、大きなポインタ構造が使用されている場合、大きな違いを生むことがあります。 – swegi

    +0

    32ビットビルドでも、/ arch:SSE2のようなコンパイラオプションを指定することで、コンパイラの最適化(SSEスカラー浮動小数点数など)を得ることができます。 – Crashworks

    +0

    ... gccユーザの場合は、 '-march = core2 -msse2 -mfpmath = sse' – Tom

    1

    一般的に、64ビット動作のサポートが異なるだけの同等のプロセッサーは見つからないため、1)と2)の間で具体的な比較をするのは難しいでしょう。一方、32と64ビットモードのビルドの違いは、アプリケーションに完全に依存します。 64ビットバージョンは、32ビットバージョンよりわずかに遅いか、またはわずかに高速です。アプリケーションで多数の一時変数が使用されている場合、64ビット・モードのレジスター・セットが増えると、パフォーマンスに大きな差が生じます。

    1

    私が経験したことから、32ビットアプリケーションの64ビットの再コンパイルが一般的に約30%速くなっていることがわかりました。その大まかな数字ですが、私は64ビットに移植したかなりの数のアプリケーションで使用されています。基本的には上記の理由からです。あなたには神聖なレジスタが多くあり、メモリの入れ替えやメモリからの出し入れがずっと少なくなります(これはおそらく勝てるようにキャッシュされます)。ある種の最適化をより簡単に行うこともできます。しかし、コンテキストスイッチを実行するとレジスタセットが大きくなるために使用されるメモリが増えることは言うまでもなく、ゲインの一部を取り除く大きなポインタの問題を抱えています。

    64ビットで慎重に手を最適化すると、パフォーマンスが大幅に向上する可能性があります。

    64ビットとプロファイルとして再コンパイルすることをお勧めします。すなわち、どちらが良いか参照してください。

    5

    CPUを大量に消費するプログラムは、64ビットで顕著に高速になる可能性があります。プロセッサは8倍の汎用レジスタの代わりに16ビットを使用でき、これも2倍の幅(32ビットの代わりに64ビット)です。

    また、SSE命令のレジスタ数は8から16に2倍になります。これは、マルチメディアアプリケーションや浮動小数点演算を多くするアプリケーションに役立ちます。

    詳しくは、Wikipediaのx86-64を参照してください。

    まだ言及されていないことの1つは、WindowsやLinuxなどの64ビットバージョンのオペレーティングシステムでは、64ビットシステムの関数呼び出しに異なるcalling conventionを使用していることです。スタックに引数を渡すのではなく、引数が(好ましくは)レジスタに渡されますが、これは原理的には高速です。したがって、関数呼び出しのオーバーヘッドが少なくなるため、ソフトウェアは高速になります。

    0

    マルチチャネルMCの同時データバスバースト、IMC、新しいx86_64アーキテクチャのマルチコア機能について知っていますか? memcpyは、同時バーストに関係なく、64ビットのバスとレジスタを使用するため、64ビットであれば高速に最適化できます。少なくとも新しいアーチは、複数のメモリモジュールからのデータを同時にキャッシュにプリフェッチすることができる。その他...

    +0

    は、いくつかのアイデアについてはhttp://code.google.com/p/effogpled/downloads/list、文書名EffoDesign_MemTest.pdfを参照してください。 – Test

    1

    > 4G以上のメモリが必要ですか?メモリのゴブを利用することは、本当に64ビットに行く大きな理由です。

    関連する問題