88

私は x86 に焦点を当てていると思いますが、一般的には 32 ビットから 64 ビットへの移行に関心があります。

論理的には、場合によっては定数とポインターが大きくなるため、プログラムが大きくなる可能性があることがわかります。また、効率のために単語境界にメモリを割り当てたい場合は、割り当て間の空白が増えることになります。

また、x86 の 32 ビット モードでは、4G アドレス空間が重複している可能性があるため、コンテキストの切り替え時にキャッシュをフラッシュする必要があると聞いています。

では、64 ビットの本当のメリットとは何でしょうか?

補足質問ですが、128ビットの方が良いでしょうか?

編集:

初めての 32/64 ビット プログラムを作成しました。16 バイト (32b バージョン) または 32 バイト (64b バージョン) オブジェクトのリンク リスト/ツリーを作成し、stderr に多くの出力を行います。

サイズ: 81128(32b) v 83672(64b) - それほど大きな違いはありません

速度: 17 秒 (32b) v 24 秒 (64b) - 32 ビット OS (OS-X 10.5.8) で実行

アップデート:

64b であるが 32b ポインターを使用する新しいハイブリッド x32 ABI (Application Binary Interface) が開発されていることに注意してください。一部のテストでは、32b または 64b よりもコードが小さくなり、実行が高速になります。

https://sites.google.com/site/x32abi/

4

9 に答える 9

45

通常、x86 と比較して、x86-64 では計算負荷の高いコードで 30% の速度向上が見られます。これは、8 x 32 ビット汎用レジスターと 8 x SSE レジスターではなく、16 x 64 ビット汎用レジスターと 16 x SSE レジスターを使用しているためである可能性が最も高いです。これは、x86-64 Linux 上の Intel ICC コンパイラ (11.1) を使用した場合です。もちろん、他のコンパイラ (gcc など) や他のオペレーティング システム (Windows など) での結果は異なる場合があります。

于 2010-03-04T11:18:30.987 に答える
32

32b アドレッシングで許可されるよりも多くのメモリにアクセスする必要がない限り、メリットはあったとしてもわずかです。

64b CPU で実行している場合、32b または 64b コードを実行しているかどうかに関係なく、同じメモリ インターフェイスが得られます (同じキャッシュと同じ BUS を使用しています)。

x64 アーキテクチャにはより簡単な最適化を可能にするいくつかのレジスタがありますが、これは多くの場合、ポインターが大きくなり、ポインターを含む構造体を使用するとメモリ トラフィックが高くなるという事実によって打ち消されます。32b アプリケーションと比較した 64b アプリケーションの全体的なメモリ使用量の増加は、約 15 ~ 30 % であると見積もっています。

于 2010-03-04T10:43:27.193 に答える
18

利点に関係なく、ライブラリを32ビットバイナリとしてコンパイルして64ビットで提供する場合は、常にシステムのデフォルトのワードサイズ(32ビットまたは64ビット)でプログラムをコンパイルすることをお勧めします。システムでは、64ビットバージョンがデフォルトで使用可能な場合、ライブラリとリンクしたい人は誰でも、ライブラリ(およびその他のライブラリの依存関係)を32ビットバイナリとして提供するように強制します。これは、誰にとっても非常に厄介なことです。疑わしい場合は、ライブラリの両方のバージョンを提供してください。

64ビットの実際的な利点に関して...最も明白なのは、より大きなアドレススペースを取得できることです。したがって、ファイルをmmapすると、一度により多くのアドレスをアドレス指定できます(そしてより大きなファイルをメモリにロードできます)。もう1つの利点は、コンパイラが最適化を適切に実行すると仮定すると、算術演算の多くを並列化でき(たとえば、32ビット数の2つのペアを2つのレジスタに配置し、1回の加算演算で2つの加算を実行する)、大きな利点です。数値の計算はより高速に実行されます。とは言うものの、64ビットと32ビットの違いは、漸近的な複雑さにはまったく役立ちません。したがって、コードを最適化する場合は、このような一定の要素ではなく、アルゴリズムを検討する必要があります。

編集
並列化された加算についての私の声明は無視してください。これは通常のaddステートメントでは実行されません...ベクトル化/SSE命令のいくつかと混同していました。アドレス空間が大きいことを除けば、より正確な利点は、より多くの汎用レジスタがあることです。つまり、変数をに配置する場合よりも、より多くのローカル変数をCPUレジスタファイルに保持でき、アクセスがはるかに高速になります。プログラムスタック(通常、L1キャッシュに出力することを意味します)。

于 2010-03-04T10:36:42.263 に答える
7

私はfoolsmateという名前のチェスエンジンをコーディングしています。(特定の位置から) 深さ 9 までのミニマックス ベースのツリー検索を使用したベスト ムーブの抽出は、次のようになりました。

設定時Win32: ~ 17.0s;

構成に切り替えた後x64: ~ 10.3s;

これは加速の41%です。

于 2019-08-05T12:50:59.710 に答える
5

より多くのレジスタを持つことに加えて、64ビットにはデフォルトでSSE2があります。これは、実際にいくつかの計算を並行して実行できることを意味します。SSE拡張命令には他にも便利な機能がありました。しかし、主な利点は、拡張機能の存在を確認する必要がないことだと思います。x64の場合は、SSE2を使用できます。...私の記憶が正しく私に役立つ場合。

于 2012-12-21T12:55:10.140 に答える
2

アプリケーションを 64 ビットに移行する唯一の理由は、大規模なデータベースや、少なくとも 100 人以上の同時ユーザーがいる ERP アプリケーションなどのアプリケーションでより多くのメモリが必要であり、アプリケーションがパフォーマンスを向上させるためにキャッシュすると、2 GB の制限をすぐに超えてしまうからです。これは特に、integer と long がまだ 32 ビットである Windows OS の場合です (新しい変数 _int64 があります。ポインターのみが 64 ビットです。実際、WOW64 は Windows x64 で高度に最適化されているため、32 ビット アプリケーションは 64 ビット Windows で低いペナルティで実行されます。 OS. Windows x64 での私の経験では、32 ビット アプリケーション バージョンは 64 ビットよりも 10 ~ 15% 高速で実行されます。これは、前者の場合、少なくとも独自のメモリ データベースの場合、b ツリー (データベース システムの最もプロセッサを集中的に使用する部分) を維持するためにポインター演算を使用できるためです。 . 32 ~ 64 ビットのオペレーティング システムで double を使用しても得られない最高の精度を得るために大きな 10 進数を必要とする計算集約型のアプリケーション。これらのアプリケーションは、ソフトウェア エミュレーションの代わりにネイティブで _int64 を使用できます。もちろん、クエリ プランのキャッシュなどに大容量のメモリを使用できるため、大規模なディスク ベースのデータベースでも 32 ビットよりも優れたパフォーマンスが得られます。

于 2012-12-02T03:20:44.693 に答える
1

各メモリフェッチ (32 ビットではなく 64 ビット) ごとにより多くのデータが CPU と RAM 間で転送されるため、64 ビットプログラムは、これを適切に利用するように作成されていれば、より高速になります。

于 2010-03-04T10:39:21.743 に答える
1

x68 から x68_64 への特定のケースでは、64 ビット プログラムはほぼ同じサイズになりますが、わずかに小さくはないにしても、もう少し多くのメモリを使用し、より高速に実行されます。これは主に、x86_64 が 64 ビット レジスタを持っているだけでなく、2 倍のレジスタを持っているためです。x86 には、コンパイルされた言語を可能な限り効率的にするための十分なレジスタがないため、x86 コードは、レジスタとメモリの間でデータをやり取りするために多くの命令とメモリ帯域幅を消費します。x86_64 はそれがはるかに少ないため、必要なスペースが少し少なくなり、より高速に実行されます。x86_64 では、浮動小数点およびビット操作のベクトル命令もはるかに効率的です。

ただし、一般に、64 ビット コードは必ずしも高速であるとは限らず、実行時のコードとメモリの使用量の両方で、通常はサイズが大きくなります。

于 2010-03-04T10:44:04.993 に答える
1

トランスコーディング、表示パフォーマンス、メディア レンダリングなど、CPU の使用を必要とするアプリケーションは、オーディオであれビジュアルであれ、(この時点で) 確かに 64 ビットを必要とし、32 ビットではなく 64 ビットを使用することで利益を得ることができます。それに投げられるデータの量。データが処理される方法であるため、アドレス空間の問題ではありません。64 ビット コードが与えられた 64 ビット プロセッサは、特にトランスコーディングや VoIP データなどの数学的に難しい処理でより優れたパフォーマンスを発揮します。私が間違っていることを証明してください。

于 2015-09-16T09:33:49.917 に答える