2012-02-10 2 views
10

x86-64命令セットは、実行可能コードを合理化するのに役立つレジスタおよびその他の改良を追加します。しかし、多くのアプリケーションでは、増加したポインタサイズは負担です。すべてのポインタの余分な未使用バイトがキャッシュを詰まらせ、RAMをオーバーフローさせることさえあります。たとえば、GCCは-m32フラグでビルドされていますが、これが理由です。x86-64 ISAを搭載した32ビットポインター:どうしてですか?

32ビット値をロードしてポインタとして扱うことは可能です。これは余分な命令を必要とせず、32ビットをロード/計算し、結果のアドレスからロードするだけです。プラットフォームは異なるメモリマップを持っているので、このトリックは移植可能ではありません。 Mac OS Xでは、アドレス空間の下位4 GiB全体が予約されています。それでも、私が書いた1つのプログラムでは、真の64ビットアドレスよりも性能を大幅に向上させたり、-m32でコンパイルしたりする前に、32ビットの「アドレス」に0x100000000Lをハックアップして追加しました。

32ビットx86-64プラットフォームを使用する上で基本的な障害はありますか?このようなキメラをサポートすると、オペレーティングシステムに複雑さが増し、最後の20%を望んでいる人は誰でもMake it Work™を実行する必要がありますが、これはさまざまな計算集約型プログラムに最適です。

+0

多くのアプリケーションでデータをプロファイリングすると、ポインタサイズが大きくなっても大きな損失はないことが示唆されています。 – Puppy

+0

インテル®コンパイラーには、['Qauto-ilp32'](http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32)オプションがあります。 .htm)は、ポインタのために32ビットを使用しようとする(x64モードでも)。 – Mysticial

+0

@Mysticialしかし、これは古くからの 'near'や' far'ポインタのようなものですよね?その解決策はOKですが、私が言及しているものほどきれいではありません。 – Potatoswatter

答えて

10

開発中のLinuxには「x32」というABIがあります。これはx86_64とia32の間のミックスで、完全な64ビットレジスタセットを使用しながら32ビットのアドレス空間を記述するのと同じです。カスタムカーネルのbinutilsとgccが必要です。

一部のSPEC実行は、一部のベンチマークで約30%のパフォーマンス向上を示しています。 https://sites.google.com/site/x32abi/

+0

これは本当に良い情報です。私は質問をすることについて少し不安を感じました。なぜならその言い回しが何らかの良い答えを妨げる可能性があったからです。しかし、ちょうどその違いが十分である場合に備えて、キメラをサポートするプラットフォームが1つだけであっても、競技場は変化します。 – Potatoswatter

-4

これは「x86-32エミュレーション」、またはWindowsのWOW64(おそらく他のOSのもの)と呼ばれ、プロセッサのハードウェアフラグです。ここでユーザーモードのトリックは必要ありません。

+0

これはユーザーがアクセス可能なフラグですか? OSはそれを保存/復元してサポートする必要がありますか? – Potatoswatter

+0

ああ、それを見て - http://en.wikipedia.org/wiki/WOW64。いいえ、それは64ビットOS上の標準のx86コード(ちょうど8つのレジスタを持つ古いISA)を実行しているだけです。 '-m32'とまったく同じです。私は他のOSがその「機能」に名前を付けるのを邪魔しているとは思わない。 – Potatoswatter

+0

@Potatoswatter:それはあなたが正確にどのように記述するのと意味的に違いますか?目的を達成するためにユーザモードのハッキングを行う代わりに、プロセッサはハードウェアでそれを実現します。それはいつもより速くなるでしょう。これを実現するコンパイラフラグはありません。ハードウェアプロセッサの機能です。 – Puppy

0

OSでこのようなモデルをサポートすることは非常に難しいとは思っていません。このモデルのプロセスで変更する必要があるのは、ページ管理だけです。ページは4 GBポイント以下に割り当てる必要があります。カーネルは、仮想アドレス空間の最初の4 GBからバッファをアプリケーションに渡す場合、そのバッファを割り当てなければなりません。同じことが、アプリケーションをロードして起動するローダーにも当てはまります。それ以外にも、64ビットカーネルは大きな変更なしにそのようなアプリケーションを処理できるはずです。

コンパイラのサポートも大きな問題ではありません。これは、余分なCPUレジスタと完全な64ビットを使用し、必要なときにいつでも適切なREXプレフィックスを追加できるコードを生成することが主な問題です。

関連する問題