4.2 OpenMPによる高速化

4.2.1 OpenMPプログラム

OpenMPにより、計算時間の大部分を占める電磁界の更新を高速化することができます。
リスト4-2-1はEx成分を更新する関数です。
リスト3-2-1との違いは4行目の指示文だけです。
このようにFDTD法は並列化向きのアルゴリズムであるためにOpenMPを用いると簡単に並列化することができます。


リスト4-2-1 OpenMPプログラム(updateEx.c)
     1	void updateEx()
     2	{
     3		int    i;
     4	#pragma omp parallel for
     5		for (    i = iMin; i <  iMax; i++) {
     6		for (int j = jMin; j <= jMax; j++) {
     7			int64_t n = NA(i, j, 0);
     8			int64_t n1 = n - Nj;
     9			int64_t n2 = n - Nk;
    10			for (int k = kMin; k <= kMax; k++) {
    11				int m = iEx[n];
    12				Ex[n] = C1[m] * Ex[n]
    13				      + C2[m] * (RYn[j] * (Hz[n] - Hz[n1])
    14				               - RZn[k] * (Hy[n] - Hy[n2]));
    15				n++;
    16				n1++;
    17				n2++;
    18			}
    19		}
    20		}
    21	}

4.2.2 領域分割について

リスト4-2-1においてX,Y,Z方向のインデックスの範囲はそれぞれ(0-Nx),(0-Ny),(0-Nz)ではなく、 (iMin-iMax),(jMin-jMax),(kMin-kMax)としています。
このようにするとMPIにおいて領域分割したときとコードを共通化することができます。 iMin,iMax,jMin,jMax,kMin,kMaxを適当に設定することにより任意の部分領域に対応することができます。

4.2.3 OpenMPの計算時間

表4-2-1と図4-2-1にスレッド数を1〜40と変えたときの計算時間を示します。
10スレッドまで速くなりますがそれ以上はあまり速くなりません。

表4-2-1 OpenMPの計算時間
(FOCUSスパコンFシステム、Xeon E5-2698v4 X 2、()内は1スレッドとの速度比)
スレッド数ベンチマーク100ベンチマーク200ベンチマーク300ベンチマーク400
121.4秒 (1.0)200.5秒 (1.0)800.9秒 (1.0)2327.8秒 (1.0)
210.9秒 (1.9)104.3秒 (1.9)413.1秒 (1.9)1158.6秒 (2.0)
4 6.4秒 (3.3) 59.4秒 (3.3)228.6秒 (3.5) 638.1秒 (3.6)
10 3.0秒 (7.1) 35.6秒 (5.6)140.7秒 (5.6) 381.9秒 (6.0)
20 2.2秒 (9.7) 32.0秒 (6.2)123.4秒 (6.4) 311.4秒 (7.4)
40 2.2秒 (9.7) 32.9秒 (6.0)117.4秒 (6.8) 288.6秒 (8.0)


図4-2-1 OpenMPの計算時間
(FOCUSスパコンFシステム、Xeon E5-2698v4 X 2)