アプリケーションサーバーにおける 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
© Copyright 2024 ExpyDoc