プロファイルデータのユーザーモードの表示では、プログラムが実際に「OpenMP ソフトウェア実行の概要」で説明されている直観的モデルに従って実行されたかのように情報が提示されます。マシンモードで表示される実際のデータは、ランタイムライブラリ libmtsk.so の実装の詳細を取り込んだもので、これは、モデルに対応していません。上級モードでは、モデルに合うように変更されたデータと、実際のデータが表示されます。
ユーザーモードでは、プロファイルデータの表示はモデルにさらに近くなるよう変更されるため、記録されたデータやマシンモードの表示と次の 3 つの点で異なっています。
擬似関数は、OpenMP ランタイムライブラリの視点から各スレッドの状態を表すように構築されます。
呼び出しスタックは、前述のように、コードの実行方法のモデルに対応するデータを報告するよう操作されます。
時間ベースのプロファイル実験用に、2 つの追加パフォーマンスメトリックスが構築され、それらは、有益な作業の実行に費やされた時間と、OpenMP ランタイム内での待機に費やされた時間に対応します。メトリックスは、OpenMP ワークメトリックスとOpenMP 待ちメトリックスです。
OpenMP 3.0 プログラムでは、3 つ目のメトリックス、OpenMP オーバーヘッドメトリックスが構築されます。
擬似関数は、スレッドが OpenMP ランタイムライブラリ内でいずれかの状態にあったイベントを反映するために構築され、ユーザーモードおよび上級モード呼び出しスタック上に置かれます。
次の疑似関数が定義されています。
<OMP-overhead> |
OpenMP ライブラリ内で実行中 |
<OMP-idle> |
作業を待っているスレーブスレッド |
<OMP-reduction> |
縮約操作を実行中のスレッド |
<OMP-implicit_barrier> |
暗黙のバリアで待機中のスレッド |
<OMP-explicit_barrier> |
明示的なバリアで待機中のスレッド |
<OMP-lock_wait> |
ロックを待っているスレッド |
<OMP-critical_section_wait> |
critical セクションに入るのを待っているスレッド |
<OMP-ordered_section_wait> |
ordered セクションに入る順番を待っているスレッド |
<OMP-atomic_section_wait> |
OpenMP 原子構造で待機中のスレッド |
スレッドが、擬似関数のいずれかに対応する OpenMP ランタイム状態にある場合、擬似関数がスタック上のリーフ関数として追加されます。スレッドの実際のリーフ関数は、OpenMP ランタイムのどこかに存在する場合には、リーフ関数として <OMP-overhead> に置き換えられます。そうでない場合、OpenMP ランタイムに入っているすべての PC は、ユーザーモードスタックから除外されます。
OpenMP 3.0 プログラムでは、<OMP-overhead> 擬似関数は使用されません。この擬似関数は、OpenMP オーバーヘッドメトリックスに置き換えられています。
OpenMP 実験の場合は、OpenMP を使用せずにプログラムがコンパイルされたときに取得されたものと同様の、再構築された呼び出しスタックが表示されます。目標は、実際の処理の詳細すべてを示すことではなく、プログラムを直観的に理解できるようにプロファイルデータを表示することです。OpenMP ランタイムライブラリが特定の操作を実行しているときは、マスタスレッドとスレーブスレッドの呼び出しスタックがまとめられ、呼び出しスタックに <OMP-*> 擬似関数が追加されます。