ここではgfortranとifortでのコンパイル時に指定できるコマンド(最適化とデバッグ、mklの使用とopenmp)について記述します。
ここで対象とするファイル名をmain.f90にします。
最適化
- gfortran
gfortran -O3 -fopenmp main.f90
- ifort
ifort -mkl -openmp -xHOST -ipo -O3 main.f90
としてコンパイルするといいかと。並列計算がいらない場合は-fopenmp, -openmpのオプションを消してください。
デバッグ
デバッグとはバグを取り除いて望み通りのものにする作業です。
- gfortran
gfortran -Wall -fbounds-check -O -Wuninitialized -ffpe-trap=invalid,zero,overflow -fbacktrace -g main.f90
- ifort
ifort -mkl -check all -warn all -gen_interfaces -fpe0 -ftrapuv -traceback -g main.f90
とするのがいいでしょう。
※gfortranでは、オプション -ffpe-trap=invalid,zero,overflowが悪さすることがあるようです。fortranでのエラーメモにも書いたように、エラーを起こすはずがないコードでもなぜかエラーと言われることがあります。その時は
でデバッグをやると良いでしょう。
[adsense1]
gfortranでMKLを使う
例えばgfortranコンパイラでIntel® Math Kernel Library (Intel® MKL) を並列計算も含めて使いたいとします。
今、こういう状況にあるとします。
・MKLがあり、/opt/intel/の中にあるディレクトリ”mkl”
が存在する状況下で
・gfortranコンパイラ
がある。
とします。MKLのバージョンによってコンパイルオプションが異なるので注意してください。
Intel® Math Kernel Library Link Line Advisorを見ればどういうコマンドを打てばいいのかを教えてくれます。
ここではMKLのバージョンが
Ver. 11.1
と
Ver. 10.2.5.035
の場合の具体例を載せます。
MKLver11.1の場合
MKLver10.2.5.035の場合
※もしかしたら/opt/intel/mkl/ではなくて、/opt/intel/mkl/10.2.5.035/じゃないとだめかもしれません。
バージョンが違ったらどうするかはIntel® Math Kernel Library Link Line Advisorを参考にしてください。上のものを得るには下のようにすれば大丈夫です。
Select Intel® product: (MKLのバージョンは?) | Intel(R) MKL10.2 |
Select OS: (OSは何?) | Linux* |
Select usage model of Intel® Xeon Phi™ Coprocessor: (走らせようとしているコンピュータのcpuの種類がXeon Phi っていうcpuが数百個あるような特別なもの?) |
– |
Select compiler: (何のコンパイラでMKLを使いたいの?, gfortranだったらGNU fortran.) | GNU Fortran |
Select architecture:(良く分かりません!Help me →I don’t use any flag と進んで、”getconf LONG_BIT” と端末で打って何て表示されたかで入力しました。多分cpuが何ビットか、かな?) | Intel(R) 64 |
Select dynamic or static linking: (動的リンク(dynamic)がいい?静的リンク(static)がいい? 動的→汎用性あり、容量は軽い、動作は遅い 静的→汎用性なし、容量は重い、動作は早い ) |
Static |
Select interface layer:(プログラムの中に整数型で2^31越えてるものはある?ない?越えてなかったら32bit integer, 越えてたら64bit integer) | LP64 (32-bit integer) |
Select sequential or multi-threaded layer: (mklのサブルーチンを1つのCPUだけ(sequential)で走らせたい?それとも並列(multi-threaded)にする?) |
multi-threaded |
Select OpenMP library:(openMPの種類は何使う?intel か GNUか→僕は両方試したら、intelでは動かず、GNUでは動きました。) | GNU (libgomp) |
Select cluster library: ここから下は何を言っているのか分かりませんでした。空白でもいけたから多分直接は関係ないオプションなのだろうと。 |
次に下の方で作られたオプションをgfortranコンパイル時にくっつける。
$(MKLROOT)/libem64t/libmkl_solver_lp64.a -Wl,–start-group $(MKLROOT)/libem64t/libmkl_gf_lp64.a $(MKLROOT)/libem64t/libmkl_core.a $(MKLROOT)/libem64t/libmkl_gnu_thread.a -Wl,–end-group -lpthread -lm
と
-fopenmp -m64 -I$(MKLROOT)/include
が作られるかと思います。この2つをくっつければokです。
$(MKLROOT)はディレクトリ”mkl”へのパスです。シェルスクリプトの場合、()は要りません。
ここで、この通りコンパイルしようとすると/libem64t/というディレクトリはないよ、っていわれて出来ませんでした。
実際にたどってみると/lib/em64t/ならあって、これに変えたらコンパイルが成功しました。ケースバイケースかな。
参考
[adsense2]