C, Fortran 環境の構築
既に, gcc, gfortran がインストールされているものとする. Debian パッケージの openmpi と mpich はいくつか問題がある.
- openmpi : PBS から使うと色々なワーニングが表示される. PBS と連携するようにコンパイルされていないようだ.
- mpich : PBS から利用するときは -launcher fork オプションをつけると動く. しかし, PBS の mpiprocs で並列数を制御できない.
ここでは openmpi を手動でコンパイルすることにする.
openmpi 5.0.7 のインストール.
OpenMPI は ver. 5.0.7 が最新であった.それをダウンロードする.
$ wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.7.tar.gz $ tar zxvf openmpi-5.0.7.tar.gz $ cd openmpi-5.0.7 $ lv README
PBS と連携させるときは --with-tm=<directory> をつけることがわかる.
$ mkdir build $ cd build $ ../configure --prefix=/usr/local/openmpi --with-tm=/opt/pbs/ --enable-shared --enable-static \ --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