4. コンパイラーの比較

ここではOpenFDTDを例にとってコンパイラーの性能の比較を行います。

4.1 測定環境

表4.1のハードウェア構成で計算時間を測定します。

表4.1 ハードウェア構成
項目FシステムHシステム
CPU/ノードIntel Xeon E5-2698 v4 2.20GHz x2Intel Xeon D-1541 2.1GHz x1
コア数/ノード408
メモリー/ノード128GB64GB
総ノード数62136
GPU2ノード(Tesla P100 各1基)なし
ノード間ネットワークInfiniBand FDR (56Gbps)Ethernet (10Gbps)
利用料(1ノード1時間,平成30年度)500円100円

4.2 コンパイラーのバージョンの比較

表4.2にコンパイラーのバージョンと計算時間の関係を示します。
コンパイルオプションについては後に述べるよう最も速い設定にしています。 これからgccとIntel C/C++(icc)ではバージョンによる違いは小さいと言えます。
以下では gcc 4.4.7 または icc 17.0.1 を使用します。

表4.2 コンパイラーのバージョンと計算時間の関係(Hシステム、1スレッド、SIMDなし、benchmark1.ofd)
モジュール名コンパイラーコンパイルオプション計算時間
なしgcc 4.4.7-O330.8秒
PrgEnv-gnu482gcc 4.8.2-O330.6秒
PrgEnv-gnu630gcc 6.3.0-O330.4秒
PrgEnv-intel-16.0.2.181Intel C/C++ 16.0.2-O3 -ipo20.8秒
PrgEnv-intel-17.0.1.132Intel C/C++ 17.0.1-O3 -ipo20.8秒

4.3 コンパイルオプション

表4.3にコンパイルオプションと計算時間の関係を示します。
gccではコンパイルオプションによる差はありませんが、 iccでは"-ipo"をつけると約1.5倍速くなります。 これからOpenFDTDではiccではコンパイルオプション"-ipo"をつけたほうが望ましいです。 ("-ipo"はファイル間のメモリー利用を効率化するオプションです)
以下では gccのコンパイルオプションは"-O3"、 iccのコンパイルオプションは"-O3 -ipo" とします。

表4.3 コンパイルオプションと計算時間の関係(Hシステム、1スレッド、SIMDなし、benchmark1.ofd)
コンパイラーコンパイルオプション計算時間
gcc 4.4.7-O230.9秒
gcc 4.4.7-O330.8秒
icc 17.0.1-O231.4秒
icc 17.0.1-O331.3秒
icc 17.0.1-O3 -ipo20.8秒

4.4 MPIライブラリー

表4.4にMPIライブラリーを変えたときの1プロセスと4プロセスの計算時間を示します。
これから以下のことがわかります。

以下ではCUDAとの併用も考えて MPIを使用するときはコンパイラーはgcc 4.4.7、 MPIライブラリーはgnu/openmpi211-cuda とします。

表4.4 MPIライブラリーと計算時間の関係(Hシステム、1ノード、SIMDなし、benchmark1.ofd)
コンパイラーMPIライブラリーコンパイルオプション1プロセス計算時間4プロセス計算時間
gcc 4.4.7 (mpicc)gnu/mpich2141p1-O332.3秒9.9秒
gcc 4.4.7 (mpicc)gnu/openmpi211-cuda-O332.2秒9.8秒
gcc 4.4.7 (mpicc)gnu/openmpi213-O332.2秒9.9秒
icc 17.0.1 (mpiicc)impi-O3 -ipo33.1秒10.1秒

4.5 並列化手法の比較

表4.5と図4.1にOpenMPのスレッド数とMPIのプロセス数を変えたときの計算時間を示します。
コンパイラーはgcc 4.4.7、MPIライブラリーはgnu/openmpi211-cudaです。
これから コア数が多いときはMPIの方が速い ことがわかります。
なお、問題のサイズが大きくなるとコア数が多いときの速度比は上がります。

表4.5 並列化手法と計算時間の関係(Fシステム、1ノード、SIMDなし、benchmark2.ofd)
スレッド数、プロセス数OpenMPMPI
1208.5秒208.0秒
2108.9秒107.3秒
462.2秒56.9秒
1038.9秒28.2秒
2038.4秒20.0秒
4038.7秒19.9秒

図4.1 並列化手法と速度比の関係

4.6 OpenMPとMPIの併用

共有メモリー並列化であるOpenMPと分散メモリー並列化であるMPIは併用することができます。
表4.6に総コア数=16を一定とし、OpenMPのスレッド数とMPIのプロセス数の配分を変えたときの計算時間を示します。
コンパイラーはgcc 4.4.7、MPIライブラリーはOpenMPI 2.1.3です。
これからMPIのプロセス数が多い方が速いことがわかります。 従って、OpenMPIとMPIを併用するよりMPI単独の方が速い、と言えます。

表4.6 OpenMPとMPIの併用(総コア数=16一定、Fシステム、SIMDなし、benchmark2.ofd)
OpenMPスレッド数MPIプロセス数計算時間
11622.5秒
2821.7秒
4422.2秒
8235.7秒
16141.3秒

4.7 コンパイラーのまとめ

本章でわかったことをまとめると以下のようになります。

  1. gccもIntel C/C++もバージョンによる違いは小さい。
  2. コンパイルオプションはgccでは"-O3"、Intel C/C++では"-O3 -ipo"がよい。
  3. MPIライブラリによる違いは小さい。
  4. コア数が多いときMPIはOpenMPより速い。
  5. 同じコア数を使用するならOpenMPとMPIを併用するよりMPI単独の方が速い。
以上から現時点での開発環境は、gcc 4.4.7 + gnu/openmpi211-cuda がよいと言えます。