2009-08-04 42 views
19

GCCで-fno-strict-aliasingを指定したため、パフォーマンスを示すベンチマークがありますか(または他のコンパイラでは 相当)。-fno-strict-aliasingのパフォーマンスへの影響

+1

正確な重複:http://stackoverflow.com/questions/754929/strict-aliasing – GManNickG

+7

このディスカッションではパフォーマンスに関する数値は見つかりませんでした。私はいくつかのテスト結果/データを探しています。私は何か見落としてますか? – Carlos

+0

FWIW、受諾された回答にはパフォーマンス数値はありません。 – peterchen

答えて

19

異なるコンパイラがさまざまなレベルの侵略でそれを実装するので、それはコンパイラごとに大きく異なります。 GCCはそれに対してかなり積極的です:厳密なエイリアシングを有効にすると、人間と「明らかに」同等のポインタ(別名:foo* a; bar * b; b = (foo*)a;)はエイリアスできなくなりますが、非常に積極的な変換が可能ですが、書かれたコード。 AppleのGCCは、この理由からデフォルトで厳密なエイリアスを無効にしています。

LLVMと対照的に、には厳密なエイリアシングがありません。また、計画されている間に、同値性を判断できない場合はフォールバックケースとして実装する予定です。上の例では、aとbを同等と判断します。他の方法で関係を判断できない場合は、タイプベースのエイリアシングしか使用しません。

私の経験では、厳密なエイリアシングのパフォーマンスへの影響は、ループインバリアントコードモーションと関係しています。ループインバリアントコードモーションは、ループ内のロードが反復される配列のエイリアスを起こさないことを証明するためにループから引き出される。 YMMV。

+5

LLVMのアプローチは私にとって正しいもののように聞こえます – Spudd86

10

PS3で大規模なプロジェクトでこれをテストしたところ、多くのレジスタが実際にSAのメリットを享受できるアーキテクチャなので、PowerPCはあなたが見たい最適化一般的に非常にローカルになり(スコープが賢明)、小さくなる。 20MBの実行可能ファイルでは、おそらく.textセクション(=コード)の80kbを削り取りました。これはすべて小さなスコープの&ループにあります。

このオプションを使用すると、生成されたコードを今より軽量で最適化することができます(1〜5%の範囲で考える)が、大きな結果は期待できません。したがって、-fno-strict-aliasingを使用した場合の影響は、おそらくパフォーマンスに大きな影響を与えないでしょう。つまり、-fno-strict-aliasingが必要なコードを持つことは、せいぜい最適以下の状況です。

+1

コードサイズ==速度ですか?あなたのPS3の例はここにもそこにもありません。どうやって走りましたか? – Eloff

+0

どこが速いのですか?潜在的なロード/ストアが省略されていることを考えると、想像を絶することはできません。いずれの場合でも、メモリにバインドされたマシンでは、実行可能ファイルのサイズが小さい方が適しています。それはここにあり、そこにもあります。 – nielsj

+0

OPはパフォーマンスの影響を尋ねました。コードサイズについてのみ議論しました。次に、大きなパフォーマンスの違いが見られない理由について、実際の議論を使っています。そして、あなたはLinuxカーネルを「最適ではない状況に最適」と呼んでいました。私はあなたがdownvoteを持っている理由を見ることができると思います。 – Eloff

5

ここでは、2004年に実施された研究へのリンクがあります。http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1124&context=ecetrは、とりわけ、コードパフォーマンスに対する厳密なエイリアシングの影響に関するものです。図2.5は、3%〜10%の相対的な改善を示しています。

パフォーマンス低下の研究者説明:

アセンブリコードを検査するから、私たちは、劣化が レジスタ割り当てアルゴリズムの効果であることがわかりました。 GCCは、グラフの色付けレジスタアロケータ[2、3]を実装しています。厳密なエイリアシングを使用すると、変数の有効範囲が長くなり、高いレジスタ圧と '流出'につながります。より控えめなエイリアシングでは、同じ変数には、(短い)ライブ範囲の終わりにメモリ転送が発生します。

[2] Peter Bergner、Peter Dahl、David Engebretsen、Matthew T. O'Keefe。こぼれたコード 干渉領域のスピリングによる最小化。 SIGPLANのプログラミングに関する会議 言語の設計と実装、287-295、1997年。

[3] Preston Briggs、Keith D. Cooper、およびLinda Torczonグラフの色付けの改善 レジスタの割り当て。プログラミング言語とシステムに関するACMトランザクション、 16(3):428-455、1994年5月。

+0

厳密なエイリアシング*で許される最適化の価値を見ている研究について知っていますか? 'restrict'修飾子*によっても達成できませんでしたか? – supercat

+0

私はこれらの要件を満たす最適化について知っていますか? – SzymonPajzert

+0

'restrict'修飾子は、静的持続時間オブジェクトがエイリアスにならないことをコンパイラに伝えるために効果的に使用することはできません。また、プログラムは、互いにエイリアスする可能性のある同じ型への複数の関連するポインタを持つことがあります。タイプベースのエイリアシングは、そうでなければ利用できないような場合に最適化を可能にします。 IMHOでは、より良い修飾子を追加することで、このようなケースをよりよく扱うことができました(例えば、オブジェクトが外部コードに公開される可能性がある場合に 'register'修飾子を使用できますが、 )。 – supercat

関連する問題