tar xzvf l_fcompxe_intel64_2011.1.107.tgz cd l_fcompxe_intel64_2011.1.107/ sudo ./install.sh
bash使いの人は~/.bashrcに以下を記述.
source /opt/intel/bin/compilervars.sh intel64
インストールに必要なopenjdk-6-jre,ia32-libsをインストール.
sudo apt-get install openjdk-6-jre ia32-libs
openjdk-6-jreにしたのは気分.sunのjavaでも可.
http://bootstrapping.wordpress.com/2009/11/25/missing-libstdc-so-5-in-ubuntu-9-10-karmic/ に書いてあるとおりにlibstdc++5をインストール.
wget http://security.ubuntu.com/ubuntu/pool/universe/i/ia32-libs/ia32-libs_2.7ubuntu6.1_amd64.deb dpkg-deb -x ia32-libs_2.7ubuntu6.1_amd64.deb ia32-libs sudo cp ia32-libs/usr/lib32/libstdc++.so.5.0.7 /usr/lib32/ cd /usr/lib32 sudo ln -s libstdc++.so.5.0.7 libstdc++.so.5
これがないとifortのインストール途中で下記のような文句を言われる.
32-bit libraries not found on this system. This product release requires the presence of 32-bit compatibility libraries when running on Intel(R) 64 architecture systems. One or more of these libraries could not be found: libstdc++ libstdc++5 glibc libgcc Without these libraries, the compiler will not function properly. Please refer to Release Notes for more information.
http://software.intel.com/en-us/articles/non-commercial-software-download/ よりソースをダウンロード.Xeonの場合はintel64を選択。
tar xzvf l_cprof_p_11.1.064_intel64.tgz cd l_cprof_p_11.1.064_intel64 sudo ./install.sh
選択はデフォルトでOK.
入ったと思いきや、
/opt/intel/Compiler/11.1/069/bin/intel64/fortcom: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory ifort: error #10273: /opt/intel/Compiler/11.1/069/bin/intel64/fortcom の致命的なエラー、0x7f で終了しました。
というエラーが発生。すべての9.10で起きたわけではないので、ハードウェア依存??
仕方がないので、他の方法でlibstdc++5を再インストール http://hsmak.wordpress.com/2009/12/01/how-to-fix-libstdc5-dependency-problem-in-ubuntu-9-10/ を参考に
sudo rm /usr/lib32/libstdc++.so.5* wget http://ftp.riken.go.jp/pub/Linux/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_amd64.deb sudo dpkg -i libstdc++5_3.3.6-17ubuntu1_amd64.deb
ここでは、ver11.0.074 intel64版をインストール。
$ tar xzvf l_cprof_p_11.0.074_intel64.tgz $ cd l_cprof_p_11.0.074_intel64 $ sudo ./install.sh
言われるがままに進む。途中パスワードの認証(activation)が必要。 インストール直前にbinutilsあたりでヴァージョンの違いについて文句を言われる。 おそらくifortが要求するヴァージョンよりもubuntuにインストールされているパッケージのヴァージョンの方が新しいので問題ない。 パッケージが不足している場合インストール中にメッセージが出る。 メッセージを読んで必要なものを入れる1)。
$ sudo apt-get install libstdc++5 g++ binutils sun-java6-jre
64bitの場合、32bitがどうのこうのというエラーが出るかもしれないので、ia32-libsもインストール。
$ sudo apt-get install ia32-libs
まず、ifortのパスを通したり、ライブラリのパスを通すため、環境変数の設定を行う。
使用前に端末で以下を入力2)。
$ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64]
あるいは、~/.bashrcの最後の行に以下を追記。
$ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64]
$ . /opt/intel/Compiler/11.0/074/bin/ifortvars.csh [ia32|intel64|ia64]
とするか、~/.cshrcを編集
$ . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh [ia32|intel64|ia64]
とすると、
/opt/intel/Compiler/11.0/074/bin/ifortvars.sh:82: = not found
なんてエラーが出る。 おそらくbashとzshの文法の違い。 エラーが出たシェルの == を = に書き直せば、うまく動作する。 例えば、intel64の場合、/opt/intel/Compiler/11.0/074/bin/ifortvars.shと/opt/intel/Compiler/11.0/074/bin/intel64/ifortvars_intel64.shの2つを書き換えればよい。複数のユーザーで使用している場合は、*.shを*.zshにコピーするなどの変更を加えるなどして、zsh専用のファイルを作るのがお行儀が良いかも。 以下の2ファイルを作成すればよい。
こんな感じかしら(32bit版の場合)
$ sudo sh -c "sed 's/==/=/g' /opt/intel/Compiler/11.0/074/bin/ifortvars.sh > /opt/intel/Compiler/11.0/074/bin/ifortvars.zsh"\\ $ sudo sh -c "sed 's/==/=/g' /opt/intel/Compiler/11.0/074/bin/ia32/ifortvars_ia32.sh > /opt/intel/Compiler/11.0/074/bin/ia32/ifortvars_ia32.zsh"\\ $ sudo sh -c "sed -i -e 's/.sh/.zsh/g' /opt/intel/Compiler/11.0/074/bin/ifortvars.zsh"
sudo sh -c “ “はsudoでリダイレクトするときの常套手段。
http://accc.riken.jp/HPC/training/text.html
http://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html これくらいオプションをつけて実行すれば,だいたいエラーは検出されそう.
ifort -check all -warn declarations -CB -fpe0 -traceback
コンパイラオプションも参照のこと
デフォルトのスタックサイズが小さすぎて、-openmpをやるときはスタックサイズを増やしてあげないと、頻繁にセグ落ちする。
!$OMP parallel write(*,*) KMP_GET_STACKSIZE_S() !$OMP end parallel
とやると、各スレッドのスタックサイズを返す。これを増やす場合は、最初の!$OMPの前に、
CALL KMP_SET_STACKSIZE_S(size)
とやれば良い。sizeは整数型の変数。所望のスタックサイズ(byte)を書けばよい。
ifortでは出力時に勝手に改行する仕様になっている。 改行を抑制するためには、Format文を使用すればよい。
適当なやり方。
write(*,'(100f)') a(:)
きちんとしたやり方。以下2chより引用。
http://pc12.2ch.net/test/read.cgi/tech/1163319215/532
532 名前:デフォルトの名無しさん [sage]: 2009/03/27(金) 05:59:41 亀だけど、Ifortなら<>がお勧め。 多次元配列の最初の数を入れることが多いです 例 program main implicit none integer,parameter :: num = 9 integer :: ii,jj real :: arry(num,num) do ii=1,num do jj = 1,num arry(ii,jj) = ii*jj enddo enddo write(6,'(<num>F)') arry end program
パッケージ名 | |
---|---|
lapack | 密行列やバンド行列を直説法で解く |
lapack95 | 密行列やバンド行列を直説法で解く |
blas95 | マトベク演算や内積演算を行う |
sparse_blas95 | 疎行列のマトベク演算行う |
pardiso | 疎行列を直説法で解く。(条件数の大きい問題向き) |
fgmres | 疎行列をFlexibleGMRESで解く。 |
MKLのコンパイラオプションは以下のとおり。
-L<MKL path> -I<MKL path> [-lmkl_lapack95] [-lmkl_blas95] [cluster components] [{-lmkl_{intel, intel_ilp64, intel_lp64, intel_sp2dp, gf, gf_ilp64, gf_lp64}] [-lmkl_{intel_thread, sequential}] [{-lmkl_solver, -lmkl_solver_lp64, -lmkl_solver_ilp64}] {{[-lmkl_lapack] -lmkl_{ia32, em64t, ipf}},-lmkl_core}} [{-lguide, -liomp5}] [-lpthread] [-lm]
[ ]はあってもなくても良い、{ }はどちらか選択という意味。 -L<MKL path> -I<MKL path>は pathが通っていれば明示する必要なし。
Intel(R) Math Kernel Library for the Linux* OS User's Guideに以下のような記述あり。
You are strongly encouraged to dynamically link in Intel® Legacy OpenMP* run-time library libguide and Intel® Compatibility OpenMP* run-time library libiomp. Linking to static OpenMP run-time library is not recommended, as it is very easy with layered software to link in more than one copy of the library. This causes performance problems (too many threads) and may cause correctness problems if more than one copy is initialized. You are advised to link with libguide and libiomp dynamically even if other libraries are linked statically.
The second relevant component is the Compiler Support RTL Layer. Prior to Intel MKL 10.0, this layer only included the Intel® Legacy OpenMP* run-time compiler library libguide. Now you have a new choice to use the Intel® Compatibility OpenMP* run-time compiler library libiomp. The Compatibility library provides support for one additional threading compiler on Linux (gnu). That is, a program threaded with a gnu compiler can safely be linked with Intel MKL and libiomp and execute efficiently and effectively.
libguideとlibiompはどちらかを選べば良いのだが、並列化をするのであれば、libiompを選択した方がよいかも。
ifort Version 12.0では以下のようにすれば動いた.
ifort hoge.f90 -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
ver 11くらい
ifort file.f90 -lmkl -lmkl_lapack -lmkl_em64t -lguide -lmkl_solver
$ cd /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/ $ sudo gnome-terminal
新しく開いた端末で作業3)。
# . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 # make libem64t # exit
コードのサンプルは /opt/intel/mkl/10.1.0.015/examples/lapack95/source/ にあり。ここではgesv.f90を参考にしながら説明。
(2010.06.22追記)最近のver.はライブラリの場所が変わったようだ.(というか今まで間違ったファイルを使ってだけかも….) Fortran90でLapack95使ったときのコンパイルコマンド.file.f90のところは適当に修正して下さい.
ifort file.f90 -L/opt/intel/Compiler/11.1/069/mkl/lib/em64t/ -I /opt/intel/Compiler/11.1/069/mkl/include/em64t/lp64/ -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread -O2
以下,古い情報
$ ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/ -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t -lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d
ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32 -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32/ -lmkl_lapack95 -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d
/opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の最初
USE MKL95_PRECISION, ONLY: WP => SP USE MKL95_LAPACK, ONLY: GESV
/opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の中頃
CALL GESV( A, B )
CALL GESV( AA, BB(:,1), IPIV, INFO )
$ cd /opt/intel/Compiler/11.0/074/mkl/interfaces/blas95 $ sudo gnome-terminal
# . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 # make libem64t # exit
コードのサンプルは /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/ にあり。ここでは dgemmx.f90を参考にしながら説明。
$ ifort /opt/intel/Compiler/11.0/074/mkl/include/mkl_blas.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/common_func.f -lmkl_blas95 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/blas/data/dgemmx.d
/opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 のはじめのあたり。
use mkl95_precision, only: wp => dp use mkl95_blas, only: gemm
$ ifort hoge.f90 -lmkl_solver_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
$ ifort hoge.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread
$ifort pardiso.f90 /opt/intel/Compiler/11.0/074/mkl/include/mkl_pardiso.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread
f77のコードは /opt/intel/Compiler/11.0/074/mkl/examples/solver/source/ 内にあり。
include 'mkl_pardiso.f90' program pardiso_test use MKL_PARDISO implicit none real(8),allocatable::a(:),b(:),x(:) integer::maxfct=1,mnum=1,mtype,phase=13,n,nzero,nrhs=1,iparm(64),msglvl=0,error type(mkl_pardiso_handle) :: pt(64) integer i,j integer,allocatable::ia(:),ja(:),perm(:) !!! this matrix is quoted by slatec document... ! |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 ! |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 ! | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 ! | 0 0 0 44 0| ! |51 0 53 0 55| !!! set parameter of pardiso pt(:)=mkl_pardiso_handle(0) iparm(1)=0 mtype=11 !!! assign values to variables n=5 nzero=11 allocate(a(nzero),b(n),x(n),ia(n+1),ja(nzero),perm(n)) ia(:)=(/1,4,6,8,9,12/) a(:)=(/11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0,44.d0,51.d0,53.d0,55.d0/) ja(:)=(/1,2,5,1,2,3,5,4,1,3,5/) !!! calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) b(:)=0.d0 do i=1,5 do j=ia(i),ia(i+1)-1 b(i)=b(i)+a(j)*ja(j) end do end do !!! solve linear equation by pardiso call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs,iparm,msglvl,b,x,error) if(error /= 0) then write(*,*) error stop end if write(*,*) x end program pardiso_test
fortran90のサンプルを書き換え。
program pardiso_test implicit none integer lzero,l parameter (lzero=11,l=5) real*8 a(lzero),b(l),x(l) integer maxfct,mnum,mtype,phase,n,nzero,nrhs,iparm(64), $ msglvl,error,pt(64),ia(l+1),ja(lzero),perm(l),i,j data ia /1,4,6,8,9,12/ data ja /1,2,5,1,2,3,5,4,1,3,5/ data a /11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0, $ 44.d0,51.d0,53.d0,55.d0/ ccc this matrix is quoted by slatec document... c |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 c |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 c | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 c | 0 0 0 44 0| c |51 0 53 0 55| ccc set parameter of pardiso do i=1,64 pt(i)=0 end do iparm(1)=0 mtype=11 maxfct=1 mnum=1 phase=13 nrhs=1 msglvl=0 ccc assign values to variables n=5 nzero=11 ccc calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) b(:)=0.d0 do i=1,5 do j=ia(i),ia(i+1)-1 b(i)=b(i)+a(j)*ja(j) end do end do ccc solve linear equation by pardiso call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs, $ iparm,msglvl,b,x,error) if(error /= 0) then write(*,*) error stop end if write(*,*) x end program
前処理を効率的に行えるようGMRESを改良したもの。前処理に反復解法が使える。