====== コンパイラ・ライブラリ使用方法 ======
大規模並列計算サーバでのコンパイラ・ライブラリの使用方法を記載します。
===== コンパイラ使用方法 =====
スーパーコンピュータでは以下のコンパイラを提供しています。\\
^コンパイラ名称 ^バージョン ^備考 ^
|Crayコンパイラ Fortran/C/C++ |8.7.10\\ 8.6.5 |デフォルト:8.6.5 |
|Intelコンパイラ Fortran/C/C++ |19.1.3.304\\ 19.1.0.166\\ 19.0.2.187\\ 18.0.2.199\\ 17.0.4.196 |デフォルト:18.0.2.199 |
|PGIコンパイラ Fortran/C/C++ |19.1-0\\ 18.5-0 |デフォルト:19.1-0 |
|GNUコンパイラ Fortran/C/C++ |4.9.3\\ 5.3.0\\ 6.1.0\\ 7.3.0\\ 8.3.0 |デフォルト:7.3.0 |
------
==== プログラミング環境 ====
\\
**コマンド**\\
Fortran, C, C++コンパイラのコマンド名はftn, cc, CCに統一されています。\\
プログラミング環境を切り替えることで、コマンドが内部で呼び出すコンパイラが自動的に切り替わります。\\
^コンパイラ ^コマンド ^Crayコンパイラ ^Intelコンパイラ ^PGIコンパイラ ^GNUコンパイラ ^
|Fortran |ftn |crayftn |ifort |pgf90 |gfortran |
|C |cc |craycc |icc |pgcc |gcc |
|C++ |CC |crayCC |icpc |pgc++ |g++ |
MPIプログラムをコンパイルする場合もftn, cc, CCコマンドを利用します。\\ MPIライブラリは自動的にリンクされるので、明示的にリンクオプションを付ける必要はありません。
\\
**プログラミング環境の切り替え**\\
各プログラミング環境に対応するモジュールファイルは以下の通りです。\\
^Crayコンパイラ ^Intelコンパイラ ^PGIコンパイラ ^gnuコンパイラ ^
|PrgEnv-cray |PrgEnv-Intel |PrgEnv-pgi |PrgEnv-gnu |
プログラミング環境はmodule switchコマンドで切り替えます。\\
デフォルトではCrayコンパイラPrgEnv-crayがロードされています。\\
例として、Intelコンパイラに切り替える場合には以下のように実行します。
$ module switch PrgEnv-cray PrgEnv-intel
\\
**共通オプション**\\
以下オプションが全プログラミング環境に共通で指定可能です。\\
^オプション ^説明 ^
|-craype-verbose |コンパイラ・リンカに渡すオプションの表示 |
|-static |リンカに静的リンクを指示 |
|-dynamic |リンカに動的リンクを指示 |
|-shared |実行時に動的にリンクするライブラリを作成 |
|-help |プログラミング環境個別のオプションを表示 |
------
==== Crayコンパイラ ====
\\
**プログラム環境の設定**\\
superではCrayコンパイラをデフォルトで設定しています。\\
他の環境に切り替えていた場合は下記のように環境を切り替えて下さい。\\
\\
・例:Intelコンパイラの環境からの切り替え
$ module switch PrgEnv-intel PrgEnv-cray
\\
バージョンを切り替える場合には以下を実行してください。\\
\\
・例:バージョンの切り替え
$ module avail cce
cce/8.6.5(default)
cce/8.7.10
$ module switch cce cce/8.7.10
\\
**コンパイルオプション**\\
\\
・最適化オプション
^オプション ^説明 ^
|-o outfile |出力ファイル名を指定する。\\ 省略時にはa.outが設定される。|
|-l library_name |リンクするライブラリ名を指定する。 |
|-L library_path |ライブラリの検索パスを指定する。 |
|-h autothread |ノード内自動並列化を適用する(デフォルト:無効) |
|-h omp/noomp |OpenMP指示行による並列化を有効/無効にする(デフォルト:有効) |
|-h thread[0-3] |OpenMP最適化レベルの指定(3:最高水準、デフォルトは2) |
|-O [0-3] |自動最適化レベルの指定(3:最高水準、デフォルトは2) |
|-h ipa[0-5] |関数のインライン展開最適化レベルの指定 |
\\
・Fortran専用オプション
^オプション ^説明 ^
|-e0 |未定義のローカルスタック変数をゼロ初期化する |
|-ev |変数をstaticに割り当てる(例外条件あり) |
|-ez |allocate()文で確保した領域をゼロ初期化する |
|-f [free|fixed] |ソースファイルの形式 |
\\
・C専用オプション
^オプション ^説明 ^
|-h c99 |C99仕様に準拠してコンパイルする |
|-h noc99 |C99仕様に準拠しないでコンパイルする |
|-h zero |未定義のローカルスタック変数をゼロ初期化する |
\\
・デバッグ用オプション
^オプション ^説明 ^
|-g |デバッグ情報を出力します。 |
|-G [0-2] |デバッグ情報の管理(0:最多の情報がデバッグ時に得られます。”-G0”=“-g”) |
|-K trap=... |例外処理をトラップします。[fp | divz | denorm | ... ] |
\\
**使用例**\\
\\
・固定形式のFortranのソースプログラムhello.fからhello.outという実行モジュールを作成
$ ftn -f fixed -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90からhello.outという実行モジュールを作成
$ ftn -f free -o hello.out hello.f90
\\
・固定形式のFortranのソースプログラムhello.fから自動並列化したhello.outという実行モジュールを作成
$ ftn -h autothread -f fixed -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90から自動並列化したhello.outという実行モジュールを作成
$ ftn -h autothread -f free -o hello.out hello.f90
\\
・Cのソースプログラムhello.cからhello.outという実行モジュールを作成
$ cc hello.c -o hello.out
\\
・Cのソースプログラムhello.cから自動並列化したhello.outという実行モジュールを作成
$ cc -h autothread hello.c -o hello.out
\\
・C++のソースプログラムhello.cppからhello.outという実行モジュールを作成
$ CC hello.cpp -o hello.out
\\
・C++のソースプログラムhello.cppから自動並列化したhello.outという実行モジュールを作成
$ CC -h autothread hello.cpp -o hello.out
------
==== Intelコンパイラ ====
\\
**プログラム環境の設定**\\
superではCrayコンパイラがデフォルトで設定されているため下記のように環境を切り替えて下さい。\\
\\
・例:Crayコンパイラの環境からの切り替え
$ module switch PrgEnv-cray PrgEnv-intel
\\
バージョンを切り替える場合には以下を実行してください。\\
\\
・例:バージョンの切替
$ module avail intel
intel/17.0.4.196
intel/18.0.2.199(default)
intel/19.0.2.187
intel/19.1.0.166
intel/19.1.3.304
$ module switch intel intel/19.0.2.187
\\
**コンパイルオプション**\\
\\
・最適化オプション他
^オプション ^説明 ^
|-o outfile |出力ファイル名を指定します。省略時にはa.outが設定されます。 |
|-l library_name |リンクするライブラリ名を指定します。 |
|-L library_path |ライブラリの検索パスを指定します。 |
|-O0|-O1|-O2|-O3 |最適化オプションを指定します。デフォルトは-O2です。 |
|-fast |プログラム全体の速度を最大限にします。次のオプションが内部的に設定されます。\\ -ipo、-O3、-no-prec-div、-static、-fp-model fast=2、-xHost |
|-parallel |自動並列化を有効にしてコンパイルする場合に指定します。 |
|-openmp |OpenMP指示文を有効にしてコンパイルする場合に指定します。 |
\\
・Fortran専用オプション
^オプション ^説明 ^
|-free|-fixed |プログラムが自由形式(free)であるか固定形式(fixed)であるかを指定します。 |
\\
・デバッグ用オプション
^オプション ^説明 ^
|-g |デバッグ情報を出力します。 |
|-traceback |エラーが発生した場合にトレースバックを表示します。 |
|-fpe[0-3] |例外処理をトラップします。(-fpe0が最も詳細) |
\\
**使用例**\\
\\
・固定形式のFortranのソースプログラムhello.fからhello.outという実行モジュールを作成
$ ftn -fixed -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90からhello.outという実行モジュールを作成
$ ftn -free -o hello.out hello.f90
\\
・固定形式のFortranのソースプログラムhello.fから自動並列化したhello.outという実行モジュールを作成
$ ftn -fixed -parallel -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90から自動並列化したhello.outという実行モジュールを作成
$ ftn -free -parallel -o hello.out hello.f90
\\
・Cのソースプログラムhello.cからhello.outという実行モジュールを作成
$ cc -o hello.out hello.c
\\
・Cのソースプログラムhello.cから自動並列化したhello.outという実行モジュールを作成
$ cc -parallel -o hello.out hello.c
\\
・C++のソースプログラムhello.cppからhello.outという実行モジュールを作成
$ CC -o hello.out hello.cpp
\\
・C++のソースプログラムhello.cppから自動並列化したhello.outという実行モジュールを作成
$ CC -parallel -o hello.out hello.cpp
------
==== PGIコンパイラ ====
\\
**プログラム環境の設定**\\
superではCrayコンパイラがデフォルトで設定されているため下記のように環境を切り替えて下さい。\\
\\
・例:Crayコンパイラの環境からの切り替え
$ module switch PrgEnv-cray PrgEnv-pgi
\\
バージョンを切り替える場合には以下を実行してください。\\
\\
・例:バージョンの切替
$ module avail pgi
pgi/18.5
pgi/19.1(default)
$ module switch pgi pgi/18.5
\\
**コンパイルオプション**\\
\\
・最適化オプション他
^オプション ^説明 ^
|-o outfile |出力ファイル名を指定します。省略時にはa.outが設定されます。 |
|-l library_name |リンクするライブラリ名を指定します。 |
|-L library_path |ライブラリの検索パスを指定します。 |
|-O0|-O1|-O2|-O3|-O4 |最適化オプションを指定します。デフォルトは-O2です。 |
|-fast |一般的な最適化フラグセットが有効になります。 |
|-Mconcur |自動並列化を有効にしてコンパイルする場合に指定します。 |
|-mp |OpenMP指示文を有効にしてコンパイルする場合に指定します。 |
\\
・Fortran専用オプション
^オプション ^説明 ^
|-Mfree|-Mfixed |プログラムが自由形式(free)であるか固定形式(fixed)であるかを指定します。 |
\\
・デバッグ用オプション
^オプション ^説明 ^
|-g|-gopt |デバッグ情報を出力します。 |
\\
**使用例**\\
\\
・固定形式のFortranのソースプログラムhello.fからhello.outという実行モジュールを作成
$ ftn -Mfixed -o hello.out hello.f
\\
・固定形式のFortranのソースプログラムhello.fから自動並列化したhello.outという実行モジュールを作成
$ ftn -Mfixed -Mconcur -o hello.out hello.f
\\
・固定形式のFortranのソースプログラムhello.fからOpenMPでhello.outという実行モジュールを作成
$ ftn -mp -Mfixed -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90からhello.outという実行モジュールを作成
$ ftn -Mfree -o hello.out hello.f90
\\
・自由形式のFortranのソースプログラムhello.f90から自動並列化したhello.outという実行モジュールを作成
$ ftn -Mfree -Mconcur -o hello.out hello.f90
\\
・自由形式のFortranのソースプログラムhello.f90からOpenMPでhello.outという実行モジュールを作成
$ ftn -mp -Mfree -o hello.out hello.f90
\\
・Cのソースプログラムhello.cからhello.outという実行モジュールを作成
$ cc -o hello.out hello.c
\\
・Cのソースプログラムhello.cから自動並列化したhello.outという実行モジュールを作成
$ cc -Mconcur -o hello.out hello.c
\\
・Cのソースプログラムhello.cからOpenMPでhello.outという実行モジュールを作成
$ cc -mp -o hello.out hello.c
\\
・C++のソースプログラムhello.cppからhello.outという実行モジュールを作成
$ CC -o hello.out hello.cpp
\\
・C++のソースプログラムhello.cppから自動並列化したhello.outという実行モジュールを作成
$ CC -Mconcur -o hello.out hello.cpp
\\
・C++のソースプログラムhello.cppからOpenMPでhello.outという実行モジュールを作成
$ CC -mp -o hello.out hello.cpp
------
==== GNUコンパイラ ====
\\
**プログラム環境の設定**\\
superではCrayコンパイラがデフォルトで設定されているため下記のように環境を切り替えて下さい。\\
\\
・例:Crayコンパイラの環境 からの切り替え
$ module switch PrgEnv-cray PrgEnv-gnu
\\
バージョンを切り替える場合には以下を実行してください。\\
\\
・例:バージョンの切替
$ module avail gcc
gcc/4.9.3
gcc/5.3.0
gcc/6.1.0
gcc/7.3.0(default)
gcc/8.3.0
$ module switch gcc gcc/8.3.0
\\
**コンパイルオプション**\\
\\
・最適化オプション他
^オプション ^説明 ^
|-o outfile |出力ファイル名を指定します。省略時にはa.outが設定されます。 |
|-l library_name |リンクするライブラリ名を指定します。 |
|-L library_path |ライブラリの検索パスを指定します。 |
|-O0|-O1|-O2|-O3|-O4 |最適化オプションを指定します。デフォルトは-O2です。 |
|-fopenmp |OpenMP指示文を有効にしてコンパイルする場合に指定します。 |
\\
・Fortran専用オプション
^オプション ^説明 ^
|-ffree-form|-ffixed-form |プログラムが自由形式(free)であるか固定形式(fixed)であるかを指定します。 |
\\
・デバッグ用オプション
^オプション ^説明 ^
|-g |デバッグ情報を出力します。 |
|-g0|-g1|-g2|-g3 |デバッグレベルを指定します。(-g2 = -g) |
\\
**使用例**\\
\\
・固定形式のFortranのソースプログラムhello.fからhello.outという実行モジュールを作成
$ ftn -ffixed-form -o hello.out hello.f
\\
・自由形式のFortranのソースプログラムhello.f90からhello.outという実行モジュールを作成
$ ftn -ffree-form -o hello.out hello.f90
\\
・Cのソースプログラムhello.cからhello.outという実行モジュールを作成
$ cc -o hello.out hello.c
\\
・C++のソースプログラムhello.cppからhello.outという実行モジュールを作成
$ CC -o hello.out hello.cpp
\\
===== ライブラリ使用方法 =====
大規模並列計算サーバでは以下のライブラリを提供しています。
^ライブラリ ^バージョン ^リンク可能なコンパイラ ^
|CSML(Cray Scientific and Math Libraries) |19.05.5\\ 18.03.1 |各コンパイラ |
|Intel MKL(インテル マス・カーネル・ライブラリー) |19.1.3.304\\ 19.1.0.166\\ 19.0.2.187\\ 18.0.2.199\\ 17.0.4.196 |Intelコンパイラ |
|Third Party Products |- |各コンパイラ |
------
==== CSML(Cray Scientific and Math Libraries) ====
\\
CSML(Cray Scientific and Math Libraries)は、Crayが提供する科学数学ライブラリ群です。\\
以下のライブラリが利用可能です。
^ライブラリ ^説明 ^対応ライブラリ ^モジュール名 ^オプション ^
|Cray LibSci |XC50システム向けに最適化された科学技術計算ライブラリ\\ デフォルトでロードされる |BLAS, \\ LAPACK, \\ BLACS, \\ ScaLAPCK, \\ IRT, etc |cray-libsci | |
|Cray PETSc(Portable, Extensible Toolkit for Scientific Computation) |線形・非線形方程式並列ソルバーライブラリ |MUMPS, \\ SuperLU, \\ SuperLU_dist, \\ ParMETIS, \\ HYPRE, etc |cray-petsc | |
|Cray Trilinos Packages |科学計算ライブラリのオブジェクト指向インターフェイス\\ cray-petscを事前にロードする必要あり |PETSc, \\ Metis/ParMetis, \\ SuperLU, \\ Aztec, \\ BLAS, \\ LAPACK |cray-trilinos | |
|TPSL(Third Party Scientific Libraries) |PETSc/Trilinosと組み合わせ可能な数学ライブラリ |MUMPS, \\ Super_LU, \\ Super_LU_dist, \\ ParMetis, \\ Hypre, \\ Sumdials, \\ Scotch, etc|cray-tpsl | |
|FFTW3.3 Library |FFTW バージョン3.3|FFTW3.3 |cray-fftw |-lfftw3\\ (MPI並列)\\ -lfftw3_mpi\\ (スレッド並列)\\ -lfftw3_threads|
|FFTW2.1 Library |FFTW バージョン2.1\\ ライブラリ名が単精度・倍精度によって変わるため、リンク時に選択指示が必要|FFTW2.1 |fftw |(単精度)\\ -lsrfftw_mpi\\ -lsfftw_mpi\\ -lsrfftw\\ -lsfftw\\ (倍精度)\\ -ldrfftw_mpi\\ -ldfftw_mpi\\ -ldrfftw\\ -ldfftw|
\\
**プログラム環境の設定**\\
superではCrayコンパイラをデフォルトで設定しています。\\
必要に応じて利用するプログラム環境に切り替えて下さい。\\
\\
・例:Intelコンパイラの環境への切替
$ module switch PrgEnv-cray PrgEnv-intel
\\
**使用例**\\
\\
・例1:CrayコンパイラでFFTW3.3 LibraryをMPI並列プログラムから利用する場合
$ module load cray-fftw
$ cc main.c -L${FFTW_DIR} -lfftw3_mpi -lfftw3
\\
・例2:IntelコンパイラでFFTW3.3 LibraryをMPI並列とスレッド並列を組み合わせたプログラムから利用する場合
$ module switch PrgEnv-cray PrgEnv-intel
$ module load cray-fftw
$ cc -qopenmp main.c -L${FFTW_DIR} -lfftw3_mpi -lfftw3_threads -lfftw3
\\
・例3:FFTW2.1 Libraryを単精度で利用する場合
$ module load fftw
$ cc main.c -lsrfftw_mpi -lsfftw_mpi -lsrfftw -lsfftw
\\
・例4:FFTW2.1 Libraryを倍精度で利用する場合
$ module load fftw
$ cc main.c -ldrfftw_mpi -ldfftw_mpi -ldrfftw -ldfftw
------
==== Intel MKL ====
\\
Intel MKL(インテル マス・カーネル・ライブラリー)は、BLAS, LAPACK, SparseBLAS, PARDISO, Iterative Sparse Solver, FFT, 乱数生成などを含むライブラリです。\\
\\
**プログラム環境の設定**\\
Intelプログラム環境(PrgEnv-intel)をロードすることで利用可能です。なお、競合回避のため、cray-libsciはアンロードしてください。
\\
・例:Crayコンパイラ環境からの切り替え
$ module switch PrgEnv-cray PrgEnv-intel
$ module unload cray-libsci
\\
**使用例**\\
\\
・固定形式のBLASを使用したFortranのソースプログラムhello.fからhello.outという実行モジュールを作成
$ ftn -mkl -o hello.out -fixed hello.f
\\
・BLASを使用したCのソースプログラムhello.cからhello.outという実行モジュールを作成
$ cc -mkl -o hello.out hello.c
------
==== Third Party Products ====
\\
以下のライブラリが使用可能です。
^ライブラリ ^モジュール名称 ^備考 ^
|NetCDF(Unidata’s Network Common Data Format) Library |cray-netcdf |シリアル版 |
|::: |cray-parallel-netcdf |並列版|
|HDF5(Hierarchical Data Format 5) Libraries & Utilities |cray-hdf5 |シリアル版 |
|::: |cray-hdf5-parallel |並列版 |