64ビットマシンに32ビットオペレーティングシステムをインストールすると、帯域幅が改善されますか?
質問
Knuth 最近異議を唱えたと64ビットシステム4ギガのメモリに収まるプログラムの場合、「キャッシュの半分を効果的に破棄します」。ポインタは32ビットシステムの2倍の大きさだからです。
私の質問は、32ビットオペレーティングシステムを64ビットマシンにインストールすることで、この問題を回避できますか?また、この場合の利点を実証する帯域幅集約型のベンチマークはありますか?
解決
答えは次のとおりです。はい、ある程度は可能ですが、パフォーマンスの違いはそれほど大きくありません。
これをテストするためのベンチマークでは、多くのポインター解像度を実行する必要がありますが、これはノイズから分離するのが困難です。最適化されないベンチマークを設計することは困難です。 欠陥のあるJavaベンチマークに関するこの記事は、応答として誰かによって投稿されました別の質問ですが、ここで説明されている原則の多くがこれに適用されます。
他のヒント
ここでは、帯域幅は実際には正しい用語ではありません。 Knuthが実際に話していたのは、キャッシュフットプリントに関連するデータ密度です。 16KBのL1データキャッシュがあると想像してください。純粋にポインターを格納する場合は、2 ^ 14/2 ^ 2 = 2 ^ 12 = 4096 32ビットポインターを格納できますが、2048 64ビットポインターしか格納できません。アプリケーションのパフォーマンスが2Kを超えるさまざまなバッファを追跡できることに依存している場合、32ビットアドレス空間から実際のパフォーマンス上の利点が得られることがあります。ただし、ほとんどの実際のコードはこの方法ではなく、キャッシングシステムの実際のパフォーマンスの利点は、多くの場合、一般的な整数および浮動小数点データ構造をキャッシュできることから得られます。ワーキングセットがポインター重視でない場合、64ビットのマイナス面は無視できる程度になり、多くの64ビット整数演算を実行している場合、アップサイドはより明確になります。
Knuthが64ビットシステムに反対したとは思わない。彼は、4GB未満のRAMを持つシステムで64ビットポインターを使用するのはばかげていると言いました(少なくとも、二重リンクリストにあるようなポインターがたくさんある場合)。私は彼に同意すると言うことはできません、ここに取ることができる3つの異なる方法があります。いくつかのIntel Core Duoのように32ビットモードでも実行できる64ビット対応のCPUがあるとします。
1-すべてが32ビット、OS、APPZ、すべてです。したがって、32ビットポインターはありますが、64ビットモードで使用可能な追加のレジスタ/命令を使用することはできません。
2-すべてが64ビット、OS、APPZ、すべて。したがって、64ビットポインターがあり、64ビットモードで使用可能な追加のレジスタ/命令を使用できます。しかし、RAMが4GB未満なので、64ビットポインターの使用はばかげているように思えます。しかし、それですか?
3-OSは64ビットであり、OSは興味深いことに、すべてのコード/データポインターが0x00000000-0xFFFFFFFFの範囲にあることを確認します(仮想メモリ!!!)。 ABIは、メモリ/ファイルに保持されているすべてのコード/データポインターが32ビット幅ですが、ゼロ拡張として64ビットレジスタにロードされるという非常に奇妙な方法で実行されます。ジャンプするコードの場所がある場合、コンパイラ/ ABIは必要な修正を行い、実際の64ビットジャンプを行います。このように、ポインターは32ビットですが、APPZは64ビットにすることができます。つまり、64ビットのレジスターと命令を使用できます。このプロセスはサンクのようなものです。-P
私の結論は::
です3番目のオプションは実行可能に思えましたが、簡単な問題ではありません。理論的には機能しますが、実現可能だとは思いません。そして、私はまた、彼の引用「このようなポインタ値が構造体内に現れると、メモリの半分を無駄にするだけでなく、キャッシュの半分を効果的に捨てる」と思います。誇張されています...
どこかで(x86 CPUで)最適な組み合わせは64ビットOSと32ビットアプリケーションを使用することです。
64ビットOSの場合:
- 4GBを超えるアドレス空間を処理する能力
- データコピー操作に役立つ、より大きなレジスタ
32ビットアプリの場合:
- 小さいポインター
- コンテキストスイッチを節約するためのより少ない、より小さなレジスタ
cons:
- すべてのライブラリを複製する必要があります。 HD空間標準で小さい。
- ロードされたすべてのライブラリがRAMに複製されます。それほど小さくない...
驚くべきことに、モードを切り替えるときにオーバーヘッドは発生しないようです。ユーザースペースのビット数に関係なく、ユーザースペースからカーネルへのブレークには同じコストがかかると思います。
もちろん、大きなアドレス空間の恩恵を受けるアプリケーションもあります。ただし、それ以外の場合は、32ビットのままにしておくと5%のパフォーマンスが得られます。
いいえ、この小さな高速化は気にしません。しかし、「怒る」ことはありません。 64ビットKUbuntuマシンで32ビットFireFoxを実行する(フォーラムで見たように)