クラスターの使い方

注意事項

  • 計算専用なので, ディスクは最低限しかつけていない.
  • データのバックアップは各自で行うこと.

コンパイル (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

Intel Fortran

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
    • #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つのプロセスを指定
      • nodes=[指定ノード]:ppn=[使用コア数]+[指定ノード]:ppn=[使用コア数]+... とすると任意のノードとそれぞれ使用するコア数を指定できる.
        • 例: #PBS -l nodes=hikari101:ppn=4+hikari108:ppn=2+...
          • 意味: hikari101 で 4 コア, hikari108 で 2 コア, ..., を指定.
    • 注意: #!/bin/sh と #PBS で始まる行との間に空行や別のコマンド行が入ってはいけない.
  • ジョブの実行

    $ 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