ホーム » ソフトウェア » PGIコンパイラ

PGIコンパイラ

最終更新日:2018年6月1日

PGIコンパイラはPGI社の提供するC/C++, Fortran向けのコンパイラです。 ここでは、各プログラミング言語で記述されたプログラム(ソースコード)に対する翻訳・実行方法と バッチ処理方法について解説します。
PGIコンパイラはCUDA FortranOpenACC向けのコンパイラとしても利用可能ですが、 これらについては個別のページの説明をご確認ください。


利用環境

システム・バージョン・利用範囲

  • サブシステムA
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    17.7
  • サブシステムB
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    17.7
  • 基本フロントエンド
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    17.7
  • 大容量フロントエンド
  • バージョン 九州大学構成員 学術研究機関構成員 民間利用の方
    17.7

ITOシステムにインストールされているPGIコンパイラ(CUDA Fortran, OpenACCを含む)は、 ライセンスの都合上、九州大学の構成員でなければ利用できません。 九州大学の構成員以外の方でPGIコンパイラを使いたい方は、 Community Editionの利用をご検討ください。
参考情報:PGI Community Edition の導入方法


利用コマンド

プログラム言語の翻訳・リンクのための書式とコマンドの一覧は以下の通りです。

コマンド [option] file [...]
言語処理系 コマンド OpenMP*
非MPI並列 Fortran pgfortran -mp
C pgcc
C++ pgc++
MPI並列 Fortran mpifort
C mpicc
C++ mpic++

* OpenMPオプションはデフォルトでは無効です。


利用方法

環境設定(moduleコマンド)

$ module load pgi/17.7

PGIに内包された OpenMPIを用いる場合

$ module load pgi/17.7_openmpi

moduleコマンドによる環境設定はコンパイル時と実行時の両方で行う必要があります。


Fortran

翻訳・リンク方法

Fortranコンパイラは pgfortran コマンドを利用します。 MPIライブラリを使用する場合はmpifort コマンドを利用します。 pgf77/pgf90やmpif77/mpif90など、Fortranのバージョンに合わせたコマンドも存在しますが、 特別な事情のない限りpgfortranとmpifortさえ使用すれば十分です。

例1)逐次Fortranプログラムを翻訳・リンクする。

$ pgfortran -fast -tp=haswell sample.f90

例2)ノード内スレッド並列(OpenMP) Fortranプログラムを翻訳・リンクする。

$ pgfortan -fast -mp -tp=haswell sample.f90

例3)MPI並列(フラットMPI) Fortranプログラムを翻訳・リンクする。

$ mpifort -fast -tp=haswell sample.f90

例4)ハイブリッド並列(OpenMP+MPI) Fortranプログラムを翻訳・リンクする。

$ mpifort -fast -mp -tp=haswell sample.f90

主な翻訳時オプション

翻訳時オプション 説明
-c オブジェクトファイルまで生成
-o exe_file 実行可能ファイル名/オブジェクトファイル名をexe_fileに変更
実行可能ファイル名を省略した場合にはa.out
-O[0, 1, 2, 3, 4] 最適化レベルを指定。-Oの後の数字を省略した場合は-O1に近いレベルとなる。
-fast 高速化のための最適化オプションを誘導(最適化での推奨オプション)
-mp OpenMPディレクティブを有効化。
-I directory インクルードファイル、モジュールファイルを検索するディレクトリを指定
-Mfixed ソースコードが固定形式で記述されていることを指定
-Mfree ソースコードが自由形式で記述されていることを指定
-Minfo=options optionsで指定した種類の最適化情報を出力する。allで全て、mpでOpenMPに関する情報のみを出力など。
-tp=architecture architectureで指定したアーキテクチャ(およびそれ以上)のCPU向けのコード生成を行う。ITOシステムではhaswellを指定する。
-cpp または -Mpreprocess プリプロセス処理を行う
-help コンパイルオプションの一覧を表示
-V コンパイラのバージョン情報を出力

○推奨オプション

Fortranの標準的なオプションとして、"-fast"を推奨します。 推奨オプション以外の最適化機能は、プログラムデータの特性によって効果がある場合と、そうでない場合があり、実際に動作させて検証する必要があります。 推奨オプションを指定すると、関連して複数の最適化オプションが誘導されます。


C/C++

Cプログラムの翻訳・リンク方法

Cコンパイラは pgccコマンドを利用します。 MPIライブラリを使用する場合はmpiccを利用します。

例1)逐次プログラムをコンパイル/リンクする。

$ pgcc -fast -tp=haswell sample.c

例2)ノード内スレッド並列(OpenMP)プログラムを翻訳・リンクする。

$ pgcc -fast -mp -tp=haswell sample.c

例3)MPI並列(フラットMPI)プログラムを翻訳・リンクする。

$ mpicc -fast -tp=haswell sample.c

例4)ハイブリッド並列(OpenMP+MPI)プログラムを翻訳・リンクする。

$ mpicc -fast -mp -tp=haswell sample.c

C++プログラムの翻訳・リンク方法

C++コンパイラは pgc++ コマンドを利用します。 MPIライブラリを使用する場合は、mpic++コマンドを利用します。

例1)逐次プログラムをコンパイル/リンクする。

$ pgc++ -fast -tp=haswell sample.cpp

例2)ノード内スレッド並列(OpenMP)プログラムを翻訳・リンクする。

$ pgc++ -fast -mp -tp=haswell sample.cpp

例3)MPI並列(フラットMPI)プログラムを翻訳・リンクする。

$ mpic++ -fast -tp=haswell sample.cpp

例4)ハイブリッド並列(OpenMP+MPI)プログラムを翻訳・リンクする。

$ mpic++ -fast -mp -tp=haswell sample.cpp

主な翻訳時オプション

翻訳時オプション 説明
-c オブジェクトファイルまで生成
-o exe_file 実行可能ファイル名/オブジェクトファイル名をexe_fileに変更
実行可能ファイル名を省略した場合にはa.out
-O[0, 1, 2, 3, 4] 最適化レベルを指定。-Oの後の数字を省略した場合は-O1に近いレベルとなる。
-fast 高速化のための最適化オプションを誘導(最適化での推奨オプション)
-mp OpenMPディレクティブを有効化。
-I directory インクルードファイル、モジュールファイルを検索するディレクトリを指定
-Minfo=options optionsで指定した種類の最適化情報を出力する。allで全て、mpでOpenMPに関する情報のみを出力など。
-tp=architecture architectureで指定したアーキテクチャ(およびそれ以上)のCPU向けのコード生成を行う。ITOシステムではhaswellを指定する。
-c99 および -c11 C99規格およびC11規格に基づいたコンパイル処理を行う
-help コンパイルオプションの一覧を表示
-V コンパイラのバージョン情報を出力

○推奨オプション

C/C++の標準的なオプションとして、"-fast"を推奨します。 推奨オプション以外の最適化機能は、プログラムデータの特性によって効果がある場合と、そうでない場合があり、実際に動作させて検証する必要があります。 推奨オプションを指定すると、関連して複数の最適化オプションが誘導されます。


数値計算ライブラリ

PGIコンパイラから利用できる数値演算ライブラリに LAPACK, BLAS, FFTがあります。 さらにMPIライブラリからはScaLAPACKも利用できます。 コンパイル時にそれぞれ-llapack, -lblas, -fft, -Mscalapackオプションを付けてください。


MPI

PGIコンパイラに対応するMPIライブラリも用意されています。 GPU連携用に設定されたOpenMPIであるため、高速なGPU間通信機能も利用が可能です。 利用するためには module load pgi/17.7_openmpi のように利用するPGIコンパイラのバージョンに_openmpiがついたmoduleを追加でloadしてください。 (コンパイル時とバッチスクリプトのどちらにも必要です。)
OpenMPIの詳細な利用方法はOpen MPI Documentationを確認してください。

OpenMPIを用いたジョブの実行例(-display-devel-mapはプロセスの割り当て状況を追加出力させるオプションです)

# 1ソケットに1プロセス、合計2プロセスの例(1ノードで2プロセス並列実行をする想定)
mpirun -n 2 -display-devel-map -map-by ppr:1:socket --mca plm_rsh_agent /bin/pjrsh -machinefile ${PJM_O_NODEINF} ./a.out
# 1ノードに1プロセス、合計2プロセスの例(2ノードで2プロセス並列実行をする想定)
mpirun -n 2 -display-devel-map -map-by ppr:1:node --mca plm_rsh_agent /bin/pjrsh -machinefile ${PJM_O_NODEINF} ./a.out
# 1ノードに2プロセス、合計4プロセスの例(2ノードで2プロセス並列実行をする想定)
mpirun -n 4 -display-devel-map -map-by ppr:1:socket --mca plm_rsh_agent /bin/pjrsh -machinefile ${PJM_O_NODEINF} ./a.out
mpirun -n 4 -display-devel-map -map-by ppr:2:node --mca plm_rsh_agent /bin/pjrsh -machinefile ${PJM_O_NODEINF} ./a.out
# 上記の2つのmpirunは厳密には意味が異なりますが、
# どちらも1つ目のノードの2ソケットに1プロセスずつ割り当てた後に2つ目のノードの2ソケットに1プロセスずつ割り当てられます。
# ノードを交互に使いたい(1つ目のノードにプロセス0と2、2つ目のノードにプロセス1と3、としたい)場合は
# --rank-by nodeというオプションを追加してください
なお、CUDA-Aware MPIの使い方については別途資料を準備中です。
(現在インストールされているPGI 17.7はCUDA-Aware MPIが有効になっていません。2月末頃にCUDA-Aware MPIが利用可能なものに置き換えらえれる予定ですが、CUDA-Aware MPIを有効にしたCommunity Editionを独自にインストールすれば利用可能ですので、すぐに利用したい方はお試しください。)