32 ビット C++ コードを 64 ビットに移植する - それだけの価値はありますか?なぜ?
-
18-09-2019 - |
質問
x64 アーキテクチャの明らかな利点 (より高いアドレス指定可能な RAM アドレスなど) をいくつか認識しています...しかし:
- 私のプログラムが実際にネイティブ 64 ビット モードで実行する必要がない場合はどうなるでしょうか。とにかく移植する必要がありますか?
- 32 ビットのサポートを終了する予定の期限はありますか?
- 私のアプリケーションはネイティブ x64 コードとしてより高速に、より良く、より安全に実行できるでしょうか?
解決
x86-64では、特殊なケースのビットである - 多くのアーキテクチャについて(。例えばSPARC)、それは収益性の高いメモリの4GB以上を使用することができない限り、64ビットモード用のアプリケーションをコンパイルすると、それを何らかの利益を与えるものではありません。それがないすべては、キャッシュの動作にも影響を与える場合には、実際にのの遅くコードを作ることができ、バイナリのサイズを大きくする。
しかし、x86-64のはあなただけの64ビットのアドレス空間と64ビットの整数レジスタよりも多くを与える - それはまたのレジスタ欠損アーキテクチャ上のx86のような汎用レジスタの数を倍増しますただ再コンパイルして、パフォーマンスの大幅な増加をもたらすことができます。
これはまた、大幅にコードの最適化を向上させることができ、コンパイラは、SSEとSSE2のような多くの拡張は、存在していることを前提としています。
別の利点は、x86-64では、PC相対アドレッシング、有意に位置独立コードを簡略化することができる付加することである。
アプリは、パフォーマンスに敏感でない場合は、しかし、これのどれもがいずれかの本当に重要ではありません。
他のヒント
まだ言及されていない考えられる利点の 1 つは、潜在的なバグを発見する可能性があることです。64 ビットに移植すると、多くの変更が加えられます。一部のデータ型のサイズが変更され、呼び出し規約が変更され、例外処理メカニズム (少なくとも Windows では) が変更されます。
これらすべてにより、隠れていたバグが表面化する可能性があり、それは修正できることを意味します。
コードが正しく、バグがないと仮定すると、64 ビットへの移植は理論的にはコンパイラ スイッチを押すだけで簡単になります。それが失敗した場合、それは言語によって保証されていないものに依存しているため、それらは潜在的なエラーの原因となります。
64 ビットの機能は次のとおりです。
- 64 ビットでは、32 ビット アプリよりも多くのメモリを使用できます。
- 64 ビットでは、すべてのポインターが 64 ビットになるため、コードのフットプリントが大きくなります。
- 64 ビットでは、より多くの整数レジスタと浮動小数点レジスタが提供されるため、メモリへのレジスタのスピルが少なくなり、アプリの速度が多少向上します。
- 64 ビットでは、64 ビット ALU 演算を高速化できます (64 ビット データ型を使用している場合にのみ役立ちます)。
- 追加のセキュリティは得られません(別の回答ではセキュリティについて言及されていますが、そのような利点は知りません)。
- 実行できるのは 64 ビット オペレーティング システムのみに制限されます。
私はいくつかの C++ アプリを移植し、64 ビット コード (同じシステム、同じコンパイラ、唯一の変更は 32 ビットと 64 ビットのコンパイラ モード) で約 10% の高速化を確認しましたが、それらのアプリのほとんどはかなりの量の 64 ビット計算を行っています。YMMV。
32 ビットのサポートがすぐに終了することを心配する必要はありません。
(コメントからのメモを含めるように編集しました - ありがとう!)
が、その真の32ビットのみ64ビットのSKUを持ついくつかのフォームまたは別のは、Windows Server 2008 R2の船でしばらくの間、前後になるだろうということ。より多くのソフトウェアが64ビットに移行するように私は早くもWindows 8のインストールなどのオプションとしてWOW64を見ても驚かないだろう。 WOW64は、インストール、メモリやパフォーマンスのオーバーヘッドです。この移行を奨励するRAM密度の増加に伴い、32ビットのWindowsで3.5ギガバイトのRAMの上限。私はむしろCPUよりも多くのRAMを持っていると思います...
64ビットを抱擁!あなたの32ビットコードを64ビット互換性を持たせるために時間をかけて、そのA非常に簡単でわかりやすいなし。通常のアプリケーションのための変更をより正確にコード修正として説明しています。ドライバーのために選択がある:適応やユーザーを失います。時間が来るとき、あなたは、再コンパイルして、任意のプラットフォーム上で展開する準備ができているよ。
IMO現在のキャッシュ関連の問題は議論の余地があります。このエリアさらに、64ビットの最適化におけるシリコン改良が今後あろう。
- プログラムを 64 ビットで実行する必要がない場合、なぜそうするのでしょうか?メモリに制約がなく、巨大なデータセットがない場合は意味がありません。新型ミアータには大きなタイヤが必要ないため、大きなタイヤは付いていません。
- 32 ビットのサポート (エミュレーション経由のみであっても) は、ソフトウェアが役に立たなくなるとずっと先まで延長されます。私たちは今でも Atari 2600 をエミュレートしていますよね?
- いいえ、おそらく、64 ビット モードではアプリケーションが遅くなります。これは、単にプロセッサのキャッシュに収まる量が少ないためです。もう少し安全かもしれませんが、優れたプログラマーにはそのような松葉杖は必要ありません:)
なぜ Microsoft なのかについての Rico Mariani の投稿 そうではありません Visual Studio の 64 ビットへの移植がまさにそれを要約します ビジュアルスタジオ:64 ビット版がないのはなぜですか?(まだ)
これはあなたのコードは、アプリケーションまたは再利用可能なライブラリであるかどうかに依存します。ライブラリのために、そのライブラリのクライアントは、64ビットモードで実行するには十分な理由を持っていることを覚えておいてください、あなたはあなたのシナリオが動作することを確認する必要があります。彼らはプラグインによって拡張されているとき、これはまた、アプリケーションに適用される場合があります。
あなたは今、任意の実際の必要性を持っていない、とおそらく決して、64ビット・モードのために、あなたは移植しないでくださいべきではないだろう場合。
あなたが今必要はありませんが、いつかそれを持っている可能性がある場合は、あなたが(例えば、すべてそれぞれのコンパイラの警告をオンにすると、64ビットコンパイルを試みることで)それがどのくらいの努力を推定するようにしてください。いくつかのものは、些細ではありませんので、何の問題あなたはおそらく遭遇すると、どのくらいの時間はおそらくそれらを修正するのにかかる方法を知ることが有用であろうことを期待しています。
あなたのプログラムがライブラリー(例えばDLL)であれば、いくつかのホストアプリケーションを移植しますという理由だけで、64ビットモードにポートする必要があります。:必要性にも依存関係から生じる可能性があることをに注意してください。
は、近い将来のために、32ビットアプリケーションがサポートされ続ける。
64 ビットに移行するビジネス上の理由がない限り、64 ビットをサポートする実際の「必要性」はありません。
ただし、他の人がすでに述べたすべてのこととは別に、ある時点で 64 ビットに移行する正当な理由がいくつかあります。
64 ビット以外の PC を購入するのが難しくなってきています。32 ビット アプリは今後何年も互換モードで実行されますが、現在または将来販売される新しい PC はすべて 64 ビットになる可能性があります。ピカピカの 64 ビット オペレーティング システムを使用している場合、互換モードで「臭くて古い 32 ビット アプリ」を実行したくありません。
互換モードでは一部の機能が正しく実行されません。これは、32 ビット ハードウェア上の 32 ビット OS で実行するのと同じではありません。いくつかの問題に遭遇しました(例:互換モードで実行しているときに、32/64 ビットのレジストリ ハイブ全体でのレジストリ アクセス、あるはずのフォルダーにないために失敗するプログラムなど)。互換モードでコードを実行するのはいつも不安です。それは単に「本物ではない」だけであり、それがよく表れます。
コードをきれいに記述した場合は、64 ビット exe として再コンパイルするだけで問題なく動作する可能性が高いため、試してみない理由はありません。
ネイティブ 64 ビット バージョンを早く構築するほど、新しい機能を追加するときに 64 ビットで動作し続けることが容易になります。それは、暗黒時代の中でさらに「n」年間開発を続け、その後光の中に飛び出ようとするよりもはるかに優れた計画です。
次の就職面接に行くときは、64 ビットの経験と 32 から 64 への移植の経験があると言えるでしょう。
、その後、実行ファイル(EXE)ポートはありませんあなたは既にx64の利点(最も重要な増加RAMサイズ)を認識していると、あなたはどんなことに興味はありません。すべてのポインタは今二重の長さが必要であり、これはコードサイズ(いくつかのジャンプ、関数呼び出し、vtableを、仮想呼び出し、グローバルシンボルを含め、どこにでも浸透:通常のパフォーマンスは、主にx86のオーバーx64のモジュールのサイズの増加に、ポートの後に低下しますなどなど)。重大な劣化はありませんが、通常は測定可能である(3-5%の速度低下、多くの要因に依存し)ます。
DLLは、あなたのDLLを消費することができますのx64のアプリで新しい「聴衆」を獲得するため、移植の価値があります。
いくつかのOSや構成は、32ビットプログラムを実行することはできません。最小のLinux 32ビット libcのに、例えばインストールされていません。また、IIRC私は通常のカーネルから32ビットのサポートをコンパイルします。
これらのOSや構成は、あなたの潜在的なユーザーベースの一部である場合は、はい、あなたはポートそれはずます。
あなたはもっとスピードが必要な場合は、、そして、あなたはまた、ポートは(他の人とx86-64では、複数のレジスタと、それをスピードアップクールな指示を持っている、と述べている)必要があります。
あるいは、もちろん、あなたが(のmmap)、またはそうでなければ、大きなファイルや多くのメモリをマップする場合。そして、64ビットに役立ちます。
たとえば、以下のように32ビットコード(GNU Cを/ ++)書かれていた場合 EDIT:書式コード
struct packet {
unsigned long name_id;
unsigned short age;
};
64ビットシステム上で再コンパイル中には、ネットワークのメッセージングのために、あなたは/ ntohlなど、通信はまだ32ビットシステムを使用しているネットワークピアの場合で壊れます(使用しているためhtonlの、移植行う必要がありますあなたと同じコード)。あなたはのsizeof(長い)があまりにもあなたの側で32から64に変更されます知っています。
http://code.googleで32/64移植についてもっと注意を参照してください。 COM / P / effocore /ダウンロード/リストには、名前のEffoCoreRef.pdfを文書化します。
それはあなたが極端なセキュリティ対策やRAMのわいせつな量を必要としない限り、あなたがどんな利益を参照してくださいねということはかなり可能性は低いです。
基本的に、あなたが最も可能性の高いあなたのコードは、64ビットの移植のための良い候補だった場合、直感的に知っていると思います。
期限について。私は、32ビットのようなものは、ネイティブおよび他のいくつかの形式で予見可能な将来のために良いしばらくの間、前後になるだろう、心配しないでしょう。
ここでは、この質問はに私の答えを参照してください。に私が出て閉じましたそのポストは、64ビットのコンピュータは32ビットコンピュータよりもはるかに多くの情報を格納および取得できるという。 、Webブラウジング、電子メールをチェックし、ソリティアをプレイするようなものはすべて32ビットアドレッシングの範囲内で快適に動作するため、ほとんどのユーザーにとって、これは本当に全体の多くを意味するものではありません。どこ本当に輝く64ビットの利点は、あなたがコンピュータを通じ解約しなければならない多くのデータを持っている分野です。デジタル信号処理、ギガピクセル写真と高度な3Dゲームは、データ処理の彼らの膨大な量は、64ビット環境での大きな後押しを見るであろうすべての領域です。
あなたのコードについてはより速く/より良い実行している、それは完全にあなたのコードとそれに課せられた要件次第です。
パフォーマンスの問題に関しては、それは実際にあなたのプログラムに依存します。あなたのプログラムがポインタ集約型である場合は、同じサイズで、CPUのキャッシュのために、各64ビット・ポインタをキャッシュに多くのスペースを占有し、仮想から物理へのマッピングはまた、より多くのTLBのスペースを占有しているため、64ビットへの移植は、パフォーマンスの格下げを引き起こす可能性があり。あなたのプログラムがポインタを多用されていない場合はそれ以外の場合は、その性能はx64の恩恵を受けるます。
もちろん性能の努力を移植などの移植、他の問題のための唯一の理由ではない、タイムスケジュールも考慮しなければならない。
私はあなたが「ネイティブ」で実行されているだけのように、64ビットへの移植をお勧めします。
また、stdint.h
はあなたの親友です!あなたのアプリケーションを移植することで、移植性コーディングする方法を学ぶ必要があります。これは、我々は(うまくいけば数十年で)あまりにも128ビットのプロセッサを持っている場合、右あなたのコードの作業を行います。
私は64ビットに2つのまたは3のものを移植してきましたし、今(あなたがstdint.hを使用している場合は非常に簡単である)の両方のために開発し、64ビットへの移植私の最初のプロジェクトに表示するために2つのまたは3のバグのように発生し、しかし、それはそれでした。そのほとんどは、単純な再コンパイルし、新しいコードを作るとき、私はちょうど自動的に移植性コーディングするので、今、私は32と64ビットの違いについて心配しないでください。 (intptr_tおよびsize_t型などを用いて)
64ビットプロセスから呼び出されるDLLの場合には、その後、DLLは、同様に64ビットでなければなりません。 そして、それはそれはそれは価値があるならば、あなたは、単に選択肢がない問題ではありません。
心に留めておくべき1つの問題は、ソフトウェアライブラリが利用可能です。例えば、私の会社は、複数のOpenGLライブラリを使用するアプリケーションを開発し、私たちはopenSUSEのOS上で行ってください。 OSの古いバージョンでは、1はx86_64のアーキテクチャにこれらのライブラリの32ビット版をダウンロードできます。新しいバージョンでは、しかし、これを持っていません。それは簡単にだけ64ビットモードでコンパイルして作られています。
64ビットコンパイラが成熟になったときに64ビットが、より速く多くのことを実行しますが、それが発生するとき、私は知らない。