プログラムのパフォーマンス解析

第 1 章 パフォーマンスプロファイリングおよび解析ツール

高性能なアプリケーションの開発には、コンパイラ機能、最適化されたルーチンのライブラリ、そしてコードの解析および特定を行うツールが必要です。『プログラムのパフォーマンス解析(このマニュアル)は、アプリケーション開発段階の 3 番目の工程を円滑に進めることができる以下のツール類について解説します。

標本コレクタは、プログラム実行時にそのパフォーマンスデータを収集し、集めたデータをファイルに書き出します。標本アナライザは、そのデータを検査し、グラフィカルに表示します。

標本コレクタと標本アナライザは、以下の Sun WorkShop 製品に含まれています。

ループツールは、自動的に並行化されたプログラムのパフォーマンスのチューニングをサポートします。ループレポートは、ループツールのコマンド行バージョンです。

ループツールとループレポートは、以下の Sun WorkShop 製品に含まれています。

ロック lint は、多重処理/マルチスレッド化アプリケーション開発のためのサポートによって、Sun WorkShop の開発ツールおよびコンパイラを拡張します。

ロック lint は、相互排他的ロックおよび複数読み取り/単一書き込みロックの使用方法についての静的解析を実行し、こうしたロッキング技術の使い方が矛盾している箇所を捜し出します。ロック lint は、以下の Sun WorkShop 製品に含まれています。

prof および gprof は、プロファイルデータを生成するための標準的なツールであり、SPARC プラットフォームおよび x86 プラットフォームの Solaris バージョン 2.5.1、2.6、および 7 に付属しています。

tcov はコードカバレージツールで、 Sun WorkShop に付属しています。

標本解析ツール

Sun WorkShop は、アプリケーションのパフォーマンスデータの収集と、そのデータの解析に合わせて使用する 1 組のツールを提供します。

標本コレクタ

標本コレクタは、Sun WorkShop デバッガからの利用が可能なグラフィカルツールです。アプリケーションを実行すると、標本コレクタはカーネルからパフォーマンスデータを収集します (これを実験と呼びます)。そして、収集したデータをファイルに書き込みます。これは実験レコードと呼ばれます。実験レコードには、資源の使用方法に関するデータ、プログラムのメモリ使用方法に関するデータ、呼び出し先の関数の回数を含むまたは含まない実行プロファイルデータが含まれます。

標本アナライザ

標本アナライザは、標本コレクタによって書き込まれた実験レコードを検証し、それをグラフィカルに表示します。さらに、2 つのユーティリティによって、この実験レコードを ASCII 形式に変換したり (er_export) 、データをファイルやプリンタに出力する (er_print) ことも可能です。

標本解析ツールについては、第 2 章「標本解析ツール」で詳しく解説します。

ループ解析ツール

計算集約的な Fortran アプリケーションにはループレベルの並列化は不可欠であり、ループ内で大量のデータセットに対する計算が処理されます。Sun WorkShop では、FORTRAN 77、Fortran 90、そして C のプログラムの自動並列化機能を介して、こうした並列化を利用できます。プログラム中のループを並列化するには、コンパイラを使用します。そして、FORTRAN 77、Fortran 90、C コンパイラによって並列化されたループの検証には、ループツールまたはループレポートを使用します。

ループツール

ループツールは、Fortran または C コンパイラによってループ解析用にコンパイルされたプログラムによって生成されるループタイミングファイルを読み込むグラフィカルな分析ツールです。ループツールによって、以下の解析が可能となります。

ループツールはループ実行時間のグラフを表示し、どのループが並列化されているかを識別します。この表示画面からどのループのソースコードにも直接移動することが可能です。

ループツールを使用するには、-Zlp オプションを指定してプログラムをコンパイルします。-Zlp オプションを指定してコンパイルされたこのプログラムを実行すると、Sun WorkShop はループタイミングファイルを生成します。その後、ループツールを実行し、このタイミングファイルを読み込み、その結果を表示します。Sun WorkShop には、vgam という名前のデモンストレーション用プログラムと vgam.looptimes という名前のデモンストレーション用タイミングファイルが用意されています。Sun WorkShop の「ツール」メニューからループツールを起動すると、これらのファイルの結果が表示されます。これらのデモを利用して、ループツールの機能に慣れることもできますし、すでに -Zlp オプションを指定してコンパイルしたプログラムが手元にある場合は、そのファイルを指定することも可能です。ループツールについては、第 3 章「ループ解析ツール」で解説します。

ループレポート

ループレポートは、ループツールのコマンド行バージョンです。ループレポートは、グラフィカルな表示ではなく、ループ時間に関する ASCII ファイルを作成します。ループレポートについては、第 3 章「ループ解析ツール」で解説します。

ロック解析ツール

C 開発者は、ほとんどの場合、libthread ライブラリを介した Solarisのユーザーレベルスレッドに対する直接プログラミングによって、アプリケーションをスレッド化できます。Sun WorkShop アプリケーションでは、デバッガに対してマルチスレッド化された拡張機能部分を実行することで、Solarisのユーザーレベルスレッドを利用したプログラムのデバッグが可能となります。また、ロック lint を使用することにより、プログラム中で使用されているロックの整合性や、潜在的な競合状態の有無などを静的にチェックできます。

マルチスレッド化されたアプリケーションでは、スレッドは、共有しているデータに関連したロックの獲得および解放を行う必要があります。スレッドが適切なロックの獲得および解放に失敗した場合、プログラムが同じ入力に対して異なる実行結果を生む原因となります。こうした状況は 「データ競合」 として知られています。データ競合は、簡単に陥りやすい問題ですが、その発見はとても困難です。

また、さまざまなスレッドが解放されることのないロックを待ち続けると、プログラムは 「デッドロック」 状態に陥ることがあります。デッドロックの定義については、「基本概念」を参照してください。

Sun WorkShop は、ロックおよびその使われ方を解析するコマンド行ユーティリティを提供します。ロック lint は、相互排他的ロックおよび複数読み取り/単一書き込みロックの使い方に矛盾がある箇所を捜し出します。ロック lint は、変数にアクセスしている最中に、適切なロックの保持に失敗するなどの、一般的なデータ競合の原因を検出します。また、デッドロックの一般的な原因も検出します。

ロック lint が使用する情報を収集するには、C コンパイラに対して -Zll オプションを指定し、それぞれの .c ソースコードファイルごとに .ll ファイルを生成します。.ll ファイルには、各関数の制御の流れや、相互排他的ロックおよび読み取り側/書き込み側ロックにおけるオペレーションあるいは変数へのアクセスに関する情報が含まれます。

ロック lint については第 5 章「ロック解析ツール」で解説します。

従来のプロファイリングツール

Sun WorkShop には、プログラムに関するデータのレポートを作成する3種類のコマンド行レベルのユーティリティが含まれています。

スレッド化された(自動並列化も含む)プログラムに関する情報の収集、表示には、profgprof を使用します。これらのツールは、解析の対象となるプログラムのさまざまなレベルのフィードバックを提供します。これらのツールはほかのユーティリティやコンパイラオプションと組み合わせることで、パフォーマンスデータの収集および利用を行います。prof はフラットファイル形式でプログラムプロファイルを生成します。gprof はコールグラフプロファイルを生成します。tcov は、ソースファイルのコピーに対して、どの行がどの程度の頻度で利用されているかについて説明するステートメントレベルの情報を生成します。

これらのツールについては、第 4 章「従来のプロファイリングツール」で解説します。