4.7 XeonPhiによる高速化

4.7.1 XeonPhiプログラム

XeonPhiプログラムはOpenMPを用いた並列化とコンパイラーの自動ベクトル化から成ります。
4.3で述べたOpenMPプログラムはXeonPhiでの使用も想定されていますのでそのまま使用することができます。
XeonPhiはコア単体の性能が低いので少しでも計算時間のかかる部分はすべて並列化する必要があります。
ここでは以下を並列化しています。 すべて"#pragma omp"で始まる指示文を挿入するだけで並列化できます。

  1. 電磁界更新(updateEx.c/updateEy.c/updateEz.c/updateHx.c/updateHy.c/updateHz.c)
  2. Mur吸収境界条件(murHx.c/murHy.c/murHz.c)
  3. PML吸収境界条件(pmlEx.c/pmlEy.c/pmlEz.c/pmlHx.c/pmlHy.c/pmlHz.c)
  4. 平均電磁界(average.c)
  5. 近傍界観測面DFT(dftNear2dX.c/dftNear2dY.c/dftNear2dZ.c)
  6. 遠方界(farfield.c)

4.7.2 コンパイル・リンク・実行方法

コンパイル・リンク・実行方法は以下のようになります。[3]

コンパイルオプションとリンクオプションに"-mmic"をつけてコンパイル・リンクします。
実行プログラムをコプロセッサーにコピーします。
$ scp ofd_mic mic0:.
コプロセッサーにloginします。
$ ssh mic0
環境変数KMP_AFFINITYを設定します。
$ export KMP_AFFINITY=scatter
プログラムを実行します。
$ ./ofd_mic -n スレッド数 入力データ
ここでスレッド数はコア数の1/2/3/4倍のうち最も速い値を設定して下さい。

4.7.3 XeonPhiの計算時間

表4-7-1にスレッド数と環境変数KMP_AFFINITYを変えたときの計算時間の測定結果を示します。
測定環境は[3]と同じです。 コア数が57ですのでスレッド数は57/114/171/228としています。
本ケースではKMP_AFFINITY=compactで228スレッドのときが最も速くなっていますが、 通常は安定して速いKMP_AFFINITY=scatterでコア数=114/171/228をお勧めします。
下記の計算時間は表4-5-1のCUDAの21.4秒とほぼ同じです。
これからXeonPhiは中上位のGPUとほぼ同じ性能であることがわかります。

表4-7-1 XeonPhiの計算時間(ベンチマークNo.2, Linux, icc)
スレッド数KMP_AFFINITY=scatterKMP_AFFINITY=compact
5730.0秒51.3秒
11423.8秒29.9秒
17123.9秒29.8秒
22822.9秒20.9秒