3.8 富士通スパコン

3.8.1 Fujitsu Supercomputer PRIMEHPC

Fujitsu Supercomputer PRIMEHPC FX700 [28](以下、FX)を用いた高速化について述べます。
FXのCPUは4個のCMG(Core Memory Group)を持ち、各CMGは12コアから成ります。 各コアは512ビットのSIMDベクトル演算を行うことができます。
各ノードは32GB(HBM2)のメモリーを持っています。

3.8.2 FXにおける高速化

FXの性能を生かすには以下の高速化技術が必要です。

  1. ベクトル化:一番内側のループをコンパイラーの自動ベクトル化機能によってベクトル化します。 必要なら強制ベクトル化を行います。
  2. スレッド並列化(共有メモリー):OpenMPを用いてスレッド並列を行います。 通常、粒度の一番大きい一番外側のループを並列化します。
  3. MPI並列化(分散メモリー):問題を分割し、MPIを使用して並列化します。 FXの性能を生かすにはCMG間をMPI並列化する必要があります。 従って1ノードで計算するときもMPI並列化が必須です。
本プログラムは前節まででOpenMPとMPIによって並列化されているので、 FXに対応するにはベクトル化が必要になります。

3.8.3 tradモードとclangモード

FXのコンパイラーには従来の富士通コンパイラー(tradモード)とClang/LLVMコンパイラー(clangモード)があります。
コンパイルオプションについては配布ファイルのMakefile_fccを参考にしてください。

(1) tradモード

tradモードではマクロ"__FUJITSU"が定義されます。
自動ベクトル化できないループを強制的にベクトル化するにはループの直前に制御文
#pragma loop novrec
をつけます。このときコンパイルオプション"-Kocl"が必要です。

(2) clangモード

コンパイルオプションに"-Nclang"をつけるとclangモードになり、 コンパイルオプションがGCCとほぼ同じになります。
clangモードではマクロ"__CLANG__FUJITSU"が定義されます。
自動ベクトル化できないループを強制的にベクトル化するにはループの直前に制御文
#pragma clang loop vectorize(assume_safety)
をつけます。コンパイルオプションは不要です。

表3-8-1に各モードの主要部のベクトル化の可否を示します。
どの組み合わせもベクトル化できません。

表3-8-1 主要部のベクトル化の可否
nomatrixモード
matrixE{x|y|z}.c
matrixモード
prodmvE{x|y|z}.c
tradモード××
clangモード××

表3-8-2に各モードの計算時間を示します。
clangモードはtradモードと比べて2〜4倍以上速くなります。
以上から将来性も考慮しclangモードを採用します。

表3-8-2 各モードの計算時間(benchmark100、FOCUS Xシステム、1ノード×4プロセス×12スレッド)
nomatrixモードmatrixモード
tradモード53.8秒46.3秒
clangモード22.5秒10.6秒

3.8.4 FXの計算時間

表3-8-3にFOCUS Xシステムの1〜6ノードの計算時間を示します。
参考までに富岳[29]の8ノードの結果も示しています。
問題のサイズが大きくなると多くのノード数が必要になります。
問題のサイズが小さいときはノード数を増やすとかえって遅くなります。
表より6ノードでは1ノードの最大3.0倍速くなることがわかります。
またmatrixモードはnomatrixモードより約2倍速くなります。
セル数が小さいときは計算の速いmatrixモードを使用し、 メモリーが足りなくなったら、ノード数を増やすかnomatrixモードを使用してください。
1ノードでの実行コマンドは以下の通りです。

$ mpiexec -n 4 ./oth_fcc_mpi -n 12 -matrix data/benchmark/benchmark100.oth (matrixモードのとき)
$ mpiexec -n 4 ./oth_fcc_mpi -n 12 -nomatrix data/benchmark/benchmark100.oth (nomatrixモードのとき)

表3-8-3 FXの計算時間(FOCUS Xシステム、clangモード、()内は1ノードとの速度比)
ノード数benchmark100benchmark200benchmark300benchmark400
nomatrixmatrixnomatrixmatrixnomatrixmatrixnomatrixmatrix
1 23.5秒 (1.0)10.6秒 (1.0)147.2秒 (1.0)70.2秒 (1.0)464.8秒 (1.0)メモリー不足メモリー不足メモリー不足
2 14.7秒 (1.6) 9.6秒 (1.1) 91.8秒 (1.6)45.9秒 (1.5)272.5秒 (1.7)メモリー不足メモリー不足メモリー不足
6 17.4秒 (1.4)11.8秒 (0.9) 59.9秒 (2.5)37.5秒 (1.9)155.7秒 (3.0)89.0秒 346.0秒 メモリー不足
8(富岳)14.5秒 (1.6) 9.7秒 (1.1) 56.1秒 (2.6)37.1秒 (1.9)129.1秒 (3.6)86.5秒 263.9秒 171.3秒