Oracle® Developer Studio 12.5: パフォーマンスアナライザ

印刷ビューの終了

更新: 2016 年 6 月
 
 

「ソース」タブ、「逆アセンブリ」タブ、「PC」タブの特別な行

パフォーマンスアナライザでは、コード行、命令、またはプログラムカウンタに直接には対応していないいくつかの行が「ソース」、「逆アセンブリ」、および「PC」ビューに表示されます。以降のセクションでは、これらの特別な行について説明します。

アウトライン関数

フィードバック最適化コンパイルで、アウトライン関数が作成されることがあります。これらは、「ソース」ビューと「逆アセンブリ」ビューに特殊なインデックス行として表示されます。「ソース」ビューでは、アウトライン関数に変換されたコードのブロックに注釈が表示されます。

                   Function binsearchmod inlined from source file ptralias2.c into the 
0.       0 .         58.         if( binsearchmod( asize, &element ) ) {
0.240    0.240       59.             if( key != (element << 1) ) {
0.       0.          60.                 error |= BINSEARCHMODPOSTESTFAILED;
                        <Function: main -- outline code from line 60 [_$o1B60.main]>
0.040    0.040     [ 61]                 break;
0.       0.          62.             }
0.       0.          63.         }

「逆アセンブリ」ビューでは、アウトライン関数は通常、ファイルの末尾に表示されます。

                        <Function: main -- outline code from line 85 [_$o1D85.main]>
0.       0.             [ 85] 100001034:  sethi       %hi(0x100000), %i5
0.       0.             [ 86] 100001038:  bset        4, %i3
0.       0.             [ 85] 10000103c:  or          %i5, 1, %l7
0.       0.             [ 85] 100001040:  sllx        %l7, 12, %l5
0.       0.             [ 85] 100001044:  call        printf ! 0x100101300
0.       0.             [ 85] 100001048:  add         %l5, 336, %o0
0.       0.             [ 90] 10000104c:  cmp         %i3, 0
0.       0.             [ 20] 100001050:  ba,a        0x1000010b4
                        <Function: main -- outline code from line 46 [_$o1A46.main]>
0.       0.             [ 46] 100001054:  mov         1, %i3
0.       0.             [ 47] 100001058:  ba          0x100001090
0.       0.             [ 56] 10000105c:  clr         [%i2]
                        <Function: main -- outline code from line 60 [_$o1B60.main]>
0.       0.             [ 60] 100001060:  bset        2, %i3
0.       0.             [ 61] 100001064:  ba          0x10000109c
0.       0.             [ 74] 100001068:  mov         1, %o3

アウトライン関数の名前は角括弧内に表示され、コードの取り出し元関数の名前や、ソースコード内のセクションの先頭の行番号を含む、アウトライン化したコードのセクションに関する情報をエンコードします。これらの符号化された名前は、リリースごとに異なります。パフォーマンスアナライザは、読みやすいバージョンの関数名を表示します。詳細は、アウトライン関数を参照してください。

アプリケーションのパフォーマンスデータの収集時にアウトライン関数が呼び出されると、パフォーマンスアナライザは、注釈付き逆アセンブリに特殊な行を表示して、その関数の包括的メトリックを示します。詳細は、包括的メトリックを参照してください。

コンパイラ生成の本体関数

関数内のループまたは並列化ディレクティブが指定された領域を並列化する場合、コンパイラは、元のソースコードには含まれていない新しい本体関数を作成します。こうした関数については、OpenMP実行の概要 で説明しています。

コンパイラは、並列構造の種類、構造が抽出された元の関数の名前、構造の元のソース内の先頭の行番号、および並列構造のシーケンス番数をエンコードする本体関数に符号化された名前を割り当てます。これらの符号化された名前は、マイクロタスクライブラリのリリースごとに異なりますが、より分かりやすい名前に復号化されて表示されます。

次の例は、マシンモードで関数リストに表示される一般的なコンパイラ生成の本体関数を示しています。

7.415      14.860      psec_ -- OMP sections from line 9 [_$s1A9.psec_]
3.873       3.903      craydo_ -- MP doall from line 10 [_$d1A10.craydo_]

これらの例では、構造が抽出された元の関数の名前が最初に示され、次に並列構造の種類、並列構造の行番号、コンパイラ生成の本体関数の符号化された名前が角括弧で示されます。 同様に、逆アセンブリコード内にも特殊なインデックス行が生成されます。

0.       0.            <Function: psec_ -- OMP sections from line 9 [_$s1A9.psec_]>
0.       7.445         [24]    1d8cc:  save        %sp, -168, %sp
0.       0.            [24]    1d8d0:  ld          [%i0], %g1
0.       0.            [24]    1d8d4:  tst         %i1
0.       0.            <Function: craydo_ -- MP doall from line 10 [_$d1A10.craydo_]>
0.       0.030         [ ?]    197e8:  save        %sp, -128, %sp
0.       0.            [ ?]    197ec:  ld          [%i0 + 20], %i5
0.       0.            [ ?]    197f0:  st          %i1, [%sp + 112]
0.       0.            [ ?]    197f4:  ld          [%i5], %i3

Cray のディレクティブでは、関数はソースコード行番号に関連付けされていない可能性があります。このような場合、行番号の代わりに [ ?] が表示されます。注釈付きソースコードにインデックス行が表示される場合は、次の例に示すように、インデックス行は行番号なしで命令を示します。

                     9. c$mic  doall shared(a,b,c,n) private(i,j,k)
                  
                   Loop below fused with loop on line 23
                   Loop below not parallelized because autoparallelization 
                     is not enabled
                   Loop below autoparallelized
                   Loop below interchanged with loop on line 12
                   Loop below interchanged with loop on line 12
3.873     3.903         <Function: craydo_ -- MP doall from line 10 [_$d1A10.craydo_],
                      instructions without line numbers>
0.        3.903     10.            do i = 2, n-1

注 -  インデックス行やコンパイラのコメント行は、実際の表示では折り返されません。

動的にコンパイルされる関数

動的にコンパイルされる関数は、プログラムの実行中にコンパイルおよびリンクされる関数です。コレクタ API 関数collector_func_load() を使用して必要な情報をユーザーが提供しないかぎり、コレクタは C や C++ で記述された動的にコンパイルされる関数に関する情報を持っていません。「関数」ビュー、「ソース」ビュー、および「逆アセンブリ」ビューに表示される情報は、次のように、collector_func_load() に渡される情報によって異なります。

  • 情報が指定されない場合、collector_func_load() は呼び出されません。動的にコンパイルおよびロードされた関数は、<Unknown> として関数リストに表示されます。パフォーマンスアナライザには、関数ソースも逆アセンブリコードも表示されません。

  • ソースファイル名や行番号テーブルは指定されていないが、関数の名前、そのサイズとアドレスが指定されている場合は、動的にコンパイルおよびロードされた関数の名前とそのメトリックが関数リストに表示されます。注釈付きソースが使用可能であり、逆アセンブリ命令が表示されます。ただし、行番号は、不明であることを示すために [?] で指定されます。

  • ソースファイル名は指定されているが、行番号テーブルが指定されていない場合、ソースファイル名を指定しない場合と同様の情報がパフォーマンスアナライザによって表示されます。ただし、注釈付きソースの先頭には、関数が行番号のない命令で構成されていることを示す特殊なインデックス行が表示されます。次に例を示します。

    1.121     1.121          <Function func0, instructions without line numbers>
                          1. #include        <stdio.h>
  • ソースファイル名と行番号テーブルが指定されている場合、関数とそのメトリックは、従来の方法でコンパイルされた関数と同様に「関数」ビュー、「ソース」ビュー、および「逆アセンブリ」ビューに表示されます。

コレクタ API 関数の詳細については、動的な関数とモジュールを参照してください。

Java プログラムでは、ほとんどのメソッドが JVM ソフトウェアによってインタプリタされます。別個のスレッドで動作する Java HotSpot 仮想マシンは、インタプリタの実行中にパフォーマンスをモニターします。モニタリングプロセス中、仮想マシンは、1 つ以上の解釈されたメソッドを取得し、それらのメソッドのためのマシンコードを生成し、元のマシンコードを解釈するのではなくさらに効率的なマシンコードバージョンを実行すると決定する場合があります。

Java プログラムの場合は、コレクタ API 関数を使用する必要はありません。パフォーマンスアナライザは、次の例に示すように、メソッドのインデックス行の下にある特殊な行を使用して、注釈付き逆アセンブリリスト内に Java HotSpot コンパイル済みコードが存在することを示します。

                   11.    public int add_int () {
                   12.       int       x = 0;
2.832     2.832      <Function: Routine.add_int: HotSpot-compiled leaf instructions>
0.        0.         [ 12] 00000000: iconst_0
0.        0.         [ 12] 00000001: istore_1

逆アセンブリリストには、コンパイルされた命令ではなく、解釈されたバイトコードのみが示されます。デフォルトでは、コンパイルされたコードのメトリックは、特別な行の隣りに表示されます。排他的および包括的 CPU 時間は、解釈されたバイトコードの行ごとに示されているすべての包括的および排他的 CPU 時間の合計とは異なります。一般に、メソッドが何回か呼び出された場合、コンパイルされた命令の CPU 時間は、解釈されたバイトコードの CPU 時間の合計より長くなります。この不一致は、解釈されたコードがメソッドの最初の呼び出し時に 1 回だけ実行されるのに対して、コンパイルされたコードはそれ以降に実行されるために発生します。

注釈付きソースには、Java HotSpot でコンパイルされた関数は表示されません。その代わりに、行番号なしで命令を示す特別なインデックス行が表示されます。たとえば、前述の例で逆アセンブリの抽出に対応する注釈付きソースは次のようになります。

                     11.    public int add_int () {
2.832     2.832        <Function: Routine.add_int(), instructions without line numbers>
0.        0.         12.       int       x = 0;
                       <Function: Routine.add_int()>

Java ネイティブ関数

ネイティブコードは、元は C、C++、または Fortran で記述されたコンパイル済みのコードで、Java コードから Java Native Interface (JNI) を介して呼び出されます。次の例は、デモプログラム jsynprog に関連付けられたファイル jsynprog.java の注釈付き逆アセンブリからの抜粋です。

                     5. class jsynprog
                        <Function: jsynprog.<init>()>
0.       5.504          jsynprog.JavaCC() <Java native method>
0.       1.431          jsynprog.JavaCJava(int) <Java native method>
0.       5.684          jsynprog.JavaJavaC(int) <Java native method>
0.       0.             [  5] 00000000: aload_0
0.       0.             [  5] 00000001: invokespecial <init>()
0.       0.             [  5] 00000004: return

ネイティブメソッドは Java ソースに含まれていないため、jsynprog.java の注釈付きソースの先頭には、行番号なしで命令を示す特別なインデックス行を使って各 Java ネイティブメソッドが表示されます。

0.       5.504          <Function: jsynprog.JavaCC(), instructions without line 
                           numbers>
0.       1.431          <Function: jsynprog.JavaCJava(int), instructions without line 
                           numbers>
0.       5.684          <Function: jsynprog.JavaJavaC(int), instructions without line 
                           numbers>

注 -  実際の注釈付きソースの表示では、インデックス行は折り返されません。

クローン関数

コンパイラには、渡される引数の一部が定数である関数の呼び出しなど、追加の最適化を実行できる関数の呼び出しを認識する機能があります。 コンパイラは、最適化できる特定の呼び出しを識別すると、クローンと呼ばれるこの関数のコピーを作成し、最適化されたコードを生成します。

注釈付きソースでは、コンパイラ解説は、クローン関数が作成されているかどうかを示します。

0.       0.       Function foo from source file clone.c cloned, 
                   creating cloned function _$c1A.foo; 
                   constant parameters propagated to clone
0.       0.570     27.    foo(100, 50, a, a+50, b);

注 -  実際の注釈付きソースの表示では、コンパイラのコメント行は折り返されません。

クローン関数名は、特定の呼び出しを識別する符号化された名前です。前述の例では、コンパイラ解説は、クローン関数の名前が _$c1A.foo であることを示します。次に示すように、この関数は関数リストに表示されます。

0.350     0.550     foo
0.340     0.570     _$c1A.foo

クローン関数はそれぞれ異なる命令セットを持っているため、注釈付き逆アセンブリリストにはクローン関数が個別に表示されます。これらはソースファイルに関連付けられていないため、命令はいずれのソース行番号とも関連付けられていません。次の例は、クローン関数の注釈付き逆アセンブリの最初の数行を示しています。

0.       0.           <Function: _$c1A.foo>
0.       0.           [?]    10e98:  save        %sp, -120, %sp
0.       0.           [?]    10e9c:  sethi       %hi(0x10c00), %i4
0.       0.           [?]    10ea0:  mov         100, %i3
0.       0.           [?]    10ea4:  st          %i3, [%i0]
0.       0.           [?]    10ea8:  ldd         [%i4 + 640], %f8

静的関数

ライブラリで内部的に使用される名前が、ユーザーが使用する可能性のある名前と競合しないように、ライブラリ内ではほとんど静的関数が使用されます。ライブラリをストリップすると、静的関数の名前はシンボルテーブルから削除されます。このような場合、パフォーマンスアナライザは、ストリップ済み静的関数を含むライブラリ内のテキスト領域ごとに擬似的な名前を生成します。この名前は <static>@0x12345 という形式で、@ 記号に続く文字列は、ライブラリ内のそのテキスト領域のオフセットを表します。パフォーマンスアナライザは、連続する複数のストリップ済み静的関数と単一のストリップ済み静的関数を区別できないため、2 つ以上のストリップ済み静的関数が、各メトリックがまとめられた状態で表示される場合があります。次の例は、サンプルの jsynprog デモの関数リスト内の静的関数を示しています。

0.       0.       <static>@0x18780
0.       0.       <static>@0x20cc
0.       0.       <static>@0xc9f0
0.       0.       <static>@0xd1d8
0.       0.       <static>@0xe204

「PC」ビューでは、これらの関数は、次のようにオフセットとともに表示されます。

0.       0.       <static>@0x18780 + 0x00000818
0.       0.       <static>@0x20cc + 0x0000032C
0.       0.       <static>@0xc9f0 + 0x00000060
0.       0.       <static>@0xd1d8 + 0x00000040
0.       0.       <static>@0xe204 + 0x00000170

ストリップ済みライブラリ内で呼び出された関数は、「PC」ビューで次のように表示される場合もあります。

<library.so> -- no functions found + 0x0000F870

包括的メトリック

注釈付き逆アセンブリでは、アウトライン関数にかかった時間にタグを付けるための特殊な行が存在します。

次の例は、アウトライン関数が呼び出されたときに表示される注釈付き逆アセンブリを示しています。

0.       0.        43.         else
0.       0.        44.         {
0.       0.        45.                 printf("else reached\n");
0.       2.522         <inclusive metrics for outlined functions>

ストア命令とロード命令の注釈

–xhwcprof オプションでコンパイルすると、コンパイラは、ストア (st) 命令とロード (ld) 命令についての追加情報を生成します。逆アセンブリリストに、注釈付きの st 命令と ld 命令が表示されます。

分岐先

–xhwcprof オプションでコンパイルした場合、注釈付き逆アセンブリリストに表示される擬似行 <branch target> は、複数のコードパスから到達できる命令の PC に対応します。