コンパイラの設定

 ここでは、無料のコンパイラの利用方法を解説していく。
ifortの場合は「http://d.hatena.ne.jp/cmphys/20140501/1398925683」を参照するとよい。
オススメHP:http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/lecture/f90-enshu/index.html
http://www.komoto.org/hpc/fortran.html
http://www.hpc.cmc.osaka-u.ac.jp/system/manual/vcc/intel_compiler/
------------------------------------------------------------------------------
■ Windows OS

□ Watcom Fortran : http://downloads.openwatcom.org/ftp/ 
利用方法 :
http://www.toyama-cmt.ac.jp/~mkawai/almanac/nadown/watcom/watcom.html

□ GUN Fortran : http://www.mingw.org/download.shtml 
利用方法 :
http://www.toyama-cmt.ac.jp/~mkawai/almanac/nadown/watcom/mingw/mingw.html 

□ MinGW-w64 : http://sourceforge.net/projects/mingw-w64/ 
http://d.hatena.ne.jp/arakik10/20120214/1329167074

□ g95 : http://www.g95.org/
http://d.hatena.ne.jp/arakik10/20090213/p1
------------------------------------------------------------------------------
■ Linux OS

□ gfortran : http://gcc.gnu.org/wiki/GFortran
gfortran で利用可能なオプションを調べたい場合は、
gfortran -v --help > manual.txt
として調べてみるとよい。
ちなみにgccでは gcc -v --help > manual.txt となる。

デバッグ用のコンパイルオプション
http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/fswiki/wiki.cgi?page=Fortran%A5%C7%A5%D0%A5%C3%A5%B0%CD%D1%A5%AA%A5%D7%A5%B7%A5%E7%A5%F3 のHPが纏められていて大変オススメ。
----------------------------------
gfortran -Wall -pedantic -std=f95 -fbounds-check -Wuninitialized -ffpe-trap=invalid, zero, overflow -fbacktrace -g case.f90
-Wall : コンパイル時に全ての警告メッセージを有効
-pedantic -std=f95: 標準外機能の利用を報告
-fbounds-check : 配列の領域外参照を検出してくれる
-Wuninitialized : 初期化されていない変数を検出
-ffpe-trap=invalid, zero, overflow: 浮動小数点例外発生時に異常終了
-fbacktrace : 異常終了時にソースコードの行番号を表示(ver 4.3以後)
-g : デバッグデータの生成
参考HP
[1] http://www.damp.tottori-u.ac.jp/~hoshi/edu/doc/nm2007-12_07b_option.pdf
[2] http://linux.die.net/man/1/gfortran
[3] http://gcc.gnu.org/onlinedocs/gfortran/Option-Summary.html
[4] http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html
[5] http://seismon.blog85.fc2.com/blog-entry-80.html
----------------------------------

□ g95 : http://ftp.g95.org/
  gcc-4.0にもとづいたコンパイラ
[1] 藤井文夫ら『Fortran90/95 による有限要素法プログラミング』丸善出版

□ x86 Open64 Compiler Suite : http://developer.amd.com/tools-and-sdks/cpu-development/x86-open64-compiler-suite/

□ Open64 : http://www.open64.net/
  GPLライセンスのコンパイラ
[1] 藤井文夫ら『Fortran90/95 による有限要素法プログラミング』丸善出版

□ Intel Fortran :
※ 最適化については、http://www.hpc-sol.co.jp/support/intel_compiler_recipes/20121212_optimization.html や http://web.kudpc.kyoto-u.ac.jp/manual/ja/compiler/intel , http://www.j-focus.jp/user_guide/ug0003010000.html がオススメ。
libstdc++.so.5 のインストールが事前に必要(最近のもの{例えば2013以降など}はもう必要ない)。インストールが済めば、下記のコマンドを入力すればよい。xxxxはダウンロードしたファイルの名前。
1) tar zxvf xxxx.tgz
2) cd で解凍されたファイルに入る。
(分からなければ、cd の後にスペースを入れて、その後ろに解凍されたファイルをドラッグしてpasteを指定し、Enterを押せばよい)
3) ./install.sh
4) この後は、acceptの後にEnterやライセンスファイルの場所を指定すればよい。
5) .bashrcの一番下に下記の例を参考に書き加える。
(下記は64bitの場合、/yy.y/yyy/はバージョンで変わる)
  source /opt/intel/Compiler/yy.y/yyy/bin/ifortvars.sh intel64
  source /opt/intel/Compiler/yy.y/yyy/mkl/tools/environment/mklvarsem64t.sh intel64
6) Intel Fortran Compilerでオプションを調べたい場合は、
  ifort -help > manual.txt
  として調べてみるとよい。
7) which ifort などとすれば、参照先が分かる。
8) ifort -v などとすればヴァージョンが分かる。
参考HP
[1] http://software.intel.com/en-us/articles/non-commercial-software-download/ 
[2] https://registrationcenter.intel.com/RegCenter/MySerialNumbers.aspx?sn=NDM4-KTX8LJ9G&EmailID=publicadressinukai%40yahoo.co.jp&Sequence=987190

デバッグ用のコンパイルオプション
http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/fswiki/wiki.cgi?page=Fortran%A5%C7%A5%D0%A5%C3%A5%B0%CD%D1%A5%AA%A5%D7%A5%B7%A5%E7%A5%F3 のHPが纏められていて大変オススメ。
  下記のHPが参考になる。筆者が良くやるのが、ファイル処理を伴った0での割り算。Nanと表示される。下記のオプションを入れることでエラーが出るようにもなるので、時間の無い、最悪の場合には、オプション無しでコンパイル及びrunすることも考えてみるとよい。
※ 初期化は必要ないように思えるが、前の計算で配列がオーバーフローした場合などで、続いて正常な範囲での計算を行っても、誤った値が出力されることがある。この場合、PCを再起動する方法もあるが、初期化をしっかりと行っておけばPCを再起動しなくても良くなる。PCやプログラミングを詳しく知らない外部の方と共同研究する場合には、初期化を徹底しておくとトラブルが少なくできる。

----------------------------------
ifort -check all -warn all -std -fpe0 -traceback -g case.f
-warn all : コンパイル時に全ての警告メッセージを有効
-warn declarations : 暗黙の型宣言を警告
-std : 標準外機能の利用を警告
-CB : 配列の領域外参照を検出してくれる
-check uninit : 初期化されていない変数を検出
-check all : 全ての実行時診断機能を有効
-fpe0 : オーバーフロー、ゼロ割り、不正な処理で終了、アンダーフローはゼロで実行
-fpe1 : オーバーフロー、ゼロ割り、不正な処理でも続行、アンダーフローはゼロで実行
-fpe3 : 浮動小数点演算の例外処理を検出しても処理続行
-traceback : エラーを起こしたプログラム中の行番号を表示
-g : デバッグ用の実行ファイルを作る
参考HP
[1] http://www.bk.tsukuba.ac.jp/~ishii/index.html#cmpmemo
[2] http://wwweic.eri.u-tokyo.ac.jp/computer/manual/altix/prog/prog2.html 
[3] https://www.cc.kyushu-u.ac.jp/scp/doc/users/lecture/2016/event0602_1.pdf (オプションについての説明がある。非常に良い)

mpiifort (intel mpi)
source /opt/intel/impi/X.X.X.XXX/bin64/mpivars.sh (.bashrc に書き込む。これで環境設定がなされる。Xはヴァージョンの数値)
http://www-lab.imr.tohoku.ac.jp/~hitachi/app/compiler/usage_ifort_mpi.html
https://web.kudpc.kyoto-u.ac.jp/manual/ja/library/intelmpi#modules
https://www.isus.jp/products/fortran-compilers/sigsegv-or-sigbus-errors/

□ python 2.7.6
1. download: http://www.python.jp/download/
2. tar zxvf  Python-2.7.6
3. CC="gcc -pg" ./configure
4. sudo make install
----------------------------------

------------------------------------------------------------------------------
Fortranデバッグ用オプション (その他、ライブラリーのベンチマークなど有用な情報がある)
http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/fswiki/wiki.cgi?page=Fortran%A5%C7%A5%D0%A5%C3%A5%B0%CD%D1%A5%AA%A5%D7%A5%B7%A5%E7%A5%F3 がオススメ。
------------------------------------------------------------------------------
■ ubnutu10.04 以降ではlibstdc++.so.5がダウンロードされない。そのため、下記のプロセスが必要となる。(下記は調査中)
1) cd /etc/apt
2) sudo vi sources.list
3) 最後の行までカーソルを持っていったら o を入力
4) deb http://ftp.nara.wide.ad.jp/debian  squeeze main を入力
5) ESC を押し、その後、:wq を入力
6) Applications を開いて、Ubuntu Software Center にて libstdc++5 を検索する
参考文献
[1] https://forums.ubuntulinux.jp/viewtopic.php?id=8578&action=new
[2] http://packages.debian.org/stable/base/libstdc++5
[3] http://packages.debian.org/squeeze/i386/libstdc++5/download
------------------------------------------------------------------------------
■ コンパイラオプション比較
□ ifort compiler options (AkaiKKR)
-openmp: OpenMP* 宣言子に基づいてコンパイラーがマルチスレッド・コードを生成するようにします (-fopenmp と同じです)。
-openmp-stubs: シーケンシャル・モードで OpenMP* プログラムをコンパイルします。OpenMP* 宣言子は無視され、OpenMP* スタブ・ライブラリーがリンクされます。(シーケンシャル)
-pc80: 内部 FPU 精度を 64 ビットの仮数に設定します。(デフォルト)
-mp1: 浮動小数点の精度を上げます (速度に与える影響は -mp よりも少ないです)。
-mieee-fp: -mp と同じです。-mno-ieee-fp で無効にできます。
-i-dynamic: インテルが提供するライブラリーを動的にリンクします。-shared-intel を使用してください。
-mcmodel=medium: コードを最初の 2GB までに制限するようコンパイラーに指示します。データは制限されません。
-O2: 処理速度を最大限に最適化します。(デフォルト)
-[no-]ip  ファイル内の単一ファイル IPO を有効 (デフォルト)/無効にします。
□ ifort compiler options (WIEN2k)
-FR:  
-mp1: 浮動小数点の精度を上げます (速度に与える影響は -mp よりも少ないです)。
-w: 警告メッセージを表示しません。
-prec_div: 浮動小数点除算の精度を上げます (速度に多少影響します)。(=-prec-div)
-pc80: 内部 FPU 精度を 64 ビットの仮数に設定します。(デフォルト)
-pad: 変数と配列のメモリーレイアウトの変更を有効/無効 (デフォルト) にします。
-ip: ファイル内の単一ファイル IPO を有効 (デフォルト)/無効にします。
-align: 変数と配列のメモリーレイアウトを分析し、変更します。
-DINTEL_VML:
-traceback: ランタイムエラーの際、16 進のトレースバックではなく、シンボリック・トレースバックの表示に使用する PC 関連付けデータを生成するかどうかを指定します。
-assume buffered_io: 最適化機構とコード・ジェネレーターによって行われる仮定をbuffered_ioに指定します。
-axAVX,SSE4.2,SSE4.1,SSSE3,SSE3: 指定されたプロセッサー固有のコードを生成するとともに、汎用 IA-32 命令も生成します。<codes> には、次の 1 つまたは複数の項目が指定できます。
□ その他
-xHost: コンパイルを行うホストマシンで利用可能な最上位の命令セットとプロセッサー向けの命令を生成します。
-ipo: ファイル間の複数ファイル IPO を有効にします。
-no-prec-div: 浮動小数点除算の精度を上げます (速度に多少影響します)をしない
-mp: -fp-model <arg> を使用してください。浮動小数点の精度を上げます (速度に与える影響は -mp1より大きいです)。
-funroll-loops: デフォルトのヒューリスティックに基づいてループをアンロールします。
-[no-]unroll-aggressive: より強力なアンロールのヒューリスティックを有効にします。
-----
□ gfortran compiler options (AkaiKKR)
-mpc: Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)
-mieee-fp: 浮動小数点比較に IEEE 規格を使う
-Bdynamic, -dy, -call_shared: Link against shared libraries
-m64: Generate 64bit x86-64 code
-mavx: Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in functions and code generation
※ intel と似た機能のオプションは、gfortran ではmが最初に付いたものになっていることがある。
□ gfortran compiler options (WIEN2k)
-ffree-form: Assume that the source file is free form
-O2: Set optimization level to <number>
-ffree-line-length-none:  Allow arbitrary character line width in free mode
□ gfortran compiler options (OpenMX)
-O3: Set optimization level to <number>
-ffast-math: Project-Id-Version: gcc 3.0
-Dxt3:
-mavx: Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in functions and code generation
-fsignaling-nans: Disable optimizations observable by IEEE signaling NaNs
-funroll-all-loops: 全てのループでループ展開を行なう
-fopenmp: Enable OpenMP (implies -frecursive in Fortran)
-m64: Generate 64bit x86-64 code
-----
■ intel : gfortran options
-xHost : -march=native
-ipo : -flto
-no-prec-div : -ffast-math
-mp (=-mieee-fp) : -mieee-fp
-assume noprotect_parens : -fno-protect-parens
(default) : -fstack-arrays
-fast (=-xHOST -O3 -ipo -no-prec-div -static) : -march=native -O3 -flto -ffast-math  -static
-funroll-loops: -funroll-loops
-unroll-aggressive : -funroll-all-loops
□ ifort : gfortran options
ifort ≒ gfortran -O2 -ffast-math -mpc80 -fstack-arrays -m64 -ftree-vectorize -mtune=native -fno-protect-parens -flto
※ -flto は >= 4.9.0 で可能
□ icc : gcc options
icc ≒ gcc -O2 -ffast-math -mpc80 -m64 -ftree-vectorize -mtune=native
※ -flto は >= 4.9.0 で可能
[1] http://thatcadguy.blogspot.jp/2011/03/gnu-fortran-gfortran-vs-intel-fortran.html 
[2] http://www.hpc-sol.co.jp/support/intel_compiler_recipes/20121212_optimization.html 
[3] http://www.softek.co.jp/SPG/Pgi/TIPS/option_for_PDF.html 
[4] http://www.cqpub.co.jp/interface/column/freesoft/2002/200208/08-4.htm 
[5] http://www.isus.jp/article/compileroptimization/intel-compilers-101/ 
[6] http://www.isus.jp/article/compileroptimization/performance-tools-for-software-developers-intel-compiler-options/ (core, sse)
[7] http://gcc.gnu.org/ml/fortran/2009-05/msg00351.html
[8] http://stackoverflow.com/questions/21050913/will-gfortran-or-ifort-compilers-wisely-use-simd-instructions-when-summing-the-p
[9] http://users.physik.fu-berlin.de/~tburnus/gcc-trunk/benchmark/  (important!)
[10] http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html (gcc)
[11] http://stackoverflow.com/questions/1733627/anyone-here-has-benchmarked-intel-c-compiler-and-gcc (gcc)
[12] http://www.ijitee.org/attachments/File/v4i7/G1915124714.pdf (gcc)
[13] https://wiki.duke.edu/display/SCSC/Using+the+Intel+Compiler (gcc)
[14] http://wiki.gentoo.org/wiki/GCC_optimization/ja
[15] http://cpplover.blogspot.jp/2013/07/gcc.html
[16] http://qiita.com/_dozen_/items/9c54eb45341af6137442
[17] http://wiki.gentoo.org/wiki/CFLAGS
[18] https://wiki.archlinux.org/index.php/Makepkg_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29
[19] http://oku.edu.mie-u.ac.jp/~okumura/linux/?GCC
-----
□ ifort
-Wl,<o1>[,<o2>,...]: リンカーに o1、o2、その他のオプションを渡します。
□ gfortran
-Wl,<options>: カンマ区切りの <options> をリンカに渡す
-rpath=PATH: Set runtime shared library search path
-rpath-link=PATH: Set link time shared library search path
[1] https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/
[2] https://wiki.fysik.dtu.dk/niflheim/Compilers
[3] http://wiki.crc.nd.edu/wiki/index.php/ACML
□ ifort (Linux)
  $(MKLROOT)/lib/intel64/libmkl_blas95_lp64.a $(MKLROOT)/lib/intel64/libmkl_lapack95_lp64.a $(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_thread.a -Wl,--end-group $(MKLROOT)/lib/intel64/libmkl_blacs_openmpi_lp64.a -lpthread -lm
  -openmp -I$(MKLROOT)/include/intel64/lp64 -I$(MKLROOT)/include
□ ifort (Mac)
  $(MKLROOT)/lib/libmkl_blas95_lp64.a $(MKLROOT)/lib/libmkl_lapack95_lp64.a $(MKLROOT)/lib/libmkl_scalapack_lp64.a $(MKLROOT)/lib/libmkl_intel_lp64.a $(MKLROOT)/lib/libmkl_core.a $(MKLROOT)/lib/libmkl_intel_thread.a $(MKLROOT)/lib/libmkl_blacs_ _lp64.a -lpthread -lm  
  -openmp -I$(MKLROOT)/include/lp64 -I$(MKLROOT)/include

-rpath: 実行形式ファイルに埋め込まれる
-Wl,-rpath の方が -L/ でリンクするよりも計算速度が早くなる?
[1] http://dayafterneet.blogspot.jp/2011/06/ld-rpath-rpath-link.html
[2] http://unix.stackexchange.com/questions/22926/where-do-executables-look-for-shared-objects-at-runtime
[3] http://vega.sra-tohoku.co.jp/~kabe/vsd/dynald.html
[4] http://d.hatena.ne.jp/tomohikoseven/20120909/1347175783


QRコード
携帯用QRコード
アクセス数
ページビュー数
[無料でホームページを作成] [通報・削除依頼]