次のシナリオにおける通常の C++ アプリケーションの相対的なパフォーマンスを知りたいです。
- 32 ビット アプリとして構築され、Intel 64 ビット プロセッサ (x64-64) で実行されます
- 32 ビット アプリとして構築され、Intel 32 ビット プロセッサ (x86) で実行されます
- 64 ビット アプリとしてビルドされます。
また、アプリケーションを 64 ビット プロセッサでより高速に実行できるように変更または開発する場合、どのような要因を考慮する必要がありますか?
次のシナリオにおける通常の C++ アプリケーションの相対的なパフォーマンスを知りたいです。
また、アプリケーションを 64 ビット プロセッサでより高速に実行できるように変更または開発する場合、どのような要因を考慮する必要がありますか?
短い答え: おそらく違いはほとんどありません。
より長い答え: 64 ビット x86 にはより多くの汎用レジスターがあり、コンパイラーはローカル変数をレジスターに最適化してアクセスを高速化する機会が増えます。コンパイラは、より最新の機能を想定することもできます。386 用にコードを最適化する必要がなく、浮動小数点演算用の古い x87 FPU の代わりに CPU に SSE のようなものがあると想定できます。しかし、ポインターは 2 倍の幅になり、キャッシュにとってはさらに悪いことになります。
CPU を集中的に使用するプログラムは、64 ビットで著しく高速になる場合があります。プロセッサには、2 倍の幅 (32 ビットではなく 64) の汎用レジスタが 8 個ではなく 16 個あります。
また、SSE 命令のレジスタ数が 8 から 16 に倍増され、マルチメディア アプリケーションやその他の浮動小数点計算を多く行うアプリケーションに役立ちます。
詳細については、Wikipedia のx86-64を参照してください。
まだ言及されていないことの 1 つは、Windows や Linux などのオペレーティング システムの 64 ビット バージョンでは、64 ビット システムでの関数呼び出しに異なる呼び出し規約が使用されていることです。スタックで引数を渡す代わりに、引数は(できれば)レジスタで渡されます。これは原則としてより高速です。したがって、関数呼び出しのオーバーヘッドが少ないため、ソフトウェアは高速になります。
パフォーマンスはアプリケーションに依存する可能性が非常に高く、64 ビット環境向けに最適化されたライブラリを使用するかどうかによって、大きく異なる可能性があります。高速化を期待する場合は、命令セット アーキテクチャを考慮するよりも、アルゴリズムの改善に集中する必要があります。
64ビットの準備/開発に関しては...重要なことは、タイプとそれぞれのサイズに関して仮定をしないことです。特定のサイズの型が必要な場合は、< stdint.h > で定義されている型を使用します。size_tまたはptrdiff_tを使用する関数が表示される場合は常に、他の型ではなく typedef を使用する必要があります。
4G を超えるメモリの要件はありますか? 大量のメモリを活用することが、64 ビットに移行する大きな理由です。
一般に、64 ビット操作のサポートのみが異なる同等のプロセッサは見つからないため、1) と 2) を具体的に比較することは困難です。一方、32 ビット モードと 64 ビット モードのビルドの違いは、完全にアプリケーションに依存します。64 ビット バージョンは、32 ビット バージョンよりもわずかに遅いか、わずかに速い場合があります。アプリケーションが多くの一時変数を使用する場合、64 ビット モードの増加したレジスタ セットは、パフォーマンスに非常に大きな違いをもたらす可能性があります。
経験上、32 ビット アプリケーションを 64 ビットで再コンパイルすると、通常は約 30% 高速になります。これは大まかな数字ですが、私が 64 ビットに移植したかなりの数のアプリケーションに当てはまります。基本的には上記の理由からです。天の恵みであるより多くのレジスタがあり、メモリのスワップインとアウトをはるかに少なくすることができます(とにかくキャッシュされるため、勝利は非常に小さくなります)。特定の最適化も、はるかに簡単に行うことができます。ただし、コンテキスト スイッチを実行するには、レジスタ セットが大きいため、より多くのメモリを使用する必要があることは言うまでもありません。
ただし、64 ビットで慎重に手動で最適化すると、パフォーマンスが大幅に向上します。
最善の計画は、64 ビットおよびプロファイルとして再コンパイルすることです。つまり、どちらが優れているかを確認します。
マルチチャネル MC 同時データ バス バースト、IMC、および新しい x86_64 アーキテクチャのマルチコア機能について何か知っていますか? 少なくとも、同時バーストに関係なく64ビットのバスとレジスタを使用するため、64ビットの場合、memcpyはより高速に最適化できます。少なくとも新しいアーキテクチャでは、複数のメモリ モジュールからデータを同時にキャッシュにプリフェッチできます。もっと...