この章では、er_print ユーティリティーを使用してパフォーマンス解析を行う方法を説明します。er_print ユーティリティーは、パフォーマンスアナライザがサポートする各種の表示内容を ASCII 形式で出力します。これらの情報は、ファイルにリダイレクトしないかぎり、標準出力に書き込まれます。er_print ユーティリティーには、引数として、コレクタが生成した実験名または実験グループ名を指定する必要があります。
er_print ユーティリティーを使用して、関数や呼び出し元と呼び出し先のパフォーマンスメトリックス、ソースコードと逆アセンブリコードのリスト、標本収集情報、データ空間データ、スレッド解析データ、および実行統計情報を表示することができます。
er_print を、複数の実験または実験グループで起動した場合、デフォルトでは、実験データが集計されますが、実験を比較することもできます。詳細は、「compare { on | off }」を参照してください。
この章では、次の内容について説明します。
コレクタが収集するデータについては、第 2 章パフォーマンスデータを参照してください。
パフォーマンスアナライザを使用して情報をグラフィカル形式で表示する方法については、第 4 章パフォーマンスアナライザツールおよびオンラインヘルプを参照してください。
er_print ユーティリティーのコマンド行構文は、次のとおりです。
er_print [ -script script | -command | - | -V ] experiment-list |
er_print ユーティリティーのオプションは、次のとおりです。
キーボードから入力された er_print コマンドを読み取ります。
script ファイルからコマンドを読み取ります。script ファイルは、一連の er_print コマンドを含むファイルで、1 行に 1 つの er_print コマンドがあります。-script オプションを指定しない場合、er_print は、端末またはコマンド行からコマンドを読み取ります。
指定されたコマンドを処理します。
バージョン情報を表示して終了します。
er_print のコマンド行には、複数のオプションを指定できます。指定したオプションは、指定した順に処理されます。スクリプト、ハイフン、明示的なコマンドを任意の順序で組み合わせることができます。コマンドまたはスクリプトを何も指定しなかった場合、er_print はデフォルトで対話モードになり、キーボードからコマンドを入力します。対話モードを終了するには、quit と入力するか、Ctrl-D を押します。
それぞれのコマンドが処理されたあと、その処理から発生したエラーメッセージまたは警告メッセージがある場合は、出力されます。処理に関する統計情報の概要を出力するには、procstats コマンドを使用します。
er_print ユーティリティーで使用できるコマンドについては、以降の節で示します。
すべてのコマンドは、そのコマンドであることが明確なかぎり、短縮することができます。コマンドを複数の行に分割するには、行の末尾にバックスラッシュ \ を付けます。\ で終わる行は、その行の構文解析が行われる前に \ 文字が削除され、次の行の内容が追加されます。1 つのコマンドに使用できる行数は、利用可能なメモリー以外に制限はありません。
空白文字を含んでいる引数は、二重引用符で囲む必要があります。引用符の内部では、行をまたいでテキストを分割してもかまいません。
多くの er_print コマンドでは、メトリックキーワードのリストを使用します。リストの構文は次のとおりです。
metric-keyword-1[:metric-keyword2…] |
測定されたデータに基づく動的メトリックスの場合、メトリックのキーワードは、メトリックフレーバー文字列、メトリック表示形式文字列、およびメトリック名文字列の 3 つの部分から構成されます。これらは、空白を入力せずに次のように続けて指定します。
flavorvisibilityname |
実験内のロードオブジェクトの静的プロパティー (名前、アドレス、およびサイズ) に基づく静的メトリックスの場合、メトリックのキーワードは、メトリック名とその前に付加されるメトリック表示形式文字列 (省略可能) を空白なしに結合して構成されます。
[visibility]name |
メトリックの flavor 文字列と visibility 文字列は、フレーバー文字と表示形式文字を使用して指定します。
指定可能なメトリックフレーバー文字を表 5–1 に示します。複数のフレーバー文字を含むメトリックキーワードが展開されて、メトリックキーワードリストになります。たとえば、ie.user は、展開されて i.user:e.user になります。
表 5–1 メトリックフレーバー文字
文字 |
内容の説明 |
---|---|
e |
排他的メトリック値を表示します。 |
i |
包括的メトリック値を表示します。 |
a |
属性メトリック値を表示します (呼び出し元 - 呼び出し先メトリックの場合のみ)。 |
d |
データ空間メトリック値を表示します (データ派生メトリックスの場合のみ)。 |
指定可能なメトリック表示形式文字を表 5–2 に示します。指定可能なメトリック表示形式文字をTable 5–2 に示します。表示形式文字列の文字の順序は重要ではありません。対応するメトリックスの表示順序には影響しません。たとえば、i%.user と i.%user はともに i.user:i%user と解釈されます。
表示形式だけが異なるメトリックスは、常に標準の順序で一緒に表示されます。表示形式だけが異なる 2 つのメトリックキーワードがほかのキーワードで区切られている場合は、標準の順序で 2 つのメトリックスの 1 つ目の位置にメトリックスが表示されます。
表 5–2 メトリック表示形式文字
文字 |
内容の説明 |
---|---|
. |
メトリックを時間で表示します。この指定は、サイクルカウントを計測する時間メトリックスとハードウェアカウンタメトリックスに適用されます。そのほかのメトリックスは「+」と解釈されます。 |
% |
プログラム全体のメトリックを百分率で表示します。呼び出し元 - 呼び出し先リストの属性メトリックスの場合は、選択した関数の包括的メトリックにの割合が表示されます。 |
+ |
メトリックを絶対値で表示します。ハードウェアカウンタの場合、この値はイベントの回数です。時間メトリックスの場合は「.」と解釈されます。 |
! |
メトリック値を表示しません。ほかの表示形式文字と組み合わせることはできません。 |
フレーバー文字列と可視文字列のそれぞれが複数の文字から構成されている場合は、フレーバー文字列が先に展開されます。すなわち、ie.%user は展開されて i.%user:e.%user になり、i.user:i%user:e.user:e%user と解釈されます。
静的メトリックスの場合、ソート順序の定義という観点からは、表示形式文字のピリオド (.)、正符号 (+)、パーセント記号 (%) は同等と見なされます。つまり、sort i%user、sort i.user、sort i+user はすべて、「どのような形式で表示するにせよ、包括的ユーザー CPU 時間を基準にソートする」ことを意味します。また、sort i!user は、「表示するかどうかに関係なく、包括的ユーザー CPU 時間を基準にソートする」という意味になります。
可視文字の感嘆符 (!) を使用すると、各フレーバーのメトリックに組み込みのデフォルト値を置き換えられます。
メトリックリスト内で同じメトリックを複数回表示した場合は、最初に出現したものだけが処理され、それ以後のものは無視されます。名前付きメトリックがリストにない場合は、そのメトリックがリストに付加されます。
表 5–3 に、時間メトリックス、同期遅延メトリックス、メモリー割り当てメトリックス、MPI トレースメトリックス、および 2 つの一般的なハードウェアカウンタメトリックスに指定可能な er_print メトリック名文字列を示します。ほかのハードウェアカウンタメトリックスの場合、メトリック名文字列はカウンタ名と同じです。読み込まれた実験に適用できるすべてのメトリック名文字列のリストは、metric_list コマンドで取得できます。カウンタ名は、collect コマンドを引数なしで使用することによって一覧表示できます。ハードウェアカウンタについての詳細は、「ハードウェアカウンタオーバーフローのプロファイルデータ」を参照してください。
表 5–3 メトリック名文字列
カテゴリ |
文字列 |
内容の説明 |
---|---|---|
時間メトリックス |
user |
ユーザー CPU 時間 |
wall |
実経過時間 |
|
total |
LWP 合計時間 |
|
system |
システム CPU 時間 |
|
wait |
CPU 待ち時間 |
|
ulock |
ユーザーロック時間 |
|
text |
テキストページフォルト時間 |
|
data |
データページフォルト時間 |
|
owait |
ほかの待ち時間 |
|
時間ベースのプロファイルメトリックス |
mpiwork |
MPI ランタイムで作業する (処理の要求やメッセージなど) 時間 |
mpiwait |
MPI ランタイムで、イベント、バッファー、またはメッセージを待っている時間 |
|
ompwork |
作業を直列または並列で実行する時間 |
|
ompwait |
OpenMP ランタイムが同期を待っている時間 |
|
同期遅延メトリックス |
sync |
同期待ち時間 |
syncn |
同期待ち回数 |
|
MPI トレースメトリックス |
mpitime |
MPI 呼び出しに費やされた時間 |
mpisend |
開始された MPI ポイントツーポイント送信数 |
|
mpibytessent |
MPI で送信されるバイト数 |
|
mpireceive |
完了した MPI ポイントツーポイント受信数 |
|
mpibytesrecv |
MPI で受信されるバイト数 |
|
mpiother |
その他の MPI 関数の呼び出し数 |
|
メモリー割り当てメトリックス |
alloc |
割り当て数 |
balloc |
割り当てバイト数 |
|
leak |
リーク数 |
|
bleak |
リークバイト数 |
|
ハードウェアカウンタオーバーフローのメトリックス |
cycles |
CPU サイクル |
insts |
発行された命令 |
|
スレッドアナライザのメトリックス |
raccesses |
データ競合のアクセス |
deadlocks |
デッドロック |
表 5–3 に示した名前文字列のほかに、2 つの名前文字列をデフォルトのメトリックスリスト内でのみ使用できます。この 2 つの文字列は、任意のハードウェアカウンタ名に一致する hwc と、任意のメトリック名文字列に一致する any です。また、cycles と insts は、SPARC プラットフォームと x86 プラットフォームに共通のものですが、それ以外のアーキテクチャー固有のフレーバーも存在します。使用可能なすべてのカウンタを一覧表示するには、引数を指定せずに collect コマンドを使用します。
読み込んだ実験から使用可能なメトリックスを確認するには、metric_list コマンドを使用します。
ここでは、関数情報の表示を制御するコマンドを説明します。
現在選択されているメトリックスとともに関数リストを書き込みます。関数リストには、関数を表示するために選択されたロードオブジェクトに含まれているすべての関数、および object_select コマンドで非表示にされた関数を持つロードオブジェクトが含まれます。
書き込む行数は、limit コマンドを使用して制限できます (「出力を制御するコマンド」を参照)。
出力されるデフォルトのメトリックスは、排他的および包括的ユーザー CPU 時間で、秒数および全プログラムのメトリックの割合 (百分率) で示されます。表示する現行メトリックスを変更するには、metrics コマンドを使用します。これは、functions コマンドを発行する前に行う必要があります。また、.er.rc ファイル内の dmetrics コマンドを使用して、デフォルト値を変更することもできます。
Java プログラミング言語で書かれたアプリケーションの場合、表示される関数情報は表示モードがユーザー、上級、マシンのどれに設定されているかによって異なります。
「ユーザー」モードでは、各メソッドが名前によって示され、インタプリタされたメソッドと HotSpot でコンパイルされたメソッドのデータがまとめて集計されます。また、非ユーザー Java スレッドのデータは抑止されます。
「上級」モードでは、HotSpot でコンパイルされたメソッドがインタプリタされたメソッドから分離され、非ユーザー Java スレッドは抑止されません。
「マシン」モードでは、Java 仮想マシン (JVM) ソフトウェアと突き合わせてインタプリタされた Java メソッドのデータがインタプリタの進行と同時に表示される一方、指定されたメソッドについて、Java HotSpot 仮想マシンでコンパイルされたメソッドのデータが報告されます。すべてのスレッドが表示されます。
3 つのモードすべてにおいて、データは、Java ターゲットによって呼び出された C、C++、または Fortran コードの通常の方法で報告されます。
関数リストに表示するメトリックスを指定します。metric_spec には、キーワードの default (デフォルトのメトリック選択を復元します) またはコロンで区切ったメトリックキーワードのリストを指定できます。次に、メトリックリストの指定例を示します。
% metrics i.user:i%user:e.user:e%user |
このコマンドを入力すると、er_print ユーティリティーは次のメトリックスを表示します。
包括的ユーザー CPU 時間 (秒単位)
包括的ユーザー CPU 時間 (百分率)
排他的ユーザー CPU 時間 (秒単位)
排他的ユーザー CPU 時間 (百分率)
デフォルトでは、「デフォルト値を設定するコマンド」の説明のように、.er.rc ファイルから処理された dmetrics コマンドに基づいたメトリック設定が使用されます。metrics コマンドで明示的に metric_spec を default に設定した場合は、記録するデータに適したデフォルト設定が復元されます。
メトリックスがリセットされると、新しいリスト内でデフォルトのソートメトリックが設定されます。
metric_spec を省略した場合は、現在のメトリックスの設定が表示されます。
metrics コマンドは、関数リスト用のメトリックスを設定するほか、呼び出し元 - 呼び出し先のメトリックスと、データ派生出力のメトリックスを同じ設定値に設定します。
metrics コマンドが処理されると、現在有効なメトリックを示すメッセージが表示されます。前述の例では、メッセージは次のようになります。
current: i.user:i%user:e.user:e%user:name |
メトリックリストの構文については、「メトリックリスト」を参照してください。指定可能なメトリックスを一覧表示するには、metric_list コマンドを使用します。
metrics コマンドに誤りがあった場合、そのコマンドは警告とともに無視され、以前の設定が引き続き有効になります。
関数リストを metric_spec でソートします。メトリック名の中の visibility は、ソート順序に影響を及ぼしません。複数のメトリックが metric_spec の中で指定されている場合は、表示可能な最初のものが使用されます。指定されたメトリックスに表示可能なものがない場合は、コマンドが無視されます。metric_spec の前に負符号 (-) を付加することにより、逆順のソートを指定できます。
デフォルトでは、「デフォルト値を設定するコマンド」の説明のように、.er.rc ファイルから処理された dsort コマンドに基づいたメトリックソート設定が使用されます。sort コマンドで明示的に metric_spec を default に設定した場合は、デフォルトの設定が使用されます。
文字列 metric_spec は、「メトリックリスト」に示すメトリックキーワードのいずれか 1 つです。
% sort i.user |
このコマンドは、er_print ユーティリティーに、関数リストを包括的ユーザー CPU 時間によってソートするよう指示します。指定したメトリックが読み込まれた実験に含まれていない場合は、警告メッセージが表示され、コマンドは無視されます。コマンドが終了すると、ソート基準メトリックが表示されます。
関数リスト内の各関数について、概要パネルを出力します。出力するパネル数は、limit コマンドを使用して制限できます (「出力を制御するコマンド」を参照)。
概要メトリックスパネルには、関数またはロードオブジェクトの名前、アドレス、およびサイズのほか、関数についてはソースファイル、オブジェクトファイル、およびロードオブジェクトの名前、ならびに選択された関数やロードオブジェクトについて記録された排他的メトリックスと包括的メトリックスの値と百分率が表示されます。
指定された関数の概要パネルを出力します。同じ名前を持つ関数が複数存在する場合には、省略可能なパラメータ N が必要です。指定の関数名を持つ N 番目の関数について、概要メトリックスパネルが出力されます。コマンド行でコマンドを入力する場合、N を必ず指定する必要があります。不要な場合は無視されます。N が必要であるときに N を使用しないでコマンドを対話的に入力すると、対応する N 値を持つ関数のリストが出力されます。
関数の概要メトリックスについては、fsummary コマンドの解説を参照してください。
ここでは、呼び出し元と呼び出し先の情報の表示を制御するコマンドを説明します。
それぞれの関数の呼び出し元 - 呼び出し先パネルを、関数ソートメトリック (sort) で指定された順序で出力します。
各呼び出し元 - 呼び出し先レポート内では、呼び出し元 - 呼び出し先のソートメトリックス (csort) に従って呼び出し元と呼び出し先がソートされます。出力するパネル数は、limit コマンドを使用して制限できます (「出力を制御するコマンド」を参照)。選択されている関数 (中央の関数) は、次のようにアスタリスクで示されます。
Attr. Excl. Incl. Name User CPU User CPU User CPU sec. sec. sec. 4.440 0. 42.910 commandline 0. 0. 4.440 *gpf 4.080 0. 4.080 gpf_b 0.360 0. 0.360 gpf_a |
この例では、関数 gpf が選択されています。この関数は commandline によって呼び出され、gpf_a と gpf_b を呼び出します。
指定された関数の呼び出し元 - 呼び出し先パネルを出力します。同じ名前を持つ関数が複数存在する場合には、省略可能なパラメータ N が必要です。指定の関数名を持つ N 番目の関数について、呼び出し元 - 呼び出し先パネルが出力されます。コマンド行でコマンドを入力する場合、N を必ず指定する必要があります。不要な場合は無視されます。N が必要であるときに N を使用しないでコマンドを対話的に入力すると、対応する N 値を持つ関数のリストが出力されます。
呼び出しスタックを構築する際、現在の呼び出しスタックフラグメントの先頭に名前付き関数を追加します。関数名があいまいな場合、オプションパラメータが必要になります。パラメータの指定方法についての詳細は、「source|src { filename | function_name } [ N]」を参照してください。
呼び出しスタックを構築する際、現在の呼び出しスタックフラグメントの末尾に名前付き関数を追加します。関数名があいまいな場合、オプションパラメータが必要になります。パラメータの指定方法についての詳細は、「source|src { filename | function_name } [ N]」を参照してください。
呼び出しスタックを構築する際、呼び出しスタックセグメントから最初のフレームを削除します。
呼び出しスタックを構築する際、呼び出しスタックセグメントから最後のフレームを削除します。
ここでは、呼び出しツリー用のコマンドについて説明します。
実験から動的コールグラフを表示します。各レベルに履歴メトリックスが表示されます。
ここでは、メモリーの割り当てと割り当て解除に関するコマンドについて説明します。
共通呼び出しスタックによって集計されたメモリーリークのリストを表示します。各エントリは、リーク総数、および指定の呼び出しスタックでリークした総バイト数を示します。このリストは、リークしたバイト数を基準としてソートされます。
共通呼び出しスタックによって集計されたメモリー割り当てのリストを表示します。各エントリは、割り当ての数、および指定の呼び出しスタックに割り当てられた総バイト数を示します。このリストは、割り当てられたバイト数を基準としてソートされます。
ここでは、注釈付きソースおよび逆アセンブリコードの表示を制御するコマンドを説明します。
現在のソートメトリックで整列されたプログラムカウンタ (Program Counter、PC) と、そのメトリックスのリストを出力します。このリストには、object_select コマンドで関数を非表示にした各ロードオブジェクトのメトリックスを集計した行が含まれています。
PC リスト内の各 PC の概要メトリックスパネルを現在のソートメトリックスで指定された順序で出力します。
現在のソートメトリックで整列されたソース行と、そのメトリックスのリストを出力します。このリストには、行番号情報を持っていない各関数またはソースファイルが未知である各関数のメトリックスを集計した行と、object_select コマンドで関数を非表示している各ロードオブジェクトのメトリックスを集計した行が含まれています。
行リスト内の各行の概要メトリックスパネルを現在のソートメトリックで指定された順序で出力します。
指定したファイル、または指定した関数を含むファイルの注釈付きソースコードを出力します。いずれの場合も、指定したファイルはパスの通っているディレクトリに存在する必要があります。ソースが GNU Fortran コンパイラでコンパイルされている場合は、ソースに表示されるように、関数名のあとにアンダースコアを 2 つ追加する必要があります。
省略可能なパラメータ N (正の整数) は、ファイル名または関数名があいまいでない場合にだけ使用します。このパラメータを指定した場合は、N 番目の候補が使用されます。番号指定のないあいまいな名前が指定された場合、er_print ユーティリティーはオブジェクトファイル名の候補のリストを表示します。指定された名前が関数の場合は、その関数名がオブジェクトファイル名に追加され、そのオブジェクトファイルの N の値を表す番号も出力されます。
関数名は function"file" としても指定できます。この場合、file は、関数の代替ソースコンテキストを指定するために使用されます。最初の命令の直後にその関数のインデックス行が追加されます。インデックス行は、次の書式で山括弧内にテキストとして表示されます。
<Function: f_name>
関数のデフォルトソースコンテキストは、その関数の最初の命令が帰するソースファイルとして定義されます。これは通常、関数を含むオブジェクトモジュールを生成するためにコンパイルされたソースファイルです。代替ソースコンテキストは、関数に属する命令を含むほかのファイルから構成されます。このようなコンテキストには、インクルードファイルの命令と、指定の関数にインライン化された関数の命令が含まれます。代替のソースコンテキストが存在する場合、デフォルトのソースコンテキストの冒頭に、代替ソースコンテキストが置かれている場所を示す拡張インデックス行のリストを次の形式で組み込みます。
<Function: f, instructions from source file src.h>
コマンド行から er_print ユーティリティーを起動するときに -source 引数を使用する場合は、file の引用符の前にバックスラッシュのエスケープ文字を付加する必要があります。つまり、関数名の形式は、function\"file\" となります。er_print ユーティリティーが対話モードにあるときは、バックスラッシュは不要です。使用しないでください。
通常、デフォルトのソースコンテキストが使用された場合は、そのファイルに入っているすべての関数についてメトリックスが表示されます。ファイルを明示的に指定した場合は、指定した関数についてのみ、メトリックスが表示されます。
指定したファイル、または指定した関数を含むファイルの注釈付き逆アセンブリコードを出力します。指定したファイルは、パスの通っているディレクトリに存在する必要があります。
省略可能なパラメータ N の意味は、source コマンドと同じです。
注釈付きソースのリストに含めるコンパイラのコメントクラスを指定します。クラスリストはコロンで区切ったクラスのリストであり、次のメッセージクラスがゼロ個以上含まれています。
表 5–4 コンパイルコメントメッセージクラス
クラス |
意味 |
---|---|
b[asic] |
基本的なレベルのメッセージを表示します。 |
v[ersion] |
ソースファイル名、最終修正日付、コンパイラコンポーネントのバージョン、コンパイル日付とオプションなどのバージョンメッセージを表示します。 |
pa[rallel] |
並列化に関するメッセージを表示します。 |
q[uery] |
最適化に影響するコードに関する問い合わせメッセージを表示します。 |
l[oop] |
ループの最適化と変換に関するメッセージを表示します。 |
pi[pe] |
ループのパイプライン化に関するメッセージを表示します。 |
i[nline] |
関数のインライン化に関するメッセージを表示します。 |
m[emops] |
ロード、ストア、プリフェッチなどのメモリー操作に関するメッセージを表示します。 |
f[e] |
フロントエンドのメッセージを表示します。 |
co[degen] |
コードジェネレータのメッセージを表示します。 |
cf |
ソースの下部にコンパイラのフラグを表示します。 |
all |
すべてのメッセージを表示します。 |
none |
メッセージを表示しません。 |
all および none クラスは常に単独で指定します。
scc コマンドを省略した場合は、basic がデフォルトのクラスになります。class-list が空の状態で scc コマンドを入力した場合、コンパイラのコメントは出力されません。通常、scc コマンドは、.er.rc ファイルでのみ使用します。
注釈付きソースコードでのメトリックスの強調表示に使用するしきい値の百分率を指定します。ファイル内のソース行で、メトリック値が、そのメトリックの最大値の value % 以上である場合、そのメトリックが発生する行の先頭に ## が挿入されます。
注釈付き逆アセンブリリストに含めるコンパイラのコメントクラスを指定します。クラスリストは、コロンで区切られたクラスのリストです。利用可能なクラスのリストは、表 5–4に示す注釈付きソースコードリストのクラスリストと同じです。クラスリストには、次のオプションを追加できます。
表 5–5 dcc コマンドの追加オプション
オプション |
意味 |
---|---|
h[ex] |
命令の 16 進値を示します。 |
noh[ex] |
命令の 16 進値を示しません。 |
s[rc] |
ソースリストと注釈付き逆アセンブリリストをインタリーブします。 |
nos[rc] |
ソースリストと注釈付き逆アセンブリリストをインタリーブしません。 |
as[rc] |
注釈付きソースコードと注釈付き逆アセンブリリストをインタリーブします。 |
注釈付き逆アセンブリコードでのメトリックスの強調表示に使用するしきい値の百分率を指定します。ファイル内の命令行で、メトリック値が、そのメトリックの最大値の value % 以上である場合、そのメトリックが発生する行の先頭に ## が挿入されます。
注釈付きのソースと逆アセンブリリストに含めるコンパイラのコメントクラスを指定します。クラスリストは、コロンで区切られたクラスのリストです。利用可能なクラスのリストは、表 5–4 に示す注釈付きソースコードリストのクラスリストと同じです。
ソースファイルやオブジェクトファイルの検索に使用するパスを設定します。path_list は、コロンで区切られたディレクトリのリストです。ディレクトリ名にコロン文字がある場合は、バックスラッシュでコロンをエスケープします。特別なディレクトリ名 $expts は、現在の実験を読み込まれた順序で示します。これは、$ の 1 文字に短縮できます。
デフォルトの設定は、$expts:.. です。現在のパス設定の検索時にファイルが見つからなかった場合は、コンパイルされているフルパス名が使用されます。
引数のない setpath は、現在のパスを出力します。
現在の setpath の設定に path_list を付加します。
addpath または setpath で設定された path_list を使用してファイルが見つからなかった場合、pathmap コマンドを使用して、1 つまたは複数のパスの再マッピングを指定できます。ソースファイル、オブジェクトファイル、または共有オブジェクトのパス名が old-prefix で指定した接頭辞で始まる場合、古い接頭辞は new-prefix で指定した接頭辞に置き換えられます。結果のパスは、ファイルの検索に使用されます。複数の pathmap コマンドが提供されており、それぞれが、ファイルが見つかるまで試行されます。
ハードウェアカウンタプロファイリングおよびデータ空間プロファイリングにより収集される実験については、次のオブジェクトに関連するメトリックスを表示できます。
データオブジェクト - ソースコードに記載されているプログラム定数、変数、配列、構造体や共用体などの集合体、個々の集合要素。
メモリーオブジェクト - キャッシュ行、ページ、およびメモリーバンクなど、メモリーサブシステム内のコンポーネント。このオブジェクトは、記録された仮想アドレスまたは物理アドレスから計算されたインデックスから決定されます。メモリーオブジェクトは、仮想ページおよび物理ページについて 8K バイト、64K バイト、512K バイト、および 4M バイトのサイズで事前定義されています。ほかのオブジェクトも mobj_define コマンドにより定義できます。
このデータは、SPARC アーキテクチャーの -xhwcprof コンパイラオプションでコンパイルされた Solaris オブジェクトでのみ収集できます。
これらのデータの種類についての詳細は、「ハードウェアカウンタオーバーフローのプロファイルデータ」を参照してください。ハードウェアカウンタオーバーフロープロファイリングの実行時に使用されるコマンド行については、「-h counter_definition_1...[, counter_definition_n]」を参照してください。
-xhwcprof オプションについては、『Oracle Solaris Studio 12.2: Fortran ユーザーズガイド』、『Oracle Solaris Studio 12.2: C ユーザーガイド』、または『Oracle Solaris Studio 12.2: C++ ユーザーズガイド』を参照してください。
データオブジェクトのリストを、それらのメトリックスとともに書き込みます。
指定されたデータオブジェクトの概要メトリックスパネルを書き込みます。オブジェクト名があいまいな場合には、省略可能なパラメータ N が必要です。指令がコマンド行にある場合には N は必要です。不要な場合は無視されます。
データ派生メトリックデータを持つすべてのプログラミングデータオブジェクトについて、注釈付きのデータオブジェクトレイアウトを書き込みます。データは、各構造をひとまとめにして、現在のデータソートメトリック値によってソートされます。集合体データオブジェクトごとに、そのオブジェクトに加算される合計メトリックスが表示され、そのあとに、そのオブジェクトのすべての要素がオフセット順に表示されます。各要素には、そのメトリックスと、32 バイトブロックを基準にしたそのサイズと位置を示す情報が表示されます。
所定のタイプのメモリーオブジェクトと現在のメトリックスのリストを出力します。メトリックスはデータ空間のリストとして、ソートされ表示されます。名前 mobj_type を直接、コマンドとして使用することもできます。
memobj コマンド内で mobj_type に使用する、既知のタイプのメモリーオブジェクトのリストを出力します。
新しいタイプのメモリーオブジェクトを、index_exp で指定されたオブジェクトへの VA/PA のマッピングを使用して定義します。式の構文については、「式の文法」に説明があります。
mobj_type は、定義済みであってはいけません。その名前は、すべて英数字または「_」文字で構成されている必要があり、1 文字目は英字である必要があります。
index_exp は、構文的に正しくなければいけません。構文的に正しくない場合はエラーが返され、定義は無視されます。
<Unknown> メモリーオブジェクトのインデックスは -1 です。また、新しいメモリーオブジェクトを定義するために使用する式は、<Unknown> の認識をサポートしている必要があります。たとえば、VADDR ベースのオブジェクトの場合、式は次の形式になっている必要があります。
VADDR>255?expression :-1
また、PADDR ベースのオブジェクトの場合、式は次の形式になっている必要があります。
PADDR>0?expression:-1
インデックスオブジェクトのコマンドは、すべての実験に使用できます。インデックスオブジェクトリストは、記録されたデータからインデックスを計算できるオブジェクトのリストです。スレッド、CPU、標本、および秒のインデックスオブジェクトが事前に定義されています。その他のインデックスオブジェクトは、indxobj_define コマンドで定義できます。
次のコマンドは、インデックスオブジェクトのリストを制御します。
所定のタイプのインデックスオブジェクトとそのメトリックスのリストを出力します。インデックスオブジェクトのメトリックスとソートは、排他的メトリックスだけが含まれる点を除き、関数リストと同じです。名前 indxobj_type を直接、コマンドとして使用することもできます。
indxobj コマンド内で indxobj_type に使用する、既知のタイプのインデックスオブジェクトのリストを書き込みます。
新しいタイプのインデックスオブジェクトを、index_exp で指定されたオブジェクトへのパケットのマッピングを使用して定義します。式の構文については、「式の文法」に説明があります。
indxobj_type は、定義済みであってはいけません。その名前は、大文字と小文字が区別され、すべて英数字または「_」文字で構成されている必要があり、1 文字目は英字である必要があります。
index_exp の構文が正しくなかった場合は、エラーが返され、定義が無視されます。index_exp に空白文字が含まれる場合は、二重引用符 (") で囲む必要があります。
<Unknown> インデックスオブジェクトのインデックスは -1 です。また、新しいインデックスオブジェクトを定義するために使用する式は、<Unknown> の認識をサポートしている必要があります。
たとえば、仮想 PC また物理 PC に基づくインデックスオブジェクトの場合、式は次の形式になっている必要があります。
VIRTPC>0?VIRTPC:-1 |
次のコマンドを使用して、OpenMP インデックスオブジェクトの情報を出力できます。
実験で実行された OpenMP 並列領域とそれぞれのメトリックスのリストを出力します。このコマンドは、OpenMP 3.0 のパフォーマンスデータを使用した実験にのみ使用できます。
実験で実行された OpenMP タスクとそれぞれのメトリックスのリストを出力します。このコマンドは、OpenMP 3.0 のパフォーマンスデータを使用した実験にのみ使用できます。
次のコマンドはスレッドアナライザに対応しています。獲得されるデータや表示されるデータについての詳細は、『Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド』を参照してください。
実験におけるすべてのデータ競合リストを書き出します。データ競合レポートは、データ競合検出データを使用した実験でのみ利用できます。
指定された race_id の詳細情報を書き出します。race_id を all に設定した場合は、すべてのデータ競合の詳細情報が表示されます。データ競合レポートは、データ競合検出データのある実験からのみ取得できます。
実験で検出されたすべての実際のデッドロックと潜在的なデッドロックのリストを書き出します。デッドロックレポートは、デッドロック検出データを使用した実験でのみ利用できます。
指定された deadlock_id の詳細情報を書き出します。deadlock_id を all に設定した場合は、すべてのデッドロックの詳細情報が表示されます。デッドロックレポートは、デッドロック検出データを使用した実験でのみ利用できます。
ここでは、実験、標本、スレッド、および LWP を一覧表示するコマンドについて説明します。
読み込まれている実験をそれぞれの ID 番号とともにすべて一覧表示します。各実験は、標本、スレッド、または LWP を選択する際に使用されるインデックス、および拡張フィルタリングに使用できる PID とともに一覧表示されます。
次に、実験リストの例を示します。
(er_print) experiment_list ID Experiment == ========== 1 test.1.er 2 test.6.er |
解析の対象として現在選択されている標本の一覧を表示します。
次に、標本リストの例を示します。
(er_print) sample_list Exp Sel Total === ======= ===== 1 1-6 31 2 7-10,15 31 |
解析の対象として現在選択されている LWP の一覧を表示します。
解析の対象として現在選択されているスレッドの一覧を表示します。
解析の対象として現在選択されている CPU の一覧を表示します。
実験データのフィルタリングは、次の 2 つの方法で指定できます。
フィルタ式を指定する。このフィルタ式は各データレコードごとに評価され、そのレコードを含めるかどうかを決定します。
フィルタリング用の実験、標本、スレッド、CPU、および LWP を選択する。
フィルタ式は filters コマンドで指定できます。
filter_exp は式であり、この式が真と評価されたデータレコードは含まれ、偽と評価されたデータレコードは含まれません。式の文法については、「式の文法」に説明があります。
実験のフィルタ式で使用できるオペランドを一覧表示できます。
フィルタ式の構築に使用できるトークンのリストを出力します。フィルタ式の一部のトークンと文法については、「式の文法」を参照してください。
次に、選択の構文の例を示します。この構文はコマンドの説明で使用されます。
[experiment-list:]selection-list[+[ experiment-list:]selection-list … ] |
各選択リストの前には、空白なしの 1 つのコロンで区切って実験リストを指定できます。選択リストを正符号 (+) で結合して、複数の選択を指定することもできます。
実験リストと選択リストの構文は同じで、次の例に示すように、キーワード all、または空白なしのコンマで区切った番号または番号の範囲 (n-m) のリストを指定できます。
2,4,9-11,23-32,38,40 |
実験番号は experiment_list コマンドを使用して特定できます。
次に選択の例をいくつか示します。
1:1-4+2:5,6 all:1,3-6 |
1 つ目の例では、実験 1 からオブジェクト 1 ~ 4、実験 2 からオブジェクト 5 ~ 6 を選択しています。2 つ目の例では、すべての実験からオブジェクト 1 と 3 ~ 6 を選択しています。オブジェクトは、LWP、スレッド、または標本のいずれかです。
LWP、標本、CPU、およびスレッドを選択するためのコマンドは相互に依存しています。コマンドの実験リストの内容が、直前のコマンドのリストの内容と異なる場合は、最新のコマンドの実験リストの内容が、次のようにして 3 つのタイプの選択ターゲット (LWP、標本、スレッド) のすべてに適用されます。
最新の実験リストにない実験に対する既存の選択内容は無効になります。
最新の実験リストに含まれている実験に対する既存の選択内容は維持されます。
選択が行われていないターゲットに対しては all が適用されます。
情報を表示する標本を選択します。コマンドが終了すると、選択された標本が一覧表示されます。
情報を表示する LWP を選択します。コマンドが終了すると、選択された LWP が一覧表示されます。
情報を表示するスレッドを選択します。コマンドが終了すると、選択されたスレッドが一覧表示されます。
情報を表示する CPU を選択します。コマンドが終了すると、選択された CPU が一覧表示されます。
これらのコマンドは、er_print ユーティティーによるロードオブジェクトの表示方法を決定します。
すべてのロードオブジェクトの状態と名前を示す 2 列のリストを表示します。最初の列には各ロードオブジェクトの表示/非表示/API の状態が示され、2 番目の列にはオブジェクトの名前が示されます。各ロードオブジェクトの名前の前には、そのオブジェクトの関数が関数リストに表示される (展開される) ことを示す show、そのオブジェクトの関数が関数リストに表示されない (短縮される) ことを示す hide、またはロードオブジェクトへのエントリポイントを表す関数のみが表示される場合は API-only が付きます。短縮されたロードオブジェクトのすべての関数は、そのロードオブジェクト全体を表す関数リスト内の単一の項目へマップされます。
ロードオブジェクトリストの表示例を次に示します。
(er_print) object_list Sel Load Object ==== ================== hide <Unknown> show <Freeway> show <libCstd_isa.so.1> show <libnsl.so.1> show <libmp.so.2> show <libc.so.1> show <libICE.so.6> show <libSM.so.6> show <libm.so.1> show <libCstd.so.1> show <libX11.so.4> show <libXext.so.0> show <libCrun.so.1> show <libXt.so.4> show <libXm.so.4> show <libsocket.so.1> show <libgen.so.1> show <libcollector.so> show <libc_psr.so.1> show <ld.so.1> show <liblayout.so.1> |
すべての名前付きロードオブジェクトを、それらのすべての関数が表示されるように設定します。オブジェクトの名前は、フルパス名またはベース名で指定できます。名前にコンマ文字が含まれている場合は、その名前を二重引用符で囲む必要があります。ロードオブジェクトの名前に「all」という文字列が使用されている場合は、すべてのロードオブジェクトの関数が表示されます。
すべての名前付きロードオブジェクトを、それらのすべての関数が表示されないように設定します。オブジェクトの名前は、フルパス名またはベース名で指定できます。名前にコンマ文字が含まれている場合は、その名前を二重引用符で囲む必要があります。ロードオブジェクトの名前に「all」という文字列が使用されている場合は、すべてのロードオブジェクトの関数が表示されます。
すべての名前付きロードオブジェクトを、ライブラリへのエントリポイントを表す関数のみがすべて表示されるように設定します。オブジェクトの名前は、フルパス名またはベース名で指定できます。名前にコンマ文字が含まれている場合は、その名前を二重引用符で囲む必要があります。ロードオブジェクトの名前に「all」という文字列が使用されている場合は、すべてのロードオブジェクトの関数が表示されます。
すべてのロードオブジェクトを、.er.rc に設定されている初期デフォルト値にしたがいます。
関数の情報を表示するロードオブジェクトを選択します。すべての名前付きロードオブジェクトの関数が表示され、その他すべてのロードオブジェクトの関数は表示されません。object-list は、空白なしのコンマで区切ったロードオブジェクトのリストです。ロードオブジェクトの関数が表示される場合、ゼロではないメトリックスを保持するすべての関数が関数リストに表示されます。ロードオブジェクトの関数が表示されない場合、そのオブジェクトの関数は短縮され、そのロードオブジェクト全体のメトリックスが入った単一の行が表示され、個々の関数は表示されません。
ロードオブジェクト名は、フルパス名またはベース名で指定します。オブジェクト名そのものにコンマが含まれている場合は、名前を二重引用符で囲む必要があります。
ここでは、現在選択されているメトリックスと使用可能なメトリックキーワードを一覧表示するコマンドを説明します。
関数リストで現在選択されているメトリックスと、関数リスト内のさまざまな種類のメトリックスを参照する際にほかのコマンド (metrics、sort など) で使用可能なメトリックキーワードの一覧を表示します。
現在選択されている呼び出し元 - 呼び出し先メトリックス、および呼び出し元 - 呼び出し先レポートのメトリックスとキーワード名のリストを表示します。metric_list 出力と同じ方法でリストを表示しますが、属性メトリックスも含みます。
現在選択されているデータ派生メトリックス、およびすべてのデータ派生レポートのメトリックスとキーワード名のリストを表示します。metric_list コマンドの出力と同じ方法でリストを表示しますが、データ派生フレーバーを持つメトリックスと静的メトリックスだけを含めます。
現在選択されているインデックスオブジェクトメトリックス、およびすべてのインデックスオブジェクトレポートのメトリックスとキーワード名のリストを表示します。metric_list コマンドと同じ方法でリストを表示しますが、排他的フレーバーを持つメトリックスと静的メトリックスだけを含めます。
ここでは、er_print の出力を制御するコマンドを説明します。
開いている出力ファイルを閉じ、以降の出力先として filename を開きます。filename を開くときに、既存のコンテンツを消去します。filename の代わりにハイフン (-) を指定した場合は、標準出力に出力されます。filename の代わりに 2 つのハイフン (--) を指定した場合は標準エラーへ出力されます。
開いている出力ファイルを閉じ、filename を開きます。その際、既存のコンテンツがあれば残し、後続の出力がファイルの末尾に付加されるようにします。filename が存在しない場合、appendfile コマンドの機能は outfile コマンドと同じです。
出力をレポートの最初の n 個のエントリに制限します。n は符号なしの正の整数です。
長短どちらの形式の関数名を使用するかを指定します (C++ および Java のみ)。shared_object_name が指定された場合は、関数名に共有オブジェクト名を付加します。
モードを次のいずれかに設定します。
Java 実験の場合は、Java スレッドの Java 呼び出しスタックを表示し、ハウスキーピングスレッドを表示しません。関数リストには、Java 以外のスレッドからの集計時間を表す関数 <JVM-System> が含まれます。JVM ソフトウェアが Java 呼び出しスタックを報告しない場合、時間は関数 <no Java callstack recorded> に報告されます。
OpenMP 実験の場合は、OpenMP を使用せずにプログラムがコンパイルされたときに取得されたものと同様の、再構築された呼び出しスタックが表示されます。また、OpenMP ランタイムが特定の操作を実行しているときは、<OMP-*> という形式の名前を持つ特殊関数を追加します。
Java 実験の場合は、ユーザーの Java コードの実行中には Java スレッドの Java 呼び出しスタックを表示し、JVM コードの実行中または JVM ソフトウェアが Java 呼び出しスタックを報告しないときにはマシン呼び出しスタックを表示します。ハウスキーピングスレッドについてはマシン呼び出しスタックを表示します。
OpenMP 実験の場合は、コンパイラによって生成された関数を表示します。これらの関数は、ユーザー関数によってユーザーモードで集計される、並列化されたループやタスクなどを表します。また、OpenMP ランタイムが特定の操作を実行しているときは、<OMP-*> という形式の名前を持つ特殊関数を追加します。
Java 実験と OpenMP 実験の場合は、すべてのスレッドのマシン呼び出しスタックを表示します。
Java 実験と OpenMP 実験を除くすべての実験の場合は、3 つのモードすべてに同じデータを表示します。
比較モードをオンまたはオフに設定します。デフォルトでは、値はオフなので、同じ実行可能ファイルの複数の実験が読み込まれると、そのデータは集計されます。.er.rc ファイルで compare on と設定して比較モードを有効にした状態で、同じ実行可能ファイルの複数の実験が読み込まれると、各実験データについて、メトリックスが別々の列に表示されます。er_print compare コマンドを使って、実験を比較することもできます。
比較モードでは、実験または実験グループのデータは、「関数」リスト、「呼び出し元 - 呼び出し先」リスト、「ソース」リスト、および「逆アセンブリ」リストで、隣接列に表示されます。列は、実験または実験グループの読み込み順に表示され、追加のヘッダー行に実験名または実験グループ名が示されます。
次の er_print サブコマンドは、実験についてのその他の情報を表示します。
指定した実験に関する説明情報を表示します。exp_id は、exp_list コマンドを使用して取得することができます。exp_id として all を指定するか、exp_id を省略した場合は、読み込まれた実験すべての情報が表示されます。
エラーや警告が発生した場合には、各ヘッダーのあとに表示されます。各実験のヘッダーは、ハイフン (-) で区切られます。
実験ディレクトリに notes という名前のファイルがある場合は、このファイルの内容がヘッダー情報の先頭に付加されます。notes ファイルは、collect コマンドに -C "comment" 引数を付けて、手動で追加、編集、または指定できます。
exp_id はコマンド行では必要ですが、スクリプトや対話モードでは不要です。
測定されたカウントデータから命令頻度のリストを書き込みます。命令頻度のレポートは、カウントデータからのみ生成できます。このコマンドは、Solaris OS を実行している SPARC プロセッサだけが対象です。
パフォーマンス解析の目的でロードオブジェクトを使用した結果として生じるエラーメッセージや警告メッセージのないロードオブジェクトを一覧表示します。表示されるロードオブジェクトの数は、limit コマンドを使用して制限できます (「出力を制御するコマンド」を参照)。
指定した実験の標本のうち、現在選択されている各標本の標本データを書き出します。exp_id は、exp_list コマンドを使用して取得することができます。exp_id として all を指定するか、または exp_id を省略した場合、すべての実験の標本データが表示されます。exp_id はコマンド行では必要ですが、スクリプトや対話モードでは不要です。
指定した実験の現在の標本セット全体にわたって集計された実行統計情報を書き出します。実行統計値の定義と意味については、getrusage(3C) と proc(4) のマニュアルページを参照してください。実行統計には、コレクタがデータをまったく収集しないシステムスレッドからの統計が含まれます。
exp_id は、experiment_list コマンドを使用して取得することができます。exp_id が指定されていない場合、各実験の標本セットを対象に集計された、すべての実験のデータの合計が表示されます。exp_id が all である場合、各実験の合計と個々の統計が表示されます。
.er.rc ファイルで次のコマンドを使用して、er_print、er_src、およびパフォーマンスアナライザのデフォルト値を設定できます。これらのコマンドはデフォルト値を設定する目的でのみ使用できます。er_print ユーティリティーの入力として使用することはできません。これらのコマンドは、.er.rc という名前のデフォルト値ファイルにのみ組み込むことができます。パフォーマンスアナライザのデフォルト値にのみ適用できるコマンドについては、「パフォーマンスアナライザにのみデフォルト値を設定するコマンド」に説明があります。アナライザによる .er.rc ファイルの使用方法については、「アナライザのデフォルト設定」を参照してください。
.er.rc デフォルト値ファイルは、すべての実験のデフォルト値を設定するためにホームディレクトリに置くか、デフォルト値をローカルに設定するためにそれ以外のディレクトリに置くことができます。er_print ユーティリティー、 er_src ユーティリティー、パフォーマンスアナライザのいずれかを起動すると、現在のディレクトリとユーザーのホームディレクトリに .er.rc ファイルがあるかどうかが調べられ、存在する場合は、システムのデフォルト値ファイルとともに、そのファイルが読み取られます。ホームディレクトリの .er.rc ファイル内のデフォルト値はシステムのデフォルト値よりも優先され、現在のディレクトリの .er.rc ファイル内のデフォルト値は、ユーザーのホームおよびシステムのデフォルト値よりも優先されます。
実験が格納されているディレクトリからデフォルト値ファイルを読み取るには、そのディレクトリからパフォーマンスアナライザまたは er_print ユーティリティーを起動する必要があります。
デフォルト値ファイルには、scc、 sthresh、dcc、dthresh、 cc、setpath、addpath、pathmap、name、mobj_define、object_show、object_hide、object_api、 indxobj_define、tabs、rtabs、viewmode の各コマンドを含めることもできます。dmetrics、dsort、addpath、pathmap、mobj_define、indxobj_define の各コマンドは、1 つのデフォルト値ファイルに複数含めることができ、その場合、すべての .er.rc ファイル内のコマンドが連結されます。それ以外のすべてのコマンドの場合は、最初に出現するものが使用され、それ以後のものは無視されます。
関数リストに表示または印刷するデフォルトのメトリックスを指定します。メトリックリストの構文と使用方法については、「メトリックリスト」で説明しています。メトリックスが出力される順序とアナライザの「メトリック」ダイアログボックスに表示されるメトリックの順序は、このリスト内のメトリックキーワードの順序によって決まります。
呼び出し元 - 呼び出し先リストのデフォルトのメトリックスは、このリスト内の各メトリック名の最初の名前の前に対応する属性メトリックを追加することによって得られます。
関数リストの内容をソートするときの基準として、デフォルトで使用するメトリックを指定します。ソート基準メトリックは、このリスト内で、読み込まれている実験内のメトリックと一致する最初のメトリックです。このとき、次の条件が適用されます。
metric_spec のエントリに表示文字列の感嘆符「!」が含まれている場合、表示されているかどうかに関係なく、一致する名前を持つメトリックスの中で最初のメトリックが使用されます。
metric_spec のエントリにほかの表示文字列が含まれている場合、一致する名前を持つメトリックスの中の最初の表示メトリックが使用されます。
メトリックリストの構文と使用方法については、「メトリックリスト」で説明しています。
呼び出し元 - 呼び出し先リストのデフォルトソート基準メトリックは、関数リストのデフォルトソート基準メトリックに対応する属性メトリックです。
派生実験を読み取るためのモードを on (すべての派生実験を有効にする) か off (すべての派生実験を無効にする) に設定します。=regexp を使用した場合、系統または実行可能ファイル名が正規表現と一致する実験のデータが有効になります。デフォルト設定は on で、すべての派生を追跡します。
.er.rc ファイルで次のコマンドを使用して、パフォーマンスアナライザのデフォルト値を追加できます。
アナライザで表示可能にするタブのデフォルトセットを設定します。各タブは、対応するレポートを生成する er_print コマンドによって指定されます。たとえば、メモリーオブジェクトのタブの場合は mobj_type、インデックスオブジェクトのタブの場合は indxobj_type になります。mpi_timeline は「MPI タイムライン」タブを、mpi_chart は「MPI グラフ」タブを、timeline は「タイムライン」タブを、headers は「実験」タブを指定します。
読み込まれた実験内のデータがサポートするタブだけが表示されます。
スレッドアナライザの実験を確認するために tha コマンドでアナライザを起動したときに表示可能にするタブのデフォルトセットを設定します。読み込まれた実験内のデータがサポートするタブだけが表示されます。
パフォーマンスアナライザの「タイムライン」タブの表示モードオプションを設定します。オプションのリストは、コロン区切りのリストです。使用できるオプションを次の表に示します。
表 5–6 タイムラインの表示モードのオプション
オプション |
意味 |
---|---|
lw[p] |
LWP のイベントを表示する |
t[hread] |
スレッドのイベントを表示する |
c[pu] |
CPU のイベントを表示する |
r[oot] |
ルートで呼び出しスタックを配置する |
le[af] |
リーフで呼び出しスタックを配置する |
d[epth] nn |
表示できる呼び出しスタックの最大深さを設定する |
lwp、thread、cpu の各オプションは相互排他的です。root と leaf も相互排他的です。相互排他オプションの複数のセットをリストに含めた場合、最後のオプションだけが使用されます。
パフォーマンスアナライザの「タイムライン」タブに表示されるデフォルトのデータの種類を選択します。種類リストの種類はコロンで区切られます。使用できるタイプを次の表に示します。
表 5–7 タイムラインに表示するデータの種類
種類 |
意味 |
---|---|
sa[mple] |
標本データを表示する |
c[lock] |
時間プロファイルデータを表示する |
hw[c] |
ハードウェアカウンタプロファイルデータを表示する |
sy[nctrace] |
スレッド同期トレースデータを表示する |
mp[itrace] |
MPI トレースデータを表示する |
he[aptrace] |
ヒープトレースデータを表示する |
次のコマンドにより、er_print ユーティリティーでさまざまなタスクが実行されます。
処理データから蓄積された統計を出力します。
file に指定したスクリプトファイル内の追加コマンドを処理します。
現在の er_print ユーティリティーのバージョン情報を出力します。
現在のスクリプトの処理を打ち切るか、対話モードを終了します。
er_print コマンドの一覧を表示します。
フィルタを定義する式と、メモリーオブジェクトインデックスを算出するために使用される式には、共通の文法が使用されます。
その文法は、式を演算子とオペランドの組み合わせとして指定します。フィルタの場合は、式が真と評価されるとパケットが包含され、式が偽と評価されるとパケットが除外されます。メモリーオブジェクトまたはインデックスオブジェクトの場合、式は、パケット内で参照される特定のメモリーオブジェクトまたはインデックスオブジェクトを定義するインデックスへと評価されます。
式のオペランドは定数か、データレコード内のフィールドになります。describe コマンドで一覧表示できます。オペランドには、THRID、LWPID、CPUID、USTACK、XSTACK、MSTACK、LEAF、VIRTPC、PHYSPC、VADDR、PADDR、DOBJ、TSTAMP、SAMPLE、EXPID、PID、またはメモリーオブジェクトの名前が含まれます。オペランドの名前は大文字と小文字が区別されません。
USTACK、XSTACK、および MSTACK は、それぞれユーザー表示、上級表示、マシン表示の関数呼び出しスタックを表します。
VIRTPC、PHYSPC、VADDR、および PADDR は、ハードウェアカウンタプロファイリングまたは時間プロファイリングで「+」が指定された場合のみゼロ以外になります。さらに、VADDR は、実際の仮想アドレスが決定できなかった場合、256 未満になります。VADDR を決定できなかった場合、または、仮想アドレスを物理アドレスにマップできなかった場合、PADDR はゼロになります。同様に、バックトラッキングが失敗した場合、または要求されなかった場合、 VIRTPC はゼロになり、VIRTPC がゼロか、VIRTPC が物理アドレスにマップできなかった場合、PHYSPC はゼロになります。
演算子は、C の表記法と C の優先順位規則に従った通常の論理演算子と算術 (シフトを含む) 演算子、要素が集合に含まれるかどうかを決める演算子 (IN)、要素集合の一部または全部が 1 つの集合に含まれるかどうかを決める演算子 (それぞれ、SOME IN か IN) のいずれかです。追加の演算子 ORDERED IN は、左側のオペランドの全要素が、右側のオペランドに同じ順序で現れているかどうかを判断するためのものです。IN 演算子は、左側のオペランドの全要素が右側のオペランドに現れることを要求しますが、順序については強制しません。If-then-else 構造は、C のように ? 演算子と : 演算子で指定されます。すべての式が正しく構文解析されるよう、小括弧を使用してください。er_print のコマンド行では、複数の行にまたがって式を分割することはできません。スクリプト内またはコマンド行では、式に空白文字が含まれる場合、その式を二重引用符で囲む必要があります。
フィルタ式はブール値がパケットを包含する場合は真、除外する場合は偽と評価します。スレッド、LWP、CPU、実験 id、プロセス id、および標本のフィルタリングは、適切なキーワードと 1 つの整数を結び付ける関係式、または IN 演算子とコンマで区切った整数リストを使用した関係式に基づいて行われます。
時間フィルタリングを使用するには、TSTAMP と時間を結び付ける 1 つ以上の関係式を指定し、時間は、現在パケットが処理されている実験の開始以降のナノ秒数 (整数) で指定します。標本の時間を取得するには、overview コマンドを使用します。overview コマンドでは時間が秒単位で与えられるため、時間フィルタリングに使用するには、ナノ秒に変換する必要があります。時間は、アナライザの「タイムライン」表示から取得することもできます。
関数フィルタリングは、リーフ関数に基づいて行うか、スタック内の任意の関数に基づいて行うことができます。リーフ関数によるフィルタリングを指定するには、LEAF キーワードと整数の関数 id を結び付ける関係式を使用するか、IN 演算子と構造 FNAME(" regexp") を使用した関係式を使用します。ただし、regexp は regexp(5) のマニュアルページで指定されているような正規表現です。現在の name の設定によって指定されている関数全体の名前が一致する必要があります。
呼び出しスタック内の任意の関数に基づいたフィルタリングは、構造 FNAME(“regexp ”) 内の任意の関数が、キーワード USTACK: (FNAME("myfunc") SOME IN USTACK) によって表された関数配列に含まれるかどうかを判定することによって指定されます。
データオブジェクトのフィルタリングは、スタック関数のフィルタリングに似ており、DOBJ キーワードと構造 DNAME(" regexp") を小括弧で囲んで使用します。
メモリーオブジェクトのフィルタリングを指定するには、mobj_list コマンドに示すようなメモリーオブジェクトの名前とオブジェクトの整数インデックス、または一連のオブジェクトのインデックスを使用します。<Unknown> メモリーオブジェクトのインデックスは、-1 になります。
インデックスオブジェクトのフィルタリングを指定するには、indxobj_list コマンドに示すようなインデックスオブジェクトの名前とオブジェクトの整数インデックス、または一連のオブジェクトのインデックスを使用します。<Unknown> インデックスオブジェクトのインデックスは、-1 になります。
データオブジェクトのフィルタリングとメモリーオブジェクトのフィルタリングは、データ空間データを持つハードウェアカウンタパケットについてのみ意味があり、ほかのすべてのパケットは、そのようなフィルタリングでは除外されます。
仮想アドレスまたは物理アドレスの直接フィルタリングを指定するには、VADDR または PADDR とアドレスの間の関係式を使用します。
メモリーオブジェクトの定義 (「mobj_define mobj_type index_exp」 を参照) では、1 つの整数インデックスへと評価される式が使用され、VADDR キーワードまたは PADDR キーワードが使用されます。それらの定義は、メモリーカウンタとデータ空間データについてのハードウェアカウンタパケットにのみ適用されます。式は整数を返すか、<Unknown> メモリーオブジェクトについては -1 を返す必要があります。
インデックスオブジェクトの定義 (「indxobj_define indxobj_type index_exp」 を参照) では、1 つの整数インデックスへと評価される式が使用されます。式は整数を返すか、<Unknown> インデックスオブジェクトについては -1 を返す必要があります。
ここでは、er_print -filters コマンドまたはアナライザのフィルタダイアログボックスで使用できるフィルタ式の例を示します。
er_print -filters コマンドでは、フィルタ式は、次のように単一引用符で囲まれます。
er_print -filters 'FNAME("myfunc") SOME IN USTACK' -functions test.1.er |
ユーザー関数スタックから myfunc という名前の関数をフィルタリングするには、次のようにします。
FNAME("myfunc") SOME IN USTACK
CPU 2 上でのみ実行したスレッド 1 からのイベントを表示するには、次のようにします。
THRID == 1 && CPUID == 2
インデックスオブジェクト THRCPU が CPUID<<16|THRID として定義されている場合、次のフィルタは、上記の CPU 2 上で実行したスレッド 1 からのイベントを表示する場合のフィルタと等価です。
THRCPU == 0x10002
5 秒と 9 秒の間に発生した実験 2 のイベントをフィルタリングするには、次のようにします。
EXPID==2 && TSTAMP >= 5000000000 && TSTAMP < 9000000000
スタック内の特定の Java クラスのメソッドを持つイベントをフィルタリングするには、次のようにします。(ユーザー表示モードの場合)
FNAME("myClass.*") SOME IN USTACK
関数 ID が既知である (アナライザに表示されている) 場合、マシン呼び出しスタック内の特定の呼び出し順序を含むイベントをフィルタリングするには、次のようにします。
(314,272) ORDERED IN MSTACK
describe コマンドにより、時間プロファイリング実験の次のプロパティが一覧表示された場合は、
MSTATE UINT32 Thread state NTICK UINT32 Duration |
次のフィルタを使用して、特定の状態のイベントを選択できます。
MSTATE == 1
または、次のフィルタを使用して、特定の状態にあり、期間が 1 クロック刻みより長いイベントを選択できます。
MSTATE == 1 && NTICK > 1
ここでは、er_print コマンドの使用例を示します。
er_print -functions test.1.er |
er_print -callers-callees test.1.er |
ソース行情報は、コードのコンパイルとリンクで -g が指定されていることを前提にしています。Fortran の関数とルーチンの場合は、関数名の最後に下線を付けてください。関数名のあとの 1 は、myfunction の複数インスタンスを区別するためのものです。
er_print -source myfunction 1 test.1.er |
er_print -filters 'FNAME("myfunc") SOME IN USTACK' -functions test.1.er |
次の例は、実験から gprof 形式に似た一覧を生成します。出力は er_print.out というファイルで、先頭の 100 個の関数と、関数ごとの属性ユーザー時間でソートされた呼び出し元 - 呼び出し先データの一覧です。
er_print -outfile er_print.out -metrics e.%user -sort e.user \ -limit 100 -func -callers-callees test.1.er |
この例のコマンドを分解して、次の独立した 2 つのコマンドにすることもできます。ただし、大規模な実験またはアプリケーションでは、er_print の呼び出しのたびに、かなりの時間がかかることがありますので注意してください。
er_print -metrics e.%user -limit 100 -functions test.1.er |
er_print -metrics e.%user -callers-callees test.1.er |
このコマンドを使用するためにプログラムを実行する必要はありません。
er_src -myfile.o |
er_print -metrics ei.%wall -functions test.1.er |
er_print -metrics aei.%wall -callers-callees test.1.er |
er_print -script myscriptfile test.1.er |
myscriptfile スクリプトに er_print コマンドが含まれます。スクリプトファイルの例を次に示します。
## myscriptfile ## Send script output to standard output outfile - ## Display descriptive information about the experiments header ## Write out the sample data for all experiments overview ## Write out execution statistics, aggregated over ## the current sample set for all experiments statistics ## List functions functions ## Display status and names of available load objects object_list ## Write out annotated disassembly code for systime, ## to file disasm.out outfile disasm.out disasm systime ## Write out annotated source code for synprog.c ## to file source.out outfile source.out source synprog.c ## Terminate processing of the script quit |