Oracle Solaris Studio ソフトウェアには、相互に連携する一連の高度なパフォーマンスツールおよびユーティリティーが備わっています。コレクタ、パフォーマンスアナライザ、スレッドアナライザ、および er_print ユーティリティーは、コードのパフォーマンスを評価し、潜在的なパフォーマンスの問題を識別し、問題が発生するコードの部分を特定するために役立ちます。これらのツールをまとめてパフォーマンスアナライザツールといいます。
Oracle Solaris Studio の C、C++、および Fortran コンパイラのオプションを使用して、ハードウェアと、プログラムのパフォーマンスを向上させる高度な最適化テクニックをターゲットにすることができます。パフォーマンスアナライザツールは、Oracle Sun ハードウェア上でコンパイラとともに使用できるようにも設計されていて、Oracle Sun マシン上で実行する場合のプログラムのパフォーマンスを向上させるのに役立ちます。
パフォーマンスアナライザツールでは、収集されるデータをより精密に制御し、データをより深く検査し、プログラムとハードウェアの相互の関連性を調べることができます。パフォーマンスアナライザツールは、現在の Oracle Sun ハードウェアで実行されている、複雑なコンピュートインテンシブアプリケーション向けに設計されており、それらのアプリケーションでテスト済みです。
パフォーマンスアナライザツールは、OpenMP 並列アプリケーションおよび MPI ベースの分散アプリケーションのプロファイリング機能も備えているため、それらのテクノロジをアプリケーションで効果的に使用しているかどうかを判別できます。
パフォーマンスアナライザツールを使用するには、2 つの手順を実行する必要があります。
パフォーマンスアナライザでターゲットアプリケーションをプロファイルするか、collect コマンドを使用してターゲットアプリケーションからパフォーマンスデータを収集します。
パフォーマンスアナライザのグラフィカルツール、er_print コマンド行ユーティリティー、またはスレッドアナライザのグラフィカルツールでデータを調べて、マルチスレッドアプリケーションでのデータの競合およびデッドロックを検出します。
コレクタは、プロファイリングを使用し、関数呼び出しをトレースすることによってパフォーマンスデータを収集します。このデータには、呼び出しスタック、マイクロステートアカウンティング情報 (Oracle Solaris プラットフォームのみ)、スレッド同期遅延データ、ハードウェアカウンタのオーバーフローデータ、MPI (Message Passing Interface) 関数呼び出しデータ、メモリー割り当てデータ、およびオペレーティングシステムとプロセスのサマリー情報が含まれる可能性があります。コレクタは C、C++、および Fortran プログラムのあらゆる種類のデータと、Java プログラミング言語で記述されたアプリケーションのプロファイリングデータを収集できます。コレクタは、collect コマンドを使用して、またはパフォーマンスアナライザの「アプリケーションのプロファイル」ダイアログから、あるいは dbx デバッガの collect サブコマンドを使用して実行できます。
Oracle Solaris Studio IDE のプロファイリングツールも、コレクタを使用して情報を収集します。
collect コマンドでデータを収集するには:
% collect [collect-options] executable executable-options
collect コマンドにオプションを付けて、収集するデータの種類を指定できます。たとえば、–i on オプションを指定すると、コレクタが入出力トレースを実行します。実行可能ファイルの後ろに引数を指定することによって、ターゲットの実行可能ファイルに引数を渡すことができます。
コレクタは、デフォルトで test.1.er という名前のデータディレクトリを作成しますが、コマンド行で別の名前を指定できます。test.1.er ディレクトリは実験と呼ばれ、その名前はツールによって実験として認識されるように、常に .er で終わる必要があります。
次のコマンドは、synprog プログラムに対して collect を使用する方法を示しています。
% collect synprog Creating experiment database test.1.er (Process ID: 11103) ... 00:00:00.000 ===== (11103) synprog run 00:00:00.005 ===== (11103) Mon 22 Sep 14 17:05:51 Stopwatch calibration OS release 5.11 -- enabling microstate accounting 5.11. 0.000096 s. (22.4 % of 0.000426 s.) -- inner N = 1000, avg = 0.096 us., min = 0.090, max = 0.105 0.000312 s. (67.0 % of 0.000466 s.) -- outer N = 1000, avg = 0.312 us., min = 0.307, max = 0.457 00:00:00.006 ===== (11103) Begin commandline icpu.md.cpu.rec.recd.dousl.gpf.fitos.uf.ec.tco.b.nap.sig.sys.so.sx.so 00:00:00.006 ===== (11103) start of icputime 3.003069 wall-secs., 2.978360 CPU-secs., in icputime 00:00:03.009 ===== (11103) start of muldiv 3.007489 wall-secs., 2.997647 CPU-secs., in muldiv 00:00:06.017 ===== (11103) start of cputime 3.002315 wall-secs., 2.989407 CPU-secs., in cputime 00:00:09.019 ===== (11103) start of recurse 3.082371 wall-secs., 3.069782 CPU-secs., in recurse ... (output edited to conserve space) ...
データは test.1.er ディレクトリに格納され、パフォーマンスアナライザまたは er_print を使用して表示できます。
ダウンロード可能なサンプルアプリケーションにパフォーマンスアナライザを使用するステップごとの手順については、Oracle Solaris Studio 12.4: パフォーマンスアナライザチュートリアル を参照してください。
プロファイリングアプリケーション、およびコレクタの使用方法の詳細については、パフォーマンスアナライザの「ヘルプ」メニュー、Oracle Solaris Studio 12.4: パフォーマンスアナライザ マニュアル、および collect(1) のマニュアルページを参照してください。
パフォーマンスアナライザを使用すると、アプリケーションの動作について深い理解が得られ、コード内の問題のある部分を見つけることができます。パフォーマンスアナライザは、もっともシステムリソースを使用している関数、コードセグメント、およびソース行を特定します。パフォーマンスアナライザは、シングルスレッド、マルチスレッド、およびマルチプロセスのアプリケーションをプロファイルし、アプリケーションのパフォーマンスを改善できる箇所を特定するために役立つプロファイリングデータを提供できます。
パフォーマンスアナライザは analyzer コマンドで実行できます。パフォーマンスアナライザを起動するための analyzer コマンドの基本構文です。
% analyzer [experiment-list]
experiment-list は、コレクタによって収集された実験の 1 つまたは複数のファイル名です。複数の実験をロードする場合は、名前をスペースで区切って指定します。パフォーマンスアナライザは、複数の実験に対して起動された場合、デフォルトでは実験データをまとめますが、コマンド行で実験名の前に –c オプションを指定すると、実験を比較するためにも使用できます。
コマンド行に実験を指定しないと、パフォーマンスアナライザの「ようこそ」画面が表示され、そこから作業を開始できます。
パフォーマンスアナライザで実験 test.1.er を開くには:
% analyzer test.1.er
実験の初期のビューは「概要」であり、プログラムによって使用された時間およびリソースの簡単な概要が表示され、パフォーマンスデータのビューに表示するパフォーマンスメトリックを選択できます。
次の図は、synprog の例で行われた test.1.er 実験についての、パフォーマンスアナライザの「関数」ビューを示しています。「関数」ビューには、synprog プログラムの各関数によって使用される CPU 時間が表示されます。関数 gpf_work をクリックすると、 gpf_work 関数のリソース使用状況の詳細が右側の「選択の詳細」タブに表示されます。「関数」ビューの下部の「呼び出し元/呼び出し回数」領域には、gpf_work によって呼び出された関数が表示され、呼び出しをダブルクリックすると「関数」ビューのそれらの関数に移動できます。
パフォーマンスアナライザの使用方法については、Oracle Solaris Studio 12.4: パフォーマンスアナライザ マニュアル、パフォーマンスアナライザの統合ヘルプ、および analyzer(1) のマニュアルページを参照してください。
ダウンロード可能なサンプルアプリケーションにパフォーマンスアナライザを使用するステップごとの手順については、Oracle Solaris Studio 12.4: パフォーマンスアナライザチュートリアル を参照してください。
er_print ユーティリティーは、「タイムライン」表示、「MPI タイムライン」表示、および「MPI チャート」表示を除き、パフォーマンスアナライザで提供される表示のほとんどをプレーンテキストで提供します。
er_print ユーティリティーを使用して、関数、呼び出し元と呼び出し先、呼び出しツリー、ソースコードリスト、逆アセンブリリスト、標本収集情報、データ空間データ、スレッド分析データ、および実行統計のパフォーマンスメトリックを表示できます。
er_print コマンドの一般的な構文です。
% er_print -command experiment-list
1 つまたは複数のコマンドを指定して、表示するデータの種類を示すことができます。experiment-list は、コレクタによって収集された実験の 1 つまたは複数のファイル名です。er_print は、複数の実験について起動された場合、デフォルトでは実験データをまとめますが、実験を比較するためにも使用できます。
次の例は、プログラムの関数情報を表示するためのコマンドを示しています。表示されている出力は、このドキュメントの前のセクションにあるパフォーマンスアナライザのスクリーンショットで使用されたのと同じ実験のものです。
% er_print -functions test.1.er Functions sorted by metric: Exclusive Total CPU Time Excl. Incl. Name Total Total CPU sec. CPU sec. 50.806 50.806 <Total> 5.994 5.994 so_burncpu 5.914 5.914 real_recurse 3.502 3.502 gpf_work 3.012 3.012 sigtime_handler 3.002 3.002 bounce_a 3.002 3.002 cputime 3.002 3.002 icputime 2.992 2.992 sx_burncpu 2.992 2.992 underflow 2.792 2.792 muldiv 2.532 2.532 my_irand 1.831 1.831 gethrtime 1.031 1.991 tailcall_b 0.961 0.961 inc_middle 0.961 0.961 tailcall_c 0.941 0.941 gethrvtime 0.941 0.941 gettimeofday 0.911 2.902 tailcall_a 0.801 0.801 dousleep 0.650 0.650 inc_entry 0.640 0.640 inc_exit 0.480 3.012 fitos 0.330 0.330 inc_func 0.320 0.320 inc_body 0.320 0.320 inc_brace 0.290 4.003 systime 0.260 0.260 ext_macro_code lines deleted
er_print を起動するときに実験名を指定して、コマンドを省略すると、er_print を対話的に使用することもできます。(er_print) プロンプトにコマンドを入力できます。
er_print ユーティリティーの詳細は、Oracle Solaris Studio 12.4: パフォーマンスアナライザ マニュアルおよび er_print(1) のマニュアルページを参照してください。
スレッドアナライザは、マルチスレッドプログラムを検査するためのパフォーマンスアナライザの特殊バージョンです。スレッドアナライザは、POSIX スレッド API、Oracle Solaris スレッド API、OpenMP ディレクティブ、またはこれらの組み合わせを使用して作成されたコード内でデータの競合やデッドロックの原因となっているマルチスレッドプログラミングのエラーを検出できます。
スレッドアナライザは、マルチスレッドプログラム内で 2 つの一般的なスレッドの問題を検出します。
1 つのプロセス内の 2 つのスレッドが、排他ロックを保持せずに共有メモリーの同じ場所に同時にアクセスし、それらのアクセスの少なくとも 1 つが書き込みである場合に発生するデータの競合。
2 つ以上のスレッドが互いのタスクの完了まで待機しているためにブロックされている場合に発生するデッドロック。
スレッドアナライザはマルチスレッドプログラムの分析向けに簡素化されていて、パフォーマンスアナライザの「競合」、「デッドロック」、および「デュアルソース」のデータビューのみが表示されます。OpenMP プログラムについては、「OpenMP 並列領域」ビューと「OpenMP タスク」ビューも表示されます。
ソースコードまたはバイナリコードでのデータの競合も検出できます。どちらの場合も、コードに計測機構を組み込んで、必要なデータを収集できるようにする必要があります。
スレッドアナライザを使用するには:
データの競合を解析するため、コードに計測機構を組み込みます。ソースコードの場合は、コンパイル時に –xinstrument=datarace コンパイラオプションを使用します。バイナリコードの場合は、discover -i datarace コマンドを使用して、計測機構が組み込まれたバイナリを作成します。
デッドロックの検出には、計測機構は不要です。
データ競合データを収集するための –r race オプション、デッドロックデータを収集するための –r deadlock オプション、または両方の種類のデータを収集するための –r all オプションを付けた collect コマンドを使用して、実行可能ファイルを実行します。
tha コマンドでスレッドアナライザを起動するか、er_print コマンドを使用して結果の実験を表示します。
次の図は、OpenMP プログラムで検出されたデータの競合と、データの競合をもたらす呼び出しスタックが表示されている「スレッドアナライザ」ウィンドウを示しています。
スレッドアナライザの使用方法については、tha(1) のマニュアルページおよびOracle Solaris Studio 12.4: スレッドアナライザユーザーズガイド を参照してください。