ソフテック・トップページへ
ホーム 製品 セキュリティ・サービス HPCサービス ダウンロード 企業情報

PGI compiler TIPS
プロファイラ PGPROF の使用
技術情報・TIPS > コンパイラ・オプションの使用方法 > PGPROF の使用

 全てのコンパイル・オプション

性能解析プロファイラ (pgprof) を使用するためのオプション

PGI 製品における F77, F2003, HPF, C, C++ のコンパイラを使用して、性能解析プロファイラ PGPROF を使用する場合のコンパイル・オプションの例を示します。以下は、pgf95 を使用した場合の例ですが、コンパイラのオプションの設定方法は、他の言語コンパイラでも同じです。なお、プロファイラとは、実行時間のボトルネック等を調べるためのツールであり、各ルーチン単位、ステートメント単位での実行時間等を分析することができます。

PGPROF の一般的な使用法については、こちらもご覧下さい

● プロファイルを行うためのオプションの設定

 pgfortran -Mprof  test.f

あるいは、

 pgfortran -Mprof={func|lines} test.f 

gprof スタイルのプロファイルデータ(gmon.out) の取得の場合は、

 pgfortran -pg test.f
  • -Mprof オプションは、性能解析プロファイラ PGPROF を使用するための実行時間データをサンプルするための機構を実行モジュールに入れるためのオプションです。
  • -Mprof={func|lines} の二つのフラグを指定することができます。何も指定しない場合のデフォルトは、func です。func は関数・サブルーチンレベルのプロファイリングを行う場合のもので、一方 lines は statement 単位でのプロファイリングが可能となります。
  • OpenMP でのスレッド単位のプロファイリングでは、-Mprof=func の関数レベルのオプションでは、関数内部が並列スレッド実行の単位となりますので、個々の並列スレッドのプロファイルは採取できません。その場合は、データ取得単位の小さな statement 単位の -Mprof=lines を指定してください。
  • これで生成された実行モジュールを実行すると、実行後、pgprof.out と言うファイルが生成されます。PGPROF ユーティリティはこのファイルを使用してプロファイリング結果を表示します。
  • 上記のオプションは、プロファイル関係のオプションのみ例示しています。実際には、その他の最適化オプションも添えて、コンパイルしてください。

上記のオプションはコンパイル時だけでなく、リンケージ時においてもつける必要があります。特に Makefile 等で、コンパイルフェーズとリンクフェーズを分けて行う場合は、リンケージのオプションにも同じように指定してください。

既知の制約事項
-mcmodel=medium と -Mprof=.. オプションを同時に使用して生成される実行モジュールは、「セグメンテーションフォールト」を引き起こし、実行できません。 -mcmodel=medium をつけない状態でプロファイルの取得を行っていただくか、GNU 形式のプロファイルデータを取得してください。

MPI並列プログラムのプロファイリング
MPI プログラムのプロファイリングに関しては、こちらの各MPIライブラリの使用法のページで説明しております

● プロファイラ PGPROF を使用する

PGPROF は X-window 使用して GUI ベースで分析が可能です。そのための、環境変数等の準備を行います。もし、X-window を利用しない場合は、コマンド・モードでの使用 (-text オプションを指定する) が可能です。なお、PGI 2011 以降、 -text オプションは廃止されました。

PGPROF を動かすシステム上で、ユーザのログインシェルの初期設定ファイル
(.bashrc or .cshrc 等)に X を表示するマシン名 DISPLAY 環境変数を定義します。

(例)
 DISPLAY=mypc.softek.co.jp:0.0 ; export DISPLAY 

表示するクライアント(X Server 側)では、X-window を立ち上げ、外部マシンから
のプロトコルを受け入れるためのコマンドを発行します。

 xhost + 

X-window の Server/Client 方式を取らず、同一のマシンで行う場合は、上記の操作を同一のマシン上で行ってください。

プログラムを実行した directory へ移動して、実行後生成された pgprof.out が
存在することを確認します。次のコマンドで、pgprof を立ち上げます。

 pgprof pgprof.out 

これで、X-window 上に プロファイルの状況が表示されます。



  • なお、gprof 互換の gmon.out も表示可能ですので、その際は、
  • pgprof -exe a.out gmon.out と指定して実行してください。但し、gmon.out 採取データをpgprof ユーティリティで表示する場合は、実行回数、実行時間のみしか表示しませんので、 gmon.out のプロファイル表示は、GNU のユーティリティである gprof を使用したほうが良いかと思います。なお、PGI コンパイラを使用して、gprof 互換の gmon.out を生成するには、 コンパイルオプション -pg 指定して、実行モジュールを作成してください。リンケージ時にも同じオプションを指定してください。プログラムの実行後、gmon.out が作成されます。この gmon.out は Linux の gprof ユーティリティでも分析可能です。

X-window の Server/Client 方式を取らず、同一のマシンで行う場合は、上記の操作を同一のマシン上で行ってください。

GNU 形式のプロファイルデータ(gmon.out) を取得する方法


PGI の pgprof ユーティリティを使用しないで、GNU 形式のプロファイルデータを取得する方法を説明します。
PGI コンパイラには、GNU互換のプロファイルデータを取得するために、-pg オプションが用意されています。これを付けて生成された実行モジュールは、実行後、GNU互換のプロファイル結果データを生成します。プロファイルデータは、GNU のデフォルトである gmon.out ファイルに記録されます。以下のようにオプションを設定し、実行してください。

 $ pgf77 -fastsse -Minfo -mcmodel=medium -pg -o a.out (source files)
 $ a.out (実行)

実行後、gmon.out が生成されます。
次に、GNU utility の一つである、gprof を使用してプロファイル結果を表示します。このコマンドの詳細は、以下にあります。
   http://www.linux.or.jp/JM/html/GNU_binutils/man1/gprof.1.html

プロファイルを表示するためのコマンド列は、以下の例のようになります。

$ gprof a.out gmon.out

ご注意いただきたいのは、GNU 形式のプロファイル結果は、各ルーチンの実行時間に関して、実時間表示ではありません。プロファイリングデータを「サンプリング形式」で取得しているためです。一方、PGI のプロファイルは実時間を表示します。(実は、pgprof コマンドでも gmon.out を読めるのですが、実行時間と実行回数のみの表示ですので、あまりお勧めしません。ちなみに、コマンドとしては、pgprof -exe apple.exe gmon.out で可能です)

gprof の出力例を以下に示します。各ルーチンの実行回数と実行時間等が現れますので、少なくともどのルーチンが時間を消費しているかは理解できるはずです。また、CALL Graph も出力できますので、別の利用用途としても利用可能です。

$ gprof a.out gmon.out
Flat profile:
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 67.82 19.60 19.60 32768 0.00 0.00 swarztrauber_ 18.30 24.89 5.29 8 0.66 3.11 fftxyz_ 10.28 27.86 2.97 6 0.50 0.50 evolve_ 1.94 28.42 0.56 2 0.28 0.40 compute_initial_conditions_ 0.80 28.65 0.23 65536 0.00 0.00 vranlc_ 0.80 28.88 0.23 1 0.23 28.88 appft_ 0.07 28.90 0.02 _init 0.00 28.90 0.00 292 0.00 0.00 randlc_ 0.00 28.90 0.00 27 0.00 0.00 ilog2_ 0.00 28.90 0.00 15 0.00 0.00 timer_clear_ 0.00 28.90 0.00 6 0.00 0.00 calculatechecksum_ 0.00 28.90 0.00 4 0.00 0.00 elapsed_time_ 0.00 28.90 0.00 4 0.00 0.00 ipow46_ 0.00 28.90 0.00 4 0.00 0.00 wtime_ 0.00 28.90 0.00 3 0.00 0.00 compexp_ 0.00 28.90 0.00 2 0.00 0.00 timer_start_ 0.00 28.90 0.00 2 0.00 0.00 timer_stop_ 0.00 28.90 0.00 1 0.00 28.88 MAIN_ 0.00 28.90 0.00 1 0.00 0.00 getclass_ 0.00 28.90 0.00 1 0.00 0.00 print_results_ 0.00 28.90 0.00 1 0.00 0.00 timer_read_ 0.00 28.90 0.00 1 0.00 0.00 verify_ % the percentage of the total running time of the time program used by this function. cumulative a running sum of the number of seconds accounted seconds for by this function and those listed above it. self the number of seconds accounted for by this seconds function alone. This is the major sort for this listing. calls the number of times this function was invoked, it this function is profiled, else blank.
self the average number of milliseconds spent in this ms/call function per call, if this function is profiled, else blank. total the average number of milliseconds spent in this ms/call function and its descendents per call, if this function is profiled, else blank. name the name of the function. This is the minor sort for this listing. The index shows the location of the function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed. Call graph (explanation follows)
granularity: each sample hit covers 8 byte(s) for 0.03% of 28.90 seconds
index % time self children called name 0.00 28.88 1/1 main [3] [1] 99.9 0.00 28.88 1 MAIN_ [1] 0.23 28.65 1/1 appft_ [2] 0.00 0.00 1/1 print_results_ [21] 0.00 0.00 1/1 getclass_ [20] ----------------------------------------------- 0.23 28.65 1/1 MAIN_ [1] [2] 99.9 0.23 28.65 1 appft_ [2] 5.29 19.60 8/8 fftxyz_ [4] 2.97 0.00 6/6 evolve_ [6] 0.56 0.23 2/2 compute_initial_conditions_ [7] 0.00 0.00 15/15 timer_clear_ [12] 0.00 0.00 6/6 calculatechecksum_ [13] 0.00 0.00 3/3 compexp_ [17] 0.00 0.00 2/2 timer_start_ [18] 0.00 0.00 2/2 timer_stop_ [19] 0.00 0.00 1/1 verify_ [23] 0.00 0.00 1/1 timer_read_ [22] ----------------------------------------------- <spontaneous> [3] 99.9 0.00 28.88 main [3] 0.00 28.88 1/1 MAIN_ [1] ----------------------------------------------- 5.29 19.60 8/8 appft_ [2] [4] 86.1 5.29 19.60 8 fftxyz_ [4] 19.60 0.00 32768/32768 swarztrauber_ [5] 0.00 0.00 24/27 ilog2_ [11] ----------------------------------------------- 19.60 0.00 32768/32768 fftxyz_ [4] [5] 67.8 19.60 0.00 32768 swarztrauber_ [5] ----------------------------------------------- 2.97 0.00 6/6 appft_ [2] [6] 10.3 2.97 0.00 6 evolve_ [6] ----------------------------------------------- 0.56 0.23 2/2 appft_ [2] [7] 2.7 0.56 0.23 2 compute_initial_conditions_ [7] 0.23 0.00 65536/65536 vranlc_ [8] 0.00 0.00 256/292 randlc_ [10] 0.00 0.00 4/4 ipow46_ [15]
----------------------------------------------- 0.23 0.00 65536/65536 compute_initial_conditions_ [7] [8] 0.8 0.23 0.00 65536 vranlc_ [8] ----------------------------------------------- (以下、省略)

<< 戻る


 ソフテックは、PGI 製品の公認正規代理店です

サイトマップ お問合せ
Copyright 2011 SofTek Systems Inc. All Rights Reserved.