C, Fortran 環境の構築

既に, gcc, gfortran がインストールされているものとする. Debian パッケージの openmpi と mpich はいくつか問題がある.

  • openmpi : PBS から使うと色々なワーニングが表示される. PBS と連携するようにコンパイルされていないようだ.
  • mpich : PBS から利用するときは -launcher fork オプションをつけると動く. しかし, PBS の mpiprocs で並列数を制御できない.

ここでは openmpi を手動でコンパイルすることにする.

openmpi 4.1.0 のインストール.

<URL:https://www.open-mpi.org/software/ompi/v4.1/> から必要なパッケージをダウンロードして利用する.

$ cd src

$ wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.0.tar.gz

$ tar zxvf openmpi-4.1.0.tar.gz

$ cd openmpi-4.1.0

$ lv README

  PBS と連携させるときは --with-tm=<directory> をつけることがわかる. 

$ mkdir build

$ cd build

$ ../configure --prefix=/usr/local/openmpi --with-tm=/opt/pbs/ --enable-shared --enable-static\
   --with-cuda=/usr/local/cuda/ --enable-mpi-interface-warning 

$ make -j 8

$ sudo make install

面倒なので, /usr/local 以下にリンクを作っておく.

$ cd /usr/local/bin
$ ln -s /usr/local/bin/openmpi/bin/* ./

$ cd /usr/local/lib
$ ln -s /usr/local/bin/openmpi/lib/* ./

$ cd /usr/local/include
$ ln -s /usr/local/bin/openmpi/include/* ./

シングル版. C 言語

テストコードとして, <URL:https://i.riken.jp/supercom/documents/himenobmt/> に公開されている姫野ベンチマークを利用する. 以下は各計算ノードに直接ログインして実行可能かを確かめている.

姫野ベンチマークを動かしてみる. 特に問題ない.

$ wget https://i.riken.jp/wp-content/uploads/2015/07/cc_himenobmtxp_s.zip
$ unzip cc_himenobmtxp_s.zip 
$ lha x cc_himenobmtxp_s.lzh 
$ make
$ ./bmt

シングル版. Fortran90

姫野ベンチマークを動かしてみる. 特に問題ない.

$ wget https://i.riken.jp/wp-content/uploads/2015/07/f90_xp.zip
$ unzip f90_xp.zip 
$ lha x f90_xp.lzh 
$ gfortran himenoBMTxp.f90 
$ ./a.out

C + MPI, static allocate version

姫野ベンチマークを動かしてみる. 特に問題ない.

$ wget https://i.riken.jp/wp-content/uploads/2015/07/cc_himenobmtxp_mpi.zip
$ unzip cc_himenobmtxp_mpi.zip 
$ lha x cc_himenobmtxp_mpi.lzh 
$ sh paramset.sh M 1 1 2
$ mv Makefile.sample Makefile
$ make
$ mpirun -np 2 ./bmt    

Fortran + MPI

姫野ベンチがうまく動かなかった. 本来であれば与えたプロセッサ数で適当に領域を区分するようだが, なぜかその部分で止まってしまった.

ここでは簡単なテストのみ実行する.

$ vi test.f90

  program sample00
   use mpi
   implicit none
   integer :: myrank, numprocs, ierr
   call MPI_INIT(ierr)
   call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
   call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
   print *, repeat('#',myrank+1)
   call MPI_FINALIZE(ierr)
 end program sample00 
$ mpif90 test.f90

$ mpirun -n 3 ./a.out

  # がプロセッサの数だけ表示される. 

C + OMP, dynamic allocate version

簡単なサンプルコードの実行

$ vi test.c

  #include <stdio.h>
  #include <omp.h>
  int main()
  {
  #pragma omp parallel
    {
    printf("Hello World from %d of %d\n",
    omp_get_thread_num(), omp_get_num_threads());
    }
  }

$ gcc -fopenmp test.c
$ ./a.out
  コア数分の hello! が表示される.

姫野ベンチを試す

$ wget https://i.riken.jp/wp-content/uploads/2015/07/himenobmtxp_cc_omp_al.zip
$ unzip himenobmtxp_cc_omp_al.zip 
$ lha x himenobmtxp_cc_omp_al.lzh 
$ gcc -fopenmp himenoBMTxp_omp.f90 
$ ./a.out

F90 + OMP

簡単なサンプルコードの実行

$ vi test.f90

  program helloOpenMP
    !$ use omp_lib
    implicit none
    print *, "START"
  !$omp parallel
    print *, "Hello! N =", omp_get_num_threads(), " and I am ", omp_get_thread_num()
  !$omp end parallel
    print *, "END"
  end
$ gfortran -fopenmp test.f90 
$ ./a.out
  コア数分の hello! が表示される.

OMP でコア数の制限をかけるには, 環境変数を設定する.

$ export OMP_NUM_THREADS=4
$ ./a.out 
   START
   Hello! N =           4  and I am            0
   Hello! N =           4  and I am            3
   Hello! N =           4  and I am            1
   Hello! N =           4  and I am            2
   END

姫野ベンチを試す

$ wget https://i.riken.jp/wp-content/uploads/2015/07/f90_xp_omp.zip
$ unzip f90_xp_omp.zip 
$ lha x f90_xp_omp.lzh 
$ gfortran -fopenmp himenoBMTxp_omp.f90 
$ ./a.out