32ビット版よりも大きく、速く、64ビットのプログラムはありますか?

StackOverflow https://stackoverflow.com/questions/2378399

質問

私は、私は、x86に焦点を当てていたとしますが、私は一般的に32〜64ビットからの移動に興味を持っています。

プログラムはそう大きいことがあるので、

は論理的には、私はその定数やポインタを参照することができ、いくつかのケースでは、大きくなります。そして、効率のためにワード境界にメモリを割り当てるための欲求が割り当て間以上の空白を意味します。

私もx86での32ビットモードは、文脈が可能重なり合う4Gのアドレス空間のために切り替えたときにそのキャッシュをフラッシュするために持っていると聞いています。

だから、64ビットの真のメリットは何ですか?

および補足質問として、128ビットはさらに良いでしょうか?

編集ます:

私はちょうど私の最初の32/64ビットプログラムを書かれています。これは、リンクリスト/ 16バイト(32B版)または32バイト(64Bバージョン)の木を作るオブジェクトとstderrへの印刷の多くを行う - は本当に有用なプログラムではなく、典型的な何かが、それは私の最初の

サイズ:81128(32b)は、V 83672(64B) - ので、あまり違い

速度:17S(32B)のV 24S(64B) - 32ビットOS(OS-X 10.5.8)上で実行されている

アップデートます:

私は、新しいハイブリッドx32のABI(アプリケーションバイナリインタフェース)64bとが、用途32bのポインタがあるが開発されていることに注意してください。いくつかのテストのために、より小さなコード及び32B又は64Bのいずれかよりも速い実行を生じます。

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

役に立ちましたか?

解決

あなたがアクセスし32Bのアドレッシングがあなたをできるようになるとより多くのメモリを必要としない限り、もしあれば、利点は、小さくなります。

64bのCPU上で実行している場合は、あなたが(あなたが同じキャッシュと同じバスを使用している)32Bや64Bのコードを実行している場合、あなたは関係なく、インターフェイスに同じメモリを取得ます。

x64アーキテクチャを簡単に最適化を可能にするいくつかのより多くのレジスタを有しているが、これは多くの場合、事実ポインタによって相殺されたが、今大きく、高いメモリトラフィック内のポインタの結果を任意の構造を使用します。私は約15から30パーセントであると32Bものに比べ64Bアプリケーションの全体的なメモリ使用量の増加を推定することになる。

他のヒント

Iは、典型的には、x86のに比べx86-64の上の計算集約型コードの30%の速度向上を参照します。これは、我々は16×64ビットの汎用レジスタと16×SSEレジスタの代わりに、8×32は、汎用レジスタと8×SSEレジスタのビットを持っているという事実のために最も可能性が高いです。これは、x86-64のLinux上でインテルICCコンパイラ(11.1)である - 他のコンパイラとの結果(例えばGCC)、または他のオペレーティングシステム(例えばWindowsの場合)で、もちろん異なる場合があります。

に関係なく給付の、私はあなたが常にシステムのデフォルトのワードサイズのためのプログラムをコンパイルすることを示唆している(32ビットまたは64ビット)、以来、あなたは、32ビットのバイナリとしてライブラリをコンパイルし、Aの上にそれを提供する場合64ビットシステム64ビット版が使用可能なデフォルトであるとき、あなたは、32ビットのバイナリとして自分のライブラリーを提供するために、あなたのライブラリとリンクしたい人(および他のライブラリの依存関係を)強制されます。これは、誰のために非常に迷惑することができます。疑いで、あなたのライブラリーの両方のバージョンを提供する場合。

は、64ビットの実用的な利点については...最も明白なのでmmapのファイルならば、一度にそれをより対処することができます(とメモリに大きなファイルをロードする)、あなたはより大きなアドレス空間を得ることです。別の利点は、(例えば、二つのレジスタの32ビット数の二対を配置し、両者を実行する単一の追加操作で追加)コンパイラは、最適化の良い仕事をしていませんと仮定して、あなたの算術演算の多くは、並列化することができる、ということであり、大きな数の計算は、より迅速に実行されます。全体の64ビットから32ビットのもの対、言ったあなたのコードを最適化するために探しているそうだとすれば、あなたはおそらくアルゴリズムを見ているというよりも、このような一定の要因べきである、すべての漸近的複雑さであなたを助けにはなりません。

編集
並列化に加えについての私の文を無視してください。これは、通常の追加文によって行われていない...私はベクトル化/ SSE命令の一部であることを混乱されました。より正確な利点は、脇に大きなアドレス空間から、あなたが変数を配置する場合よりも多くのローカル変数は、アクセスにはるかに高速であるCPUのレジスタファイル、に維持することができることを意味する、より多くの汎用レジスタがあるということです(通常はL1キャッシュに出かける意味)プログラム・スタックます。

は複数のレジスタを有することに加えて、64ビットはデフォルトでSSE2を有しています。この手段は、あなたは確かに並行して、いくつかの計算を実行できること。 SSEの拡張は、あまりにも他のグッズを持っていました。しかし、私は主な利点は、拡張の有無を確認する必要がされていないと思います。それはx64のなら、それはSSE2が利用可能です。 ...私の記憶が正しく私を提供する場合。

64ビットにアプリケーションを移動するための唯一の正当化は、アプリケーションがパフォーマンス向上のためにキャッシュしたときに2ギガバイトの制限はかなり迅速に超過される同時ユーザーの少なくとも数百を持つ大規模なデータベースやERPアプリケーションなどのアプリケーションでより多くのメモリが必要です。これは、特別に整数と長いが、まだ32ビット(彼らは新しい変数_int64を持っている。ポインタのみが64ビットです。実際にはWOW64は高度のWindows x64の上で最適化されている32ビットアプリケーションは、64ビットのWindows上の低ペナルティで実行ので、ということであるのWindows OS上ケースですOS前者の場合には、少なくとも独自のメモリデータベースにあなたはBツリーを維持するためのポインタarithmaticを使用することができるので。Windowsのx64の上の私の経験では、(データベースシステムの最もプロセッサ集約部分)10から15パーセント高速化64ビットよりも32ビットのアプリケーションのバージョンで実行されます。32から64ビットオペレーティングシステム上でダブルによってもたらさない最高の精度のための大規模な小数を必要としている。これらのアプリケーションではなく、ソフトウェアエミュレーションでネイティブに_int64を使用することができますCompuatation多用するアプリケーションを。もちろん、大規模なディスクベースのデータベースはまた、単に32ビットを超える改善が表示されます問い合わせ計画をキャッシュするための大容量メモリを使用する能力など。

より多くのデータがこのように64ビットプログラムが速く、彼らが適切にこれを利用するように書かれている提供することができる、(32 64ビットの代わりに)フェッチ各メモリ用のCPUとRAMとの間で転送されます。

はx68_64にX68の特定の場合には、64ビットプログラムは、ほぼ同じサイズであり、そうでない場合はわずかに小さく、少しより多くのメモリを使用し、より速く実行されます。 x86_64版は、ちょうど64ビットレジスタを持っていないため、ほとんどの場合、これは、それはまた、多くの倍あります。 x86のは、x86コードは、レジスタとメモリの間で前後に命令とメモリ帯域幅のシフトデータの多くを費やしているので、彼らは、可能性として、効率的なとしてコンパイル言語を作るのに十分なレジスタを持っていません。 x86_64版は、はるかに少ないというのがあり、それが少し速く、より少ないスペースおよび実行を取るようにします。浮動小数点とビットいじるベクトル命令はx86_64の中でも、はるかに効率的です。

は一般的に、しかし、64ビットコードは必ずしも速くないが、両方の実行時にコードとメモリ使用量のために、通常は大きくなる。

このようなトランスコーディング、表示性能とメディアレンダリングとしてCPU使用率を必要とするアプリケーションは、それがオーディオ又はビジュアルであるかどうか、確かに(この時点で)が必要であろうとにより対処するCPUの能力を32ビット対64ビットを使用することから恩恵データの膨大な量でそれでスローされます。それは、データが取り扱われている方法であるように、それはそんなにアドレス空間の問題ではありません。 64ビットコード与えられた64ビットプロセッサは、特に、データをトランスコードし、VoIPのような数学的に難しいことで、より良い実行しようとしている - 実際には、「数学」アプリケーションの任意の並べ替えは、64ビットCPUとオペレーティングシステムの利用によって利益を得なければなりません。私が間違っていることを証明ます。

私はチェスエンジンをコーディングしています。 (特定の位置から)の深さ9ミニマックスベースの木探索を使用して最善手の抽出は、Win32の設定に〜17.0sを取ったとx64に切り替えた後、それは今〜10.3sかかります。これは加速度の41%です!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top