ビジュアルコールグラフ:VTune Amplifierなど

多くの人は、コールグラフ、「関数呼び出しグラフ」の形式でプログラム構造を表示することを好みます。 このグラフがパフォーマンスプロファイル、「最もホットな」コードブランチを反映している場合は特に興味深いです。



コールグラフは、Intel VTune Amplifier XEを使用して取得できますが、これにはいくつかのユーティリティが必要です。







まず基本的な機能について。 パフォーマンスプロファイルデータの提示は、VTuneアンプの兵器庫で最も強力なものの1つです。 Caller / Calleeタブで呼び出しツリーを調べることができます:







左側には、消費されたCPU時間でソートされたプログラム関数のリストがあります。 今回は、一般と独自に分かれています。 合計時間には、呼び出されたすべての関数が含まれます。 このリストから、どの関数自体が重い計算を実行するか(大きなセルフタイム)、および「ホットな方法」に立つ関数(長い合計時間)を確認できます。 同時に、左側のパネルで、各機能が1回発生します。 コードの異なるブランチで呼び出された場合、合計時間と適切な時間がそれらから合計されます。 そのため、各関数の合計貢献度を決定できます。



この例では、12個の関数の合計時間が最大で、ほぼ同じであり、自己時間はゼロです。 これは、それらのすべてが「ホットロード」上にあり、おそらく相互に原因となっていることを意味します。 この非常に「ホットな方法」を勉強したい場合は、好きな機能をクリックして、右側のパネルを見てください。



右上のパネルには、「up」という一連の呼び出しが表示されます。 すべての呼び出し関数。 ツリーの各関数には、独自の合計時間があります。 ツリーのルート(上部)は、左側のペインで選択された関数です。 左側のもう一方をクリックすると、ツリーが再構築されます。 render_one_pixel関数を選択しましたが、合計時間が長い他の11個の関数のほとんどすべてが同じ呼び出しチェーン内にあることがわかります。 このパネルでは、ツリーを分岐できます。コードの分岐が複数ある場合は、すべてが表示され、すべての分岐にCPU時間が配分されます。



ご想像のとおり、右下のパネルには、呼び出された関数のツリーが描かれています。 つまり 興味のあるノードが多くの合計時間と少しの自己時間を持っているなら、それが呼ぶものを見る価値があります。 上記のスクリーンショットでは、16秒のうち9.5の重要な部分がinitialize_2D_buffer関数に費やされており、残りはトレース関数ブランチからのものです。



視覚的な呼び出しグラフを描く



VTune Amplifier機能とCaller / Calleeビューは、呼び出しツリーをナビゲートし、パフォーマンスに重要な機能を識別するのに十分です。 ただし、一部の人々は、一枚の写真で一度に木全体を見るのが好きです。 これがプロファイラーがデータを提示する方法であり、VTuneは何年も前にデータを提示しました。

ホット関数の呼び出しの分岐ツリーの愛好家には、それを構築する方法があります。



1. VTuneアンププロファイルを取得する



ここではすべてが簡単です-あらゆる結果を収集します。 1つの条件は、スタックが必要であることです。 つまり 詳細レベルが「ホットスポット」の高度なホットスポットは機能しません。スタックはありません。 基本的なホットスポットの簡単な分析は非常に適しています-GUIまたはコマンドラインでコンパイルできます:

amplxe-cl -collect hotspots -result-dir r000hs -- find_hotspots balls.dat
      
      





2.結果をgprofスタイルで出力します



VTuneアンプは、gprofプロファイラー形式でデータを表すことができます。これは、さらなる変換に必要です。 ここでは、すでにコマンドラインが必要です(WindowsとLinuxでも同じです)。

 amplxe-cl -report gprof-cc -result-dir r000hs -format text -report-output r000hs_gprof_cc.txt
      
      









3.結果をGprof2dotでグラフに変換します



ここで、Gprof2dotユーティリティが必要です。 これは、異なるプロファイラーの結果からDOT形式でグラフを作成できるPythonスクリプトです。 ホセ・フォンセカ氏の作成とサポートに感謝します。

スクリプトは、gprofの結果からDOTグラフを作成する方法を知っているだけでなく、VTune Amplifierもサポートしています-コミュニティの貢献者のおかげです。 VTuneとgprofのフォーマットは似ていますが、完全には一致していませんが、パッチを作成する必要がありました。 しかし、主なことは、今ではすべてが機能するということです。 フォーマットとして「ax」を指定し、ステップ2から入力までの出力を出力します。

 python gprof2dot.py -f axe r000hs_gprof_cc.txt
      
      





4. DOTグラフを画像に変換します



ここで別のツールが便利です-Graphviz。 彼はテキスト形式の説明に従ってグラフの視覚イメージを作成します。

 python gprof2dot.py -f axe r000hs_gprof_cc.txt | "c:\Program Files (x86)\Graphviz2.38\bin\dot" -Tpng -or000hs_call_graph.png
      
      





実際、ステップ4にはステップ3が含まれています。

これで、コールツリーを視覚的に確認できるようになりました(画像の一部が表示されています)。





このようなグラフは、関数呼び出しの構造(すべてではなく、最も計算負荷が高い)、およびプロセッサ時間、独自のおよび合計の分布を反映しています。 色が赤くなるほど、関数の負荷が強くなります。 したがって、「ホットウェイ」を観察できます。 欠点は、ツリー全体のサイズが大きくなる可能性があることと、静的な性質です。PNG画像では、VTune Amplifierのようにグループ化、フィルタリング、ソースコードおよびパフォーマンスメトリックの確認ができなくなります。 しかし、誰が何が好きか。



All Articles