21

A、B、および C の 3 つの関数で構成されるコンパイル ユニットがあるとします。A は、コンパイル ユニットの外部の関数から 1 回呼び出されます (たとえば、エントリ ポイントまたはコールバック)。B は A によって何度も呼び出されます (たとえば、タイトなループで呼び出されます)。C は、B の呼び出しごとに 1 回呼び出されます (たとえば、ライブラリ関数です)。

A を通過する (B と C を通過する) パス全体はパフォーマンスが重要ですが、A 自体のパフォーマンスは重要ではありません (ほとんどの時間が B と C で費やされるため)。

__attribute__ ((hot))このパスをより積極的に最適化するために注釈を付ける必要がある関数の最小セットは何ですか? を使用できないと仮定します-fprofile-generate

同様__attribute__ ((hot))に、「この関数の本体を最適化する」、「この関数の呼び出しを最適化する」、「この関数が行うすべての子孫呼び出しを最適化する」、またはそれらの組み合わせを意味しますか?

GCC の情報ページでは、これらの質問に明確に対応していません。

4

1 に答える 1

22

公式文書:

hot 関数の hot 属性は、その関数がコンパイル済みプログラムのホット スポットであることをコンパイラに通知するために使用されます。関数はより積極的に最適化され、多くのターゲットでテキスト セクションの特別なサブセクションに配置されるため、すべてのホットな関数が近くに表示され、局所性が向上します。-fprofile-use を介してプロファイル フィードバックが利用可能な場合、ホットな機能が自動的に検出され、この属性は無視されます。

関数の hot 属性は、4.3 より前の GCC バージョンでは実装されていません。

ラベルの hot 属性は、ラベルに続くパスがそれほど注釈されていないパスよりも可能性が高いことをコンパイラに通知するために使用されます。この属性は、__builtin_expect を使用できない場合 (たとえば、computed goto または asm goto など) に使用されます。

ラベルの hot 属性は、4.8 より前の GCC バージョンでは実装されていません。

2007年

 __attribute__((hot))   

マークされた関数が「ホット」であり、より積極的に最適化するか、他の「ホット」関数の近くに配置する必要があることを示します (キャッシュの局所性のため)。

ギラッド・ベン=ヨセフ

その名前が示すように、これらの関数属性は、対応する関数がコード内で頻繁に呼び出される (ホット) か、めったに呼び出されない (コールド) ことをコンパイラーに示唆するために使用されます。

次に、コンパイラは、実行される分岐がホットな関数を呼び出す可能性が高いという仮定の下で、これらのホットな関数を呼び出す分岐を優先し、コールドな関数を嫌うように、if ステートメントなどの分岐内のコードを順序付けることができます。冷たいものと呼ぶ可能性は低くなります。

さらに、コンパイラは、生成されたバイナリの特別なセクションでホットとしてマークされた関数をグループ化することを選択できます。これは、データと命令のキャッシュが局所性、または関連するコードとデータの相対距離に基づいて機能するため、すべての関数を一緒に呼び出すことが多いため、アプリケーション全体のコードのキャッシュが改善されます。

hot 属性の適切な候補は、コード ベースで非常に頻繁に呼び出されるコア関数です。エラーが発生した場合にのみ呼び出される内部エラー処理関数は、cold 属性の適切な候補です。

したがって、これらの情報源によると、次のことを__attribute__ ((hot))意味します。

  • この関数への呼び出しを最適化する
  • この関数の本体を最適化する
  • この関数の本体を.hotセクションに配置します (すべてのホット コードを 1 つの場所にグループ化するため)

(lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl))ソースコード分析の後、「ホット」属性は;でチェックされていると言えます。true の場合、関数は( predict.c, compute_function_frequency()node->frequency ) に設定され ます。NODE_FREQUENCY_HOT

関数の頻度が の場合NODE_FREQUENCY_HOT

  • プロファイル情報がなくlikely/unlikely、分岐がない場合maybe_hot_frequency_p は、関数に対して true を返します (== "...頻度 FREQ はホットと見なされます。")。これによりmaybe_hot_bb_p、関数内のすべての基本ブロック (BB) の値が true になり (「BB は CPU を集中的に使用する可能性があり、最大のパフォーマンスを得るために最適化する必要があります。」) maybe_hot_edge_p、関数内のすべてのエッジで true になります。次に、非-Osモードでは、これらの BB とエッジ、およびループも、サイズではなく速度に対して最適化されます。

  • この関数からのすべてのアウトバウンド コール エッジに対して、cgraph_maybe_hot_edge_ptrue を返します (「コールがホットである可能性がある場合は true を返します。」)。このフラグは IPA (ipa-inline.c、ipa-cp.c、ipa-inline-analysis.c) で使用され、インラインおよびクローニングの決定に影響を与えます

于 2013-02-22T23:05:35.130 に答える