3.1.11.3. 基本プロファイラ

基本プロファイラは、サンプリング解析でプログラム全体の統計情報を計測および出力を行います。

3.1.11.3.1. 概要

基本プロファイラはプロファイルデータを計測するfippコマンドと、計測したデータからプロファイル結果を出力するfipppxコマンドの2つから構成されます。基本プロファイラが出力可能な統計情報は以下のとおりです。

  • 時間統計情報

  • CPU動作状況

  • コスト情報

  • コールグラフ情報

  • ソースコード情報

詳細プロファイラの使用の流れは以下のとおりです。

../../../_images/InstantProfiler_01.png

3.1.11.3.2. 計測区間指定ルーチンの追加

指定した区間のプロファイルデータを計測するには、計測区間指定ルーチン/関数をソースコードに追加します。
計測区間指定機能は、Fortran言語のサブルーチン、C/C++の関数として使用可能です。
C/C++の関数を使用する場合は、関数のプロトタイプを宣言するか、または、プロファイラサブルーチンのヘッダファイルをインクルードする必要があります。

言語種別

ヘッダファイル

サブルーチン/関数名

引数

機能

Fortran

なし

fipp_start
fipp_stop

なし

コスト情報測定開始
コスト情報測定終了

C/C++

fj_tool/fipp.h

void fipp_start
void fipp_stop

なし

コスト情報測定開始
コスト情報測定終了

注意

  • これらのサブルーチン/関数を利用して測定データを収集するには、fippコマンドに、-Sregionオプションを指定してください。

  • これらのサブルーチン/関数を複数回呼び出す場合、必ず fipp_start、fipp_stop の順番で呼び出してください。fipp_stop を呼び出す前に再度 fipp_start を呼び出した場合、または fipp_start を呼び出す前に fipp_stop を呼び出した場合、警告メッセージを出力してその呼び出しを無視します。また、fipp_stop を呼び出さずにプロセスが終了した場合、その区間のプロファイルデータは計測しません。

  • これらのサブルーチン/関数を複数回呼び出した場合、指定したすべての計測区間の結果を合算します。

  • MPIプログラムの場合、計測対象にしたいすべてのプロセスでこれらのサブルーチン/関数を呼び出してください。呼び出しが行われなかったプロセスのプロファイルデータは計測しません。

計測区間指定ルーチンの使用例を示します。

  • Fortranの例

    1. サンプル指定例

    program main
    ...
    do i=1,10000
      ...
      call fipp_start   ! 計測を開始する
      do j=1,10000
      ...
      end do
      call fipp_stop    ! 計測を終了する
    end do
    end program main
    
    1. すべてのプロセスを計測対象とする例(mpi_initサブルーチンを呼び出す前に計測を開始する)

    call fipp_start     ! 計測を開始する
    call mpi_init(err)
    ...
    call mpi_finalize(err)
    call fipp_stop      ! 計測を終了する
    
    1. すべてのプロセスを計測対象とする例(mpi_initサブルーチンを呼び出した直後に計測を開始する)

    call mpi_init(err)
    call fipp_start     ! 計測を開始する
    ...
    call fipp_stop      ! 計測を終了する
    call mpi_finalize(err)
    
    1. プロセス0のみ計測対象とする例

    call mpi_init(err)
    call mpi_comm_rank(mpi_comm_world,rank,err)
    if(rank==0) then
      call fipp_start   ! プロセス0のみ、計測を開始する
    end if
      ...
    if(rank==0) then
      call fipp_stop    ! プロセス0のみ、計測を終了する
    end if
    call mpi_finalize(err)
    
  • C/C++の例

    1. サンプル指定例

    #include "fj_tool/fipp.h" // ヘッダーファイルのインクルード
    ...
    int main(void)
    {
      int i,j;
      for(i=0;i<10000;i++){
        ...
        fipp_start();   // 計測を開始する
        for(j=0;j<10000;j++){
           ...
        }
        fipp_stop();    // 計測を終了する
      }
      return 0;
    }
    
    1. すべてのプロセスを計測対象とする例(MPI_Init関数を呼び出す前に計測を開始する)

    fipp_start();       // 計測を開始する
    MPI_Init(&argc, &argv);
    ...
    MPI_Finalize();
    fipp_stop();        // 計測を終了する
    
    1. すべてのプロセスを計測対象とする例(MPI_Init関数を呼び出した直後に計測を開始する)

    MPI_Init(&argc, &argv);
    fipp_start();       // 計測を開始する
    ...
    fipp_stop();        // 計測を終了する
    MPI_Finalize();
    
    1. プロセス0のみ計測対象とする例

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if(rank==0){
      fipp_start();     // プロセス0のみ、計測を開始する
    }
    ...
    if(rank==0){
      fipp_stop();      // プロセス0のみ、計測を終了する
    }
    MPI_Finalize();
    

3.1.11.3.3. コンパイル/リンク

基本プロファイラ機能を利用するために必要なツールライブラリは、コンパイル/リンク時にデフォルトでリンクされます。
したがって、コンパイル/リンク時にプロファイラ用のオプション等はありません。
なお、コンパイル/リンクはログインノード、または、計算ノードで行います。
  • コンパイル/リンク例(MPIプログラムの場合)

[_LNlogin]$ mpifrtpx -Kfast,parallel "ソースファイル名"
  • コンパイル/リンク例(逐次/スレッド並列プログラムの場合)

[_LNlogin]$ frtpx -Kfast,parallel "ソースファイル名"

注意

分割コンパイルを行う場合は、適切なプロファイラのライブラリがリンクされるように、原則としてコンパイル時に指定した最適化オプションは、リンク時にも指定してください。

例)OpenMPを利用するプログラムは、リンク時にも-Kopenmpオプションを指定する。

3.1.11.3.3.1. Fortranの翻訳時オプションについて

Fortranプログラムを翻訳する際に使用するプロファイラ向け翻訳時オプションを以下に示します。
本オプションはリンク時に有効になります。

オプション

説明

-Nfjprof

ツールライブラリを結合します。 省略時は-Nfjprofが有効になります。

-Nnofjprof

ツールライブラリを結合しません。 プロファイラを使用できません。

3.1.11.3.3.2. C/C++の翻訳時オプションについて

C/C++言語の場合、tradモードとclangモードという2種類のコンパイルモードが存在します。
以下に、プログラムを翻訳する際に使用するプロファイラ向けの翻訳時オプションをモードごとに示します。
本オプションはリンク時に有効になります。

モード

オプション

説明

trad

-Nfjprof

ツールライブラリを結合します。省略時は-Nfjprofが有効になります。

trad

-Nnofjprof

ツールライブラリを結合しません。プロファイラは使用できません。

clang

-ffj-fjprof

ツールライブラリを結合します。省略時は-ffj-fjprofが有効になります。

clang

-ffj-no-fjprof

ツールライブラリを結合しません。プロファイラは使用できません。

3.1.11.3.4. プロファイルデータの計測

プロファイルデータは、fippコマンドを使用して計測します。
本操作は計算ノードで実施します。

fippコマンドの実行例を示します。

[条件]

  • fippコマンドは、実行モジュール(a.out)を指定している箇所に追加

  • -dオプションで指定したディレクトリ(profiling_data)にデータを収集

[MPIプログラム]

#!/bin/sh
#
#PJM -L "node=2x2x2"
#PJM -L "rscgrp=small"
#PJM -L "elapse=01:00:00"
#PJM -x PJM_LLIO_GFSCACHE=/vol000N
#PJM -g groupname
#PJM -s
#
fipp -C -d profiling_data -Icall,mpi mpiexec ./a.out

[逐次/スレッド並列プログラム]

#!/bin/sh
#
#PJM -L "node=1"
#PJM -L "rscgrp=small"
#PJM -L "elapse=01:00:00"
#PJM -x PJM_LLIO_GFSCACHE=/vol000N
#PJM -g groupname
#PJM -s
#
fipp -C -d profiling_data -Icall,cpupa ./a.out

注意

fippコマンドにより計測したプロファイルデータに対して以下を行った場合、動作保証しません。

  • プロファイルデータの編集

  • プロファイルデータの追加、削除、リネーム

3.1.11.3.5. プロファイラのオプション

fippコマンドのオプションについて説明します。

オプション

説明

-C
(必須オプション)

プロファイルデータの計測を指示します。本オプションを省略した場合、エラーメッセージを出力しプログラムの実行を終了します。

-d profile_data
(必須オプション)
プロファイルデータを格納するディレクトリを指定します。本オプションを省略した場合、エラーメッセージを出力しプログラムの実行を終了します。
profile_dataにはプロファイルデータを格納するディレクトリ名を相対、または、絶対パスで指定します。指定したディレクトリは新規作成、または、空のディレクトリでなければいけません。
実行中にカレントディレクトリを移動するプログラムを解析する場合、profile_dataは絶対パスで指定してください。
プロファイラはprofile_dataの下に1000ファイルごとのサブディレクトリを作成します。このため、大規模ジョブが対象の場合もprofile_dataを指定するだけで使用できます。

exec-file [ exec_option ... ]

プロファイルデータの計測対象となる実行ファイルとオプションを指定します。MPIプログラムの場合、mpiexecから指定します。

-H[mode={all|user}]

CPU動作状況の計測内容について指定します。サブオプションmode=には、all、または、userのどちらか1つを指定します。本オプション、または、サブオプションmode={all|user}省略時は、mode=allが有効になります。

mode=all

カーネルモードおよびユーザーモードにおける計測を行います。

mode=user

ユーザーモードにおける情報計測を行います。

-Iitem
(ハイフン+大文字アイ)
基本プロファイラで計測する項目を指定します。複数のitemを指定する場合は、カンマで区切ってください。
item :{{call | nocall} | {cpupa | nocpupa} | {mpi | nompi}}
call:

コールグラフ情報を収集します。

nocall:

コールグラフ情報を収集しません。省略時は-Inocallが有効になります。

cpupa:

CPU動作状況を計測します。省略時は-Icpupaが有効になります。

nocpupa:

CPU動作状況を計測しません。

mpi:

MPIコスト情報を計測します。対象がMPIプログラムの場合の省略時は-Impiが有効になります。

nompi:

MPIコスト情報を計測しません。対象が非MPIプログラムの場合の省略時は-Inompiが有効になります。

-i interval

プロファイルデータを計測するサンプリング間隔を指定します。interval にはサンプリング間隔を整数値(ミリ秒単位)で指定します。本オプション省略時は、-i 100オプションが有効になります。intervalには、10から3,600,000 の範囲の整数値を指定します。

-L{shared | noshared}

翻訳時オプション-Nlineを指定して生成した共有ライブラリの計測方法を指定します。

shared

行情報付き共有ライブラリ内の以下の情報を計測します。

  • 手続の開始行番号

  • 手続の終了行番号

  • ループコスト分布情報

  • 行コスト分布情報

noshared

行情報付き共有ライブラリ内の情報を計測しません。省略時は-Lnosharedが有効になります。

-l limit

手続情報の計測件数を指定します。
出力件数以上の手続情報は、__other__として合算して計測します。
本オプション省略時は、-l 0オプションが有効になります。limit には、0から2,147,483,647の範囲の整数値を指定します。limitに 0 を指定した場合、全件を計測します。

-m memsize

計測時に使用する作業用メモリサイズを整数値(KB単位)で指定します。
作業用メモリの領域はスレッドごとに確保します。
本オプション省略時は、-m 3000オプションが有効になります。memsizeには、1から2,147,483 の範囲の整数値を指定します。

-P{userfunc | nouserfunc}

翻訳時オプション-Nlineまたは-ffj-lineを指定したオブジェクト(以降、行情報付きオブジェクトと呼びます)と翻訳時オプション-Nnolineまたは-ffj-no-lineを指定したオブジェクト(以降、行情報なしオブジェクトと呼びます)が混在している場合の手続コストの計上方法を指定します。標準ライブラリまたは-Lnoshared指定時の共有ライブラリは行情報なしオブジェクトとして扱います。

userfunc

行情報なしオブジェクトの手続にコストが計上された場合、コールグラフ情報から行情報なしオブジェクトの手続を呼び出した手続を遡ります。行情報付きのオブジェクトの手続が存在した場合、その手続にコストを計上します。行情報付きのオブジェクトの手続が存在しなかった場合、コストは計上しません。-Puserfuncオプション指定時は、-Icallオプションも同時に指定しなければなりません。-Icallオプションを指定しない場合、エラーメッセージを出力し収集コマンドの処理を終了します。

nouserfunc

行情報なしオブジェクトの手続にコストが計上された場合、その手続にコストを計上します。ただし、手続開始行、手続終了行は出力しません。

-S{all | region}

プロファイルデータの計測区間を指定します。

all

プログラム全体を計測します。省略時は-Sallが有効になります。

region

計測区間指定ルーチンで指定した区間内を計測します。ソースコード内に計測区間指定ルーチンを挿入する必要があります。

-W{spawn|nospawn}

動的生成されたプロセスに対する計測方法を指定します。省略時の指定は、MPIプログラムの場合、-Wspawnオプションが有効になり、非MPIプログラムの場合、-Wnospawnオプションが有効になります。

spawn

動的生成されたプロセスの統計情報を計測します。

nospawn

動的生成されたプロセスの統計情報を計測しません。

3.1.11.3.6. プロファイル結果の出力

fipppxコマンドを使用して、fippコマンドで計測したプロファイルデータの結果を出力します。

本操作は使用するノードによって異なるコマンドを使用します。

  • ログインノードの場合

    fipppxコマンドを使用します。

  • 計算ノードの場合

    fippコマンドを使用します。

fipppxコマンドの実行例を以下に示します。

[_LNlogin]$ fipppx -A -pall -Ibalance,call -d profiling_data
この例では、全てのプロセスの情報を出力する指定(-pall)をしています。
高並列で実行した結果では、全てのプロセスを出力対象にすると出力が膨大になる場合があります。着目するプロセスがあらかじめ分かっている場合は、-p0,1(プロセス0と1)のようにプロセス番号を指定して出力することもできます。

3.1.11.3.6.1. fipppxコマンドのオプション

オプション

機能・測定値(単位)

-A
(必須オプション)

プロファイル結果の出力処理を指示します。

-d profile_data
(必須オプション)

プロファイルデータを格納したディレクトリを、 profile_data に相対パスまたは絶対パスで指定します。

-f func_name

プログラムが使用している手続名を func_name に指定して、func_name に関する情報を出力します。
ただし、fippコマンドで、func_name の手続に関する情報を計測していない、または、 func_name の手続コストが 0 の場合、-ffunc_nameを指定しても情報は出力されません。
-Iitem
(ハイフン+大文字アイ)
プロファイル結果の出力対象とする項目を指定します。
複数のitemを指定する場合は、カンマで区切ってください。
item:{{balance | nobalance}|} | {call | nocall}|} | {cpupa | nocpupa}|} | {mpi | nompi} | {src[:path ] | nosrc}}}}
balance:

コスト情報にコストバランス情報を出力します。ただし、逐次プログラムの場合、または、-txmlオプションを指定した場合、-Ibalanceオプションを指定してもコストバランス情報は出力されません。

nobalance:

コスト情報にコストバランス情報を出力しません。省略時は-Inobalanceが有効になります。

call:

コールグラフ情報を出力します。

nocall:

コールグラフ情報を出力しません。省略時は-Inocallが有効になります。

cpupa:

CPU動作状況を出力します。省略時は-Icpupaが有効になります。

nocpupa:

CPU動作状況を出力しません。

mpi:

MPIコスト情報を出力します。対象がMPIプログラムの場合の省略時は-Impiが有効になります。

nompi:

MPIコスト情報を出力しません。対象が非MPIプログラムの場合の省略時は-Inompiが有効になります。

src[:path ]:

ソースコード情報と行ごとのコストを出力します。行ごとのコストには、-Impiオプションで出力するコストは含みません。pathには、ソースコードが存在するディレクトリパスを指定します。pathを複数指定する場合、コロン(:)で区切って指定してください。

nosrc:

ソースコード情報を出力しません。省略時は-Inosrcが有効になります。

-l limit
(小文字のエル)
出力する手続情報の出力件数を指定します。
本オプション省略時は、-l 10オプションが有効になります。
limit には、0から2,147,483,647の範囲の整数値を指定します。limit に 0 を指定した場合、全件を出力します。

-o outfile

プロファイル結果の出力先を指定します。outfile には、出力先ファイル名を相対パスまたは絶対パスで指定するか、または、"stdout"を指定します。
本オプション省略時は、-ostdoutオプションが有効になります。

-pp_no

プロファイル結果に出力するプロセスを指定します。
p_no には、N@Minput=nlimit=mallの中からいずれか1つ以上を指定します。
本オプション省略時は、-ttextオプションが有効な場合は、-pinput=0limit=16が有効になり、-txmlオプションが有効な場合は、-pallオプションが有効になります。
-pオプションにはコンマ(,)を区切りとして、 p_no を複数指定することができます。例えば、-p3,5,limit=10のような指定ができます。
N[@M]:

N に指定したプロセス番号の情報を先頭に出力します。spawn番号 M に所属するプロセス番号 N を指定する場合、 N@M のように指定します。N[@M] に指定したプロセス番号の情報が存在しない場合、指定を無視します。N[@M] は複数指定できます。

input=n:

コストが高い順に n 件分のプロセスの情報を読み込みます。n に 0、またはプロセス数を超えた値を指定した場合、全プロセスの情報を読み込みます。本サブオプション省略時は、input=0が有効になります。サブオプションinput=nとサブオプションlimit=mは同時に指定できます。

limit=m:

コストが高い順に m 件のプロセスの情報を出力します。出力しなかったプロセスの情報は比率計算をする際の分母に含まれます。m に 0、または入力となるプロセス数を超える値を指定した場合、全プロセスの情報を出力します。本サブオプション省略時は、limit=16が有効になります。

all:

すべてのプロセス番号の情報を読み込み、コストが高い順に出力します。-pinput=0,limit=0オプションを指定した場合と同じです。サブオプションinput=n、および、limit=mのいずれも指定しない場合、こちらが有効になります。

-Tt_no

プロファイルデータの出力対象とするスレッドを指定します。
t_no には、Nlimit=nallの中からいずれか1つ以上を指定します。-Tオプションにはコンマ(,)を区切りとして、t_noを複数指定することができます。
例えば、-T3,5,limit=10のような指定ができます。
N[,N] ... :

N に指定したスレッド番号の情報を先頭に出力します。N に指定したスレッドの情報が存在しない場合、指定を無視します。N を複数指定した場合、指定した順番に出力します。

limit=n:

コストが高い順に n 件分のスレッド情報を出力します。n に、0または総スレッド数を超える値を指定した場合、全スレッドの情報を出力します。

all:

全スレッドの情報を出力します。-Tlimit=0オプションを指定した場合と同じです。省略時は、-Tallオプションが有効になります。

-t{text|xml}

プロファイル結果の出力形式を指定します。

text:

プロファイル結果をTEXT形式で出力します。省略時は、-ttextが有効になります。

xml:

プロファイル結果をXML形式で出力します。

3.1.11.3.6.2. プロファイル結果について

プロファイル結果は以下の統計情報から構成されています。
各情報は、fipppxコマンドの-Iオプションによって出力を制御できます。
各項目の詳細は「プロファイラ使用手引書」-「2.2.2 プロファイル結果の詳細(TEXT形式)、または、2.2.3 プロファイル結果の詳細(XML形式)」を確認してください。
  • プロファイルデータ計測環境情報

  • 時間統計情報

  • CPU動作状況

  • コスト情報(手続コスト分布情報、ループコスト分布情報、行コスト分布情報)

  • コールグラフ情報

  • ソースコード情報(TEXT形式のみ)