NAS Parallel BenchmarksによるMPI性能のベンチマーク

# NAS Parallel Benchmarksとは？

NASAが開発している，並列計算ベンチマークスイート．
主にCFDなどの流体シミュレーションを想定し，様々な計算カーネル（シミュレーションのコアとなる部分）や疑似アプリケーションでテストすることが可能．
MPI版，OpenMP版，グリッド・コンピューティング版などのバリエーションが存在している．

今回は，MPIが動作しているPC Cluster上で，ベンチマーク測定を行う．


# テスト環境
- CentOS 6.9
- gcc 4.8.2
- gfortran 4.4.7
- OpenMPI 1.10
- NPB 3.3.1

ただし，特定の環境に依存する要素は少ないので，他のOSや，コンパイラ・MPI環境での動作すると思われる．
`make`, `gcc`, `mpicc`, `f77`, `mpif77`などのコマンドが動作するか，事前に確認しておくと良い．


# ベンチマーク概要
## ベンチマークの種類
- 計算カーネル
  - `IS`: 整数ソート．ランダムメモリアクセス
  - `EP`: Embarrassingly Parallel．ノード間通信はほとんど発生しない
  - `CG`: CG法．事前に予測困難な通信パターン
  - `MG`: マルチグリッド計算．遠距離近距離両方での通信パターン．
  - `FT`: 3次元FFT．all-to-all通信．
- 疑似アプリケーション
  - `BT`: 3重対角行列の連立1次方程式ソルバー
  - `SP`: 5重対角行列の連立1次方程式ソルバー
  - `LU`: LU分解による連立1次方程式ソルバー

## ベンチマークの規模
- `S`: スモールサイズ．テスト実行用
- `W`: ワークステーション向けサイズ
- `A`, 'B', 'C': 実ベンチマーク用．それぞれ　4倍ずつ大きくなっている．
- `D`, `E`, `F`: 大規模ベンチマーク用．それぞれ16倍ずつ大きくなっている．

詳細: https://www.nas.nasa.gov/publications/npb_problem_sizes.html

# ベンチマークの実行
何はともあれ
- https://www.nas.nasa.gov/publications/npb.html
より，ソースコードをダウンロードし，解凍．

```shell-session
$ wget https://www.nas.nasa.gov/assets/npb/NPB3.3.1.tar.gz
$ tar xvzf NPB3.3.1.tar.gz
```

## シリアル実行
まずは単体ノードで実行する．

### コンパイル
コンパイル設定（`config/make.def`）とテストスイート設定（`config/suite.def`）を作成する必要があるが，試験的な実行であれば，テンプレートをそのままコピーすれば良い．
そして，`make suite`．


```shell-session
$ cd NPB3.3.1/NPB3.3-SER
$ cp config/make.def.template config/make.def
$ cp config/suite.def config/suite.def
$ make suite
```

ちなみにデフォルトのスイート設定は以下の様になっているため，それぞれに対応する実行ファイルが，`bin`に出力される．

```shell-session
$ cat config/suite.def
ft      S
mg      S
sp      S
lu      S
bt      S
is      S
ep      S
cg      S
ua      S
dc      S
$ ls bin
bt.S.x  cg.S.x  dc.S.x  ep.S.x  ft.S.x  is.S.x  lu.S.x  mg.S.x  sp.S.x  ua.S.x
```

### 実行
`bin`にあるファイルをそのまま実行する．

```shell-session
 $ ./bin/bt.S.x

 NAS Parallel Benchmarks (NPB3.3-SER) - BT Benchmark

 No input file inputbt.data. Using compiled defaults
 Size:   12x  12x  12
 Iterations:   60    dt:   0.010000

 Time step    1
 Time step   20
 Time step   40
 Time step   60
 Verification being performed for class S
 accuracy setting for epsilon =  0.1000000000000E-07
 Comparison of RMS-norms of residual
           1 0.1703428370954E+00 0.1703428370954E+00 0.7201925617357E-13
           2 0.1297525207003E-01 0.1297525207003E-01 0.3680617304070E-12
           3 0.3252792698948E-01 0.3252792698949E-01 0.1275660313637E-12
           4 0.2643642127515E-01 0.2643642127517E-01 0.8077661407724E-12
           5 0.1921178413175E+00 0.1921178413174E+00 0.1349364923488E-12
 Comparison of RMS-norms of solution error
           1 0.4997691334580E-03 0.4997691334581E-03 0.1963312458515E-12
           2 0.4519566678297E-04 0.4519566678296E-04 0.2412401204172E-12
           3 0.7397376517297E-04 0.7397376517292E-04 0.6065990734533E-12
           4 0.7382123863238E-04 0.7382123863244E-04 0.8375181727013E-12
           5 0.8926963098749E-03 0.8926963098749E-03 0.3485687350348E-13
 Verification Successful


 BT Benchmark Completed.
 Class           =                        S
 Size            =             12x  12x  12
 Iterations      =                       60
 Time in seconds =                     0.18
 Mop/s total     =                  1251.22
 Operation type  =           floating point
 Verification    =               SUCCESSFUL
 Version         =                    3.3.1
 Compile date    =              10 May 2017

 Compile options:
    F77          = f77
    FLINK        = $(F77)
    F_LIB        = (none)
    F_INC        = (none)
    FFLAGS       = -O
    FLINKFLAGS   = -O
    RAND         = (none)


 Please send all errors/feedbacks to:

 NPB Development Team
 npb@nas.nasa.gov
```

## 並列実行

### コンパイル
単体実行と同様に，コンパイル設定とテストスイート設定を作成する必要がある．
`suite.def`では，問題サイズとプロセス数を指定することができる．
`make.def`については，コンパイラ設定などを環境に合わせて設定する必要がある．

```shell-session
$ cd NPB3.3.1/NPB3.3-MPI
$ cp config/make.def.template config/make.def
$ cp config/suite.def config/suite.def
$ emacs config/make.def
```

- `make.def`の編集箇所．コンパイラに`mpif77`と，`mpicc`を指定．

```
MPIF77 = mpif77
MPICC = mpicc
```

- `suite.def`の編集後．`W`（ワークステーションサイズ），プロセッサ数4．

```
ft      W       4
mg      W       4
sp      W       4
lu      W       4
bt      W       4
is      W       4
ep      W       4
cg      W       4
dt      W       4
```

`suite.def`と`make.def`の準備ができたら，`make`

```shell-session
$ make suite
```

### 実行

```shell-session
$ mpirun -np 4 ./bin/bt.A.4


 NAS Parallel Benchmarks 3.3 -- BT Benchmark

 No input file inputbt.data. Using compiled defaults
 Size:   64x  64x  64
 Iterations:  200    dt:   0.0008000
 Number of active processes:     4

 Time step    1
 Time step   20
 Time step   40
 Time step   60
 Time step   80
 Time step  100
 Time step  120
 Time step  140
 Time step  160
 Time step  180
 Time step  200
 Verification being performed for class A
 accuracy setting for epsilon =  0.1000000000000E-07
 Comparison of RMS-norms of residual
           1 0.1080634671464E+03 0.1080634671464E+03 0.7101254243319E-14
           2 0.1131973090122E+02 0.1131973090122E+02 0.9415542762816E-15
           3 0.2597435451158E+02 0.2597435451158E+02 0.6838887328685E-15
           4 0.2366562254468E+02 0.2366562254468E+02 0.6455215276928E-14
           5 0.2527896321175E+03 0.2527896321175E+03 0.1259241302557E-13
 Comparison of RMS-norms of solution error
           1 0.4234841604053E+01 0.4234841604053E+01 0.1048656009767E-14
           2 0.4439028249700E+00 0.4439028249700E+00 0.6752834174215E-14
           3 0.9669248013635E+00 0.9669248013635E+00 0.3100139909806E-14
           4 0.8830206303977E+00 0.8830206303977E+00 0.6286506715733E-15
           5 0.9737990177083E+01 0.9737990177083E+01 0.1824151397873E-14
 Verification Successful


 BT Benchmark Completed.
 Class           =                        A
 Size            =             64x  64x  64
 Iterations      =                      200
 Time in seconds =                    32.49
 Total processes =                        4
 Compiled procs  =                        4
 Mop/s total     =                  5179.74
 Mop/s/process   =                  1294.94
 Operation type  =           floating point
 Verification    =               SUCCESSFUL
 Version         =                    3.3.1
 Compile date    =              11 May 2017

 Compile options:
    MPIF77       = mpif77
    FLINK        = $(MPIF77)
    FMPI_LIB     = -L/usr/local/lib -lmpi
    FMPI_INC     = -I/usr/local/include
    FFLAGS       = -O
    FLINKFLAGS   = -O
    RAND         = (none)


 Please send feedbacks and/or the results of this run to:

 NPB Development Team
 Internet: npb@nas.nasa.gov
```

# 結果例
随時追加．

# 参考
- [NAS Parallel Benchmarks](https://www.nas.nasa.gov/publications/npb.html)
- [NAS Parallel Benchmarks, RNR-94-007](https://www.nas.nasa.gov/assets/pdf/techreports/1994/rnr-94-007.pdf)