アプリケーションサーバーにおける Fortran プログラムのコンパイル方法

アプリケーションサーバーにおける
Fortran プログラムのコンパイル方法
東北大学金属材料研究所 計算材料学センター
2015.3
version 1.0
目次
1.
コンパイル ............................................................................................................................................... 1
1.1
GNU Fortran の使用方法 ..................................................................................................................... 1
1.2
Intel Fortran の使用方法 ...................................................................................................................... 3
1.3
PGI Fortran の使用方法 ....................................................................................................................... 4
2.
ライブラリの利用 ..................................................................................................................................... 6
2.1
MKL........................................................................................................................................................ 6
2.2
ACML ..................................................................................................................................................... 7
2.3
IMSL Fortran ......................................................................................................................................... 7
2.4
FFTW ...................................................................................................................................................... 8
改版履歴
版数
version 1.0
日付
内容
2015 年 3 月 4 日
初版作成
アプリケーションサーバーにおける Fortran プログラムのコンパイル方法
アプリケーションサーバーBladeCenter HS22(以下、「アプリケーションサーバー」という)で Fortran プログラム
をコンパイルするための手順について説明します。
1. コンパイル
アプリケーションサーバーでは Fortran プログラムのコンパイラとして、GNU Fortran、Intel Fortran、PGI
Fortran が利用できます。
コンパイラの使い方は並列化の手法によって使用するコマンドとオプションが異なります。並列化の手法には
以下があります。
 自動並列化:コンパイラによって自動的に並列化を行う
 OpenMP:OpenMP 指示文を挿入して並列化を行う
 MPI:MPI を利用して並列化を行う
 MPI+自動並列化:MPI によって並列化したプログラムをさらに自動並列化によってノード内の並
列化を行う
 MPI+OpenMP:MPI によって並列化したプログラムをさらに OpenMP によってノード内の並列化
を行う
コンパイルはフロントエンドノード(app1.imr.edu、app2.imr.edu)および TSS ノード(app3t.imr.edu、app4t.imr.edu)
で行います。それぞれのノードでは CPU 時間に制限があり、フロントエンドノードではプロセスあたり 1 時間、
TSS ノードではプロセスあたり 30 時間になっています。1 つのソースプログラムのコンパイルに 1 時間以上かか
る場合には、TSS ノードで行うかフロントエンドノードからジョブとして投入します。
1.1 GNU Fortran の使用方法
GNU Fortran には以下のコンパイルコマンドがあります。
コンパイルコマンド
説明
gfortran
逐次プログラムをコンパイルする。
/usr/bin/mpif77
FORTRAN77 の MPI プログラムをコンパイルする。
/usr/bin/mpif90
Fortran90 の MPI プログラムをコンパイルする。
拡張子と言語形式は以下のようになっています。
拡張子
言語形式
f、for
固定形式
f90、f95
各言語の自由形式
以下に app1.imr.edu での例を示します。TSS ノードでも同様に行うことができます。
(例)逐次プログラムの場合
[user01@app1~]$ gfortran sample.f
1
(例)逐次プログラムで自動並列化機能を使用する場合
[user01@app1~]$ gfortran -O3 -march=native -mtune=native -ftree-parallelize-loops=4 sample_auto.f
ftree-parallelize-loops で指定する値は並列数です。
(例)逐次プログラムで OpenMP を使用する場合
[user01@app1~]$ gfortran -fopenmp sample_omp.f
(例)MPI プログラムの場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /export/common/environment/app_mpi_environment_mpich2
[user01@app1~]$ /usr/bin/mpif90 sample_mpi.f
(例)MPI プログラムで OpenMP を使用する場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /export/common/environment/app_mpi_environment_mpich2
[user01@app1~]$ /usr/bin/mpif90 -fopenmp sample_mpi_omp.f
以下に、ジョブとして投入する例を示します。
まず、コンパイルを行うためのスクリプトファイル(ファイル名:script.sh)を vi などのテキストエディタで作成し
ます。
gfortran sample.f
このスクリプトをフロントエンドノードから submit コマンドで ASB キューに投入します。submit コマンドの書式、
キューの詳細については、それぞれ、アプリケーションサーバーにおけるプログラムの実行方法の 1.2.2、1.2.3
をご覧ください。
[user01@app1 ~]$ submit ASB general -exec script.sh
スクリプトファイル名を COMMANDLINE とすることで-exec オプションを省略できます。
[user01@app1 ~]$ submit ASB general
以下に GNU fortran の主なコンパイルオプションを示します。
2
コンパイルオプション
説明
-o outfile
出力ファイル名を指定。省略時は a.out が作成される。
-L<dir>
ライブラリを検索するパスを指定。
-l<lib name>
リンクするライブラリ名を指定。
-I<dir>
ヘッダファイルを検索するパスを指定。
-O0|-O1|-O2|-O3
最適化オプションを指定。省略時は-O0 が仮定される。
-ftree-parallelize-loops=n
自動並列化機構を使用する場合に指定。n は並列数を指定。
-fopenmp
OpenMP を使用するようにコンパイルする場合に指定。
-ffree-form
入力ファイルを自由形式の Fortran プログラムとして扱う。
-ffixed-form
入力ファイルを固定形式の Fortran プログラムとして扱う。
1.2 Intel Fortran の使用方法
Intel Fortran には以下のコンパイルコマンドがあります。
コンパイルコマンド
説明
ifort
逐次プログラムをコンパイルする。
mpiifort
MPI プログラムをコンパイルする。
拡張子と言語形式は以下のようになっています。
拡張子
言語形式
f、for、ftn、i
固定形式
f90、i90
自由形式
以下に app1.imr.edu での例を示します。TSS ノードでも同様に行うことができます。
(例)逐次プログラムの場合
[user01@app1~]$ ifort sample.f
(例)逐次プログラムで自動並列化機能を使用する場合
[user01@app1~]$ ifort -parallel sample_auto.f
(例)逐次プログラムで OpenMP を使用する場合
[user01@app1~]$ ifort -openmp sample_omp.f
(例)MPI プログラムの場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /opt/intel/impi/4.1.3.048/bin64/mpivars.sh
[user01@app1~]$ mpiifort sample_mpi.f
(例)MPI プログラムで自動並列化機能を使用する場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /opt/intel/impi/4.1.3.048/bin64/mpivars.sh
[user01@app1~]$ mpiifort -parallel sample_mpi_auto.f
(例)MPI プログラムで OpenMP を使用する場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /opt/intel/impi/4.1.3.048/bin64/mpivars.sh
[user01@app1~]$ mpiifort -openmp sample_mpi_omp.f
以下に、ジョブとして投入する例を示します。
まず、コンパイルを行うためのスクリプトファイル(ファイル名:script.sh)を vi などのテキストエディタで作成し
ます。
ifort sample.f
3
このスクリプトをフロントエンドノードから submit コマンドで ASB キューに投入します。submit コマンドの書式、
キューの詳細については、それぞれ、アプリケーションサーバーにおけるプログラムの実行方法の 1.2.2、1.2.3
をご覧ください。
[user01@app1 ~]$ submit ASB general -exec script.sh
スクリプトファイル名を COMMANDLINE とすることで-exec オプションを省略できます。
[user01@app1 ~]$ submit ASB general
以下に Intel Fortran の主なコンパイルオプションを示します。
コンパイルオプション
説明
-o outfile
出力ファイル名を指定。省略時は a.out が作成される。
-L<dir>
ライブラリを検索するパスを指定。
-l<lib name>
リンクするライブラリ名を指定。
-I<dir>
ヘッダファイルを検索するパスを指定。
-O|-O0|-O1|-O2|-O3|-Ofast
最適化オプションを指定。省略時は-O2 が仮定される。
-parallel
自動並列化機構を使用する場合に指定。
-openmp
OpenMP を使用するようにコンパイルする場合に指定。
-free
入力ファイルを自由形式の Fortran プログラムとして扱う。
-fixed
入力ファイルを固定形式の Fortran プログラムとして扱う。
-xHOST
プロセッサーで利用可能な最上位の命令セットを利用して最適化を行う。
1.3 PGI Fortran の使用方法
PGI Fortran には以下のコンパイルコマンドがあります。
コンパイルコマンド
説明
pgf77
FORTRAN77 の逐次プログラムをコンパイルする。
pgfortran
逐次プログラムをコンパイルする。
mpif77
FORTRAN77 の MPI プログラムをコンパイルする。
mpif90
Fortran90 の MPI プログラムをコンパイルする。
拡張子と言語形式は以下のようになっています。
拡張子
言語形式
f、for
固定形式
f90
自由形式
以下に app1.imr.edu での例を示します。TSS ノードでも同様に行うことができます。
(例)逐次プログラムの場合
[user01@app1~]$ pgfortran sample.f
(例)逐次プログラムで自動並列化機能を使用する場合
[user01@app1~]$ pgfortran -Mconcur sample_auto.f
4
(例)逐次プログラムで OpenMP を使用する場合
[user01@app1~]$ pgfortran -mp sample_omp.f
(例)MPI プログラムの場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /export/common/environment/app_mpi_environment_pgi
[user01@app1~]$ mpif90 sample_mpi.f
(例)MPI プログラムで自動並列化機能を使用する場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /export/common/environment/app_mpi_environment_pgi
[user01@app1~]$ mpif90 -Mconcur sample_mpi_auto.f
(例)MPI プログラムで OpenMP を使用する場合
環境を設定後、コンパイルします。
[user01@app1~]$ source /export/common/environment/app_mpi_environment_pgi
[user01@app1~]$ mpif90 -mp sample_mpi_omp.f
以下に、ジョブとして投入する例を示します。
まず、コンパイルを行うためのスクリプトファイル(ファイル名:script.sh)を vi などのテキストエディタで作成し
ます。
pgfortran sample.f
このスクリプトをフロントエンドノードから submit コマンドで ASB キューに投入します。submit コマンドの書式、
キューの詳細については、それぞれ、アプリケーションサーバーにおけるプログラムの実行方法の 1.2.2、1.2.3
をご覧ください。
[user01@app1 ~]$ submit ASB general -exec script.sh
スクリプトファイル名を COMMANDLINE とすることで-exec オプションを省略できます。
[user01@app1 ~]$ submit ASB general
以下に PGI Fortran の主なコンパイルオプションを示します。
5
コンパイルオプション
説明
-o outfile
出力ファイル名を指定。省略時は a.out が作成される。
-L<dir>
ライブラリを検索するパスを指定。
-l<lib name>
リンクするライブラリ名を指定。
-I<dir>
ヘッダファイルを検索するパスを指定。
-O0|-O1|-O|-O2|-O3|-O4
最適化オプションを指定。省略時は-O1 が仮定される。
-Mconcur
自動並列化機構を使用する場合に指定。
-mp
OpenMP を使用するようにコンパイルする場合に指定。
-Mfree
入力ファイルを自由形式の Fortran プログラムとして扱う。
-Mfixed
入力ファイルを固定形式の Fortran プログラムとして扱う。
-fastsse
SSE/SSE2 命令セットを有するマシンへの一般的な最適化フラグセット。
2. ライブラリの利用
アプリケーションサーバーでは以下のライブラリが利用できます。
種類
説明
MKL
Intel 社の数値演算ライブラリ
ACML
PGI コンパイラ用の数値演算ライブラリ
IMSL Fortran
Rogue Wave 社の数値計算・統計解析用ライブラリ
FFTW
離散フーリエ変換用のライブラリ
2.1 MKL
ライブラリ本体は/opt/intel/mkl にあります。Intel MKL のリンクオプションの設定については以下のリンクで
生成することができます。
https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/
MKL を使用する場合は、以下のコマンドで環境設定する必要があります。
4 バイト整数を使用する場合
[user01@app1~]$ source /opt/intel/mkl/bin/mklvars.sh intel64 lp64
8 バイト整数を使用する場合
[user01@app1~]$ source /opt/intel/mkl/bin/mklvars.sh intel64 ilp64
(例)4 バイト整数を使用し、逐次プログラムを BLAS にリンクする場合
[user01@app1~]$ ifort -I${MKLROOT}/include/intel64/lp64 -I${MKLROOT}/include blas_sample.f90
${MKLROOT}/lib/intel64/libmkl_blas95_lp64.a -Wl,--start-group
${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ${MKLROOT}/lib/intel64/libmkl_core.a
${MKLROOT}/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm
注:コマンドは一行で入力します。
(例)4 バイト整数を使用し、OpenMP を利用した逐次プログラムを BLAS にリンクする場合
[user01@app1~]$ ifort -openmp -I${MKLROOT}/include/intel64/lp64
-I${MKLROOT}/include blas_omp_sample.f90
${MKLROOT}/lib/intel64/libmkl_blas95_lp64.a -Wl,--start-group
${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ${MKLROOT}/lib/intel64/libmkl_core.a
${MKLROOT}/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
注:コマンドは一行で入力します。
(例)4 バイト整数を使用し、逐次プログラムを LAPACK にリンクする場合
[user01@app1~]$ ifort -I${MKLROOT}/include/intel64/lp64 -I${MKLROOT}/include lapack_sample.f90
${MKLROOT}/lib/intel64/libmkl_lapack95_lp64.a -Wl,--start-group
${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ${MKLROOT}/lib/intel64/libmkl_core.a
${MKLROOT}/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm
注:コマンドは一行で入力します。
6
(例)4 バイト整数を使用し、OpenMP を利用した逐次プログラムを LAPACK にリンクする場合
[user01@app1~]$ ifort -openmp -I${MKLROOT}/include/intel64/lp64
-I${MKLROOT}/include lapack_omp_sample.f90
${MKLROOT}/lib/intel64/libmkl_lapack95_lp64.a -Wl,--start-group
${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ${MKLROOT}/lib/intel64/libmkl_core.a
${MKLROOT}/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
注:コマンドは一行で入力します。
(例)4 バイト整数を使用し、MPI プログラムを ScaLAPACK にリンクする場合
[user01@app1~]$ mpiifort -I${MKLROOT}/include/intel64/lp64
-I${MKLROOT}/include scalapack_mpi_sample.f90
${MKLROOT}/lib/intel64/libmkl_scalapack_lp64.a -Wl,--start-group
${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ${MKLROOT}/lib/intel64/libmkl_core.a
${MKLROOT}/lib/intel64/libmkl_intel_sequential.a -Wl,--end-group
${MKLROOT}/lib/intel64/libmkl_blacs_intelmpi_lp64.a -lpthread -lm
注:コマンドは一行で入力します。
2.2 ACML
PGI Fortran を使用する場合に利用可能です。OpenMP 版、スカラー版のライブラリがあります。
種類
ライブラリ
OpenMP 版
libacml_mp.a
スカラー版
libacml.a
(例)逐次プログラムで OpenMP 版の ACML を使用する場合
[user01@app1~]$ pgfortran -mp sample_openmp.f -lacml_mp
(例)逐次プログラムでスカラー版の ACML を使用する場合
[user01@app1~]$ pgfortran sample.f -lacml
2.3 IMSL Fortran
スカラー版と MPI 並列版のライブラリがあります。Intel Fortran を使用する場合に利用可能です。
IMSL を使用する場合は、以下のコマンドで環境設定する必要があります。
・スカラー版を使用する場合
[user01@app1~]$ source /opt/intel/bin/compilervars.sh intel64
[user01@app1~]$ source /export/app/imsl/imsl/fnl700/rdhin111e64/bin/fnlsetup.sh
・MPI 並列版を使用する場合
[user01@app1~]$ source /export/common/environment/app_mpi_environment_imsl
[user01@app1~]$ source /export/app/imsl/imsl/fnl700/rdhin111e64/bin/fnlsetup.sh
(例)逐次プログラムで BLAS に MKL を使用し、動的リンクする場合
[user01@app1~]$ifort $FFLAGS imsl.f $LINK_FNL
7
(例)逐次プログラムで BLAS に MKL を使用し、静的リンクする場合
[user01@app1~]$ifort $FFLAGS imsl.f $LINK_FNL_STATIC
(例)逐次プログラムで BLAS に IMSL BLAS を使用し、動的リンクする場合
[user01@app1~]$ifort $FFLAGS imsl.f $LINK_FNL_IMSL
(例)逐次プログラムで BLAS に IMSL BLAS を使用し、静的リンクする場合
[user01@app1~]$ifort $FFLAGS imsl.f $LINK_FNL_STATIC_IMSL
(例)MPI プログラムで BLAS に MKL を使用する場合
[user01@app1~]$mpif90 $FFLAGS imsl_mpi.f $LINK_MPI
(例)MPI プログラムで BLAS に IMSL BLAS を使用する場合
[user01@app1~]$mpif90 $FFLAGS imsl_mpi.f $LINK_MPI_IMSL
2.4 FFTW
ライブラリ本体は/opt/fft/fftw-3.3.4/lib64 に、MPI 版、OpenMP 版、スカラー版のライブラリがあります。
ライブラリパス
種類
ライブラリ
/opt/fft/fftw-3.3.4/lib64
MPI 版
libfftw3_mpi.a
OpenMP 版
libfftw3_omp.a
スカラー版
libfftw3.a
(例)MPI プログラムで FFTW の MPI 版を使用する場合
[user01@app1~]$ source /opt/intel/impi/4.1.3.048/bin64/mpivars.sh
[user01@app1~]$ mpiifort sample_mpi.f -I/opt/fft/fftw-3.3.4/include -L/opt/fft/fftw-3.3.4/lib64 -lfftw3_mpi
-lfftw3
(例)逐次プログラムで FFTW の OpenMP 版を使用する場合
[user01@app1~]$ ifort -openmp sample_omp.f -I/opt/fft/fftw-3.3.4/include -L/opt/fft/fftw-3.3.4/lib64
-lfftw3_omp
(例)逐次プログラムで FFTW のスカラー版を使用する場合
[user01@app1~]$ ifort sample.f -I/opt/fft/fftw-3.3.4/include -L/opt/fft/fftw-3.3.4/lib64 -lfftw3
動的リンクした場合は、実行の際に以下の環境設定を行う必要があります。
[user01@app1~]$ export LD_LIBRARY_PATH=/opt/fft/fftw-3.3.4/lib64:${LD_LIBRARY_PATH}
8