クラスターの使い方
注意事項
- 計算専用なので, ディスクは最低限しかつけていない.
- データのバックアップは各自で行うこと.
コンパイル (Fortran)
- Fortran のコンパイル例を示す.
一つのファイルの場合
以下のファイル (test.f90) をコンパイルする.
$cat test.f90 program test implicit none real(4) var var = 40.0e0 write(*,*) var end program test
PGI Fortran
最適化レベルは -fast でコンパイル. 最適化オプションについては PGI コンパイラ・オプションの使用法参照.
$ pgfortran -fast test.f90
- -fastsse にすると標準最適化 + sse, sse2 に適したコンパイルしてくれる. 計算機が sse, sse2 なら, -fastsse を使用するべき. hikari は未確認. でも -fastsse で良い気がする.
Intel Fortran
最適化レベルは -fast でコンパイル
$ ifort -fast test.f90
別のファイルのモジュールを用いる場合
- モジュールが同じファイル内ならば「一つのファイルの場合」と同様にコンパイルできる. しかしながら, モジュールのファイルが分かれている場合はコンパイルオプションを追加しなければならない.
以下のファイル (procedure.f90, module.f90) をコンパイルする (ファイルは http://www.nag-j.co.jp/fortran/FI_16.html を参考にしている).
$cat procedure.f90 program procedure use matrix_operations implicit none integer,dimension(2,3) :: v v(1,1) = 10 v(2,1) = 20 v(1,2) = 30 v(2,2) = 40 v(1,3) = 50 v(2,3) = 60 call mat_print(v) end program procedure $cat module.f90 module matrix_operations implicit none contains ! contains以降にモジュール手続きを記述する subroutine mat_print( a ) ! 行列を出力するサブルーチン integer,dimension(:,:),intent(in) :: a integer :: i, j do i = lbound(a,1), ubound(a,1) do j = lbound(a,2), ubound(a,2) write (*, '(I3)', advance='no') a(i,j) ! advance='no'は改行しない指定 end do write (*,*) ! 改行 end do end subroutine end module matrix_operations
PGI Fortran
最適化レベルは -fast でコンパイル.
$ pgfortran -fast -c module.f90 $ pgfortran -fast procedure.f90 module.o
Intel Fortran
最適化レベルは -fast でコンパイル.
$ ifort -fast module.f90 procedure.f90
自動並列
- PGI Fortran は自動並列を行える. 基本的に -Mconcur をつけるだけでできる. モジュールが別ファイルに分かれている場合は「別のファイルのモジュールの場合」に -Mconcur をつけるだけでできる.
- Intel Fortran は -parallel を付けることで行える. torque で動かすためには -static-intel をつける必要があるらしい.
PGI Fortran
最適化レベルは -fast でコンパイル.
$ pgfortran -fast -Mconcur test.f90
- 更に, -Minfo=par を付けるとどこを並列化してくれたか出力してくれる.
Intel Fortra
最適化レベルは -fast でコンパイル.
$ ifort -fast -parallel -static-intel test.f90
OpenMP
- PGI Fortran は OpenMP も対応している. 自動並列と同様に -mp をつけるだけらしい.
- Intel Fortran は -openmp を付けるとできる. torque に対応するには -static-intel をつける.
PGI Fortran
最適化レベルは -fast でコンパイル.
$ pgfortran -fast -mp test.f90
- 自動並列ならびに OpenMP については自動並列化並びにOpenMP 並列化を行うためのオプションを参照.
Intel Fortran
最適化レベルは -fast でコンパイル.
$ ifort -fast -openmp -static-intel test.f90
- OpenMP 等については<URL:http://wwweic.eri.u-tokyo.ac.jp/computer/manual/altix/prog/> を参照.
MPI
- MPI は hikari では現在 pgfortran のみ対応.
- 各種ソフトウェアのビルド を参照.
- Makefile を使わない場合は pgfortan の代わりに mpif90/mpif77 を使用してコンパイルすると良い.
ジョブの投入
- torque (pbs 互換) を利用.
- /work00 以下でジョブを実行する.
ジョブスクリプトの例 (今回は test.sh). 逐次版.
#!/bin/sh #PBS -N sample #PBS -j oe #PBS -v PBS_O_WORKDIR=/work00/hogehoge/test #PBS -o localhost:${PBS_O_WORKDIR}/outfile #PBS -q long #PBS -M hogehoge@domain.jp #PBS -m abe cd $PBS_O_WORKDIR ./a.out exit 0
ジョブスクリプトの例 (今回は test.sh). MPI 並列版
#!/bin/sh #PBS -N sample #PBS -j oe #PBS -v PBS_O_WORKDIR=/work00/hogehoge/test #PBS -o localhost:${PBS_O_WORKDIR}/outfile #PBS -q long #PBS -M hogehoge@domain.jp #PBS -m abe #PBS -l nodes=2:ppn=4 cd ${PBS_O_WORKDIR} mpiexec -n 8 ./a.out exit 0
ジョブスクリプトの例 (今回は test.sh). 自動並列版 & OpenMP 版
#!/bin/sh #PBS -N sample #PBS -j oe #PBS -v PBS_O_WORKDIR=/work00/hogehoge/test #PBS -o localhost:$PBS_O_WORKDIR/outfile #PBS -q long #PBS -M hogehoge@domain.jp #PBS -m abe #PBS -l nodes=1:ppn=4 cd ${PBS_O_WORKDIR} export OMP_NUM_THREADS=4 ./a.out exit 0
- それぞれの意味
- #PBS -N sample
- ジョブ名.
- #PBS -j oe
- 何を出力するか. o は標準出力. e はエラー出力.
- #PBS -v PBS_O_WORKDIR=/work00/hogehoge/test
- -v で環境変数を指定できる. PBS_O_WORKDIR は現在の計算を始めるディレクトリの絶対パスを指定する環境変数.
- #PBS -o localhost:${PBS_O_WORKDIR}/log/outfile
- -j で指定した出力の結果の保存先. この場合はlocalhost (つまり hikari) 内にある作業ディレクトリに outfile として保存される. 絶対パスでも指定できる. その場合は localhost: を削除すること.
- 例: #PBS -o /work00/hogehoge/test/outfile
- -j で指定した出力の結果の保存先. この場合はlocalhost (つまり hikari) 内にある作業ディレクトリに outfile として保存される. 絶対パスでも指定できる. その場合は localhost: を削除すること.
- #PBS -q long
- ジョブの種類. デフォルトは long. short にするとデバッグ用の短く優先する処理となる.
- #PBS -M hogehoge@domain.jp
- 操作時の報告メールの送り先指定
- #PBS -m abe
- どの操作時の報告をメールで送るかの指定. a が異常終了. b が計算はじめ. e が計算終了.
- #PBS -l nodes=2:ppn=4
- 並列計算に使用するノードとコア (プロセス) の指定. nodes が使用するノード数. ppn がコア (プロセス) 数.
- 最後に :[指定ノード] を付けると, 計算先ノードを指定できる.
- 例: #PBS -l nodes=1:ppn=4:hikari101
- 意味: hikari101 という一つのノードで4つのプロセスを指定
- 例: #PBS -l nodes=1:ppn=4:hikari101
- nodes=[指定ノード]:ppn=[使用コア数]+[指定ノード]:ppn=[使用コア数]+... とすると任意のノードとそれぞれ使用するコア数を指定できる.
- 例: #PBS -l nodes=hikari101:ppn=4+hikari108:ppn=2+...
- 意味: hikari101 で 4 コア, hikari108 で 2 コア, ..., を指定.
- 例: #PBS -l nodes=hikari101:ppn=4+hikari108:ppn=2+...
- 注意: #!/bin/sh と #PBS で始まる行との間に空行や別のコマンド行が入ってはいけない.
- #PBS -N sample
ジョブの実行
$ qsub test.sh
- 注意: test.sh に user の実行権限がないとうまく走らない.
ジョブの確認
$ qstat
ジョブの中止
- ジョブ番号は qstat コマンドで調べる
$ qdel [ジョブ番号]
計算ノードの確認
$ pbsnodes -a
PGI fortran を利用するときの環境設定
export PGI=/work00/pgi export PATH=$PGI/linux86-64/2012/bin:$PATH export MANPATH=$MANPATH:$PGI/linux86-64/2012/man export LM_LICENSE_FILE=$PGI/license.dat