7

最新の最適化コンパイラは、ループの展開やコードのインライン化などの特定の最適化をいつ適用するかをどのように決定しますか?

これらは両方ともキャッシングに影響するため、単純に X 行未満の関数をインライン展開したり、その他の単純なヒューリスティックを使用したりすると、パフォーマンスの悪いコードが生成される可能性があります。では、現代のコンパイラはこれをどのように処理するのでしょうか?

これに関する情報 (特に、かなり理解しやすい情報) を見つけるのに苦労しています。詳細、書籍/記事/論文へのリンクは大歓迎です!

編集:答えは主に私が言及した2つの最適化(インライン化とループ展開)について話しているので、これら2つだけでなく、すべてのコンパイラー最適化に興味があることを明確にしたかっただけです。また、事前コンパイル中に実行できる最適化にも関心がありますが、JIT 最適化にも関心があります (程度はわずかですが)。

ありがとう!

4

4 に答える 4

4

通常、とにかく素朴であることによって、それが改善されることを願っています.

これが、ジャスト イン タイム コンパイルが優れた戦略である理由です。統計を収集してから、一般的なケースに合わせて最適化します。

参考文献:

于 2009-11-16T15:11:13.657 に答える
0

スパイラルプロジェクトを見ることができます。

その上、最適化は一般的に行うのが難しいことです。これが、gcc コンパイラーに非常に多くのオプションがある理由の一部です。キャッシュとページについてある程度知っている場合は、いくつかのことを手動で行うことができ、他のことはコンパイラーを介して行うように要求できますが、同じマシンは 2 つとないため、アプローチはアドホックでなければなりません。

于 2009-11-16T15:09:23.040 に答える
0

要するに:私たちよりも優れています!

これを見ることができます:http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf

ディディエ

于 2009-11-16T15:12:07.727 に答える
0

良い質問。いわゆる投機的最適化について質問しています。

動的コンパイラは、静的ヒューリスティックとプロファイル情報の両方を使用します。静的コンパイラは、ヒューリスティックと (オフライン) プロファイル情報を採用しています。最後のものは、PGO (Profile Guided Optimizations) として参照されることがよくあります。

インライン化ポリシーに関する記事はたくさんあります。最も包括的なものは、

Java Just-In-Time コンパイラのメソッドインライン化に関する実証的研究

また、関連する作業への参照と、考慮された記事のいくつかに対する鋭い批判も含まれています (正当化されています)。

一般に、最先端のコンパイラは、投機的最適化を適用する前に、影響分析を使用して潜在的な効果を推定しようとします。

PS ループのアンローリングは古い古典的なもので、数を処理する操作のみを実行するいくつかのタイトなループ (呼び出しなどはありません) にのみ役立ちます。メソッドのインライン化は、最近のコンパイラでははるかに重要な最適化です。

于 2009-11-16T15:28:55.823 に答える