2.3

３次元電磁界コード FDTD3 の測定評価
名古屋大学太陽地球環境研究所

2.3.1.

梅田 隆行

はじめに
Finite-Difference-Time-Domain （ FDTD ）法 は、1966 年 に電 磁 場 解 析 用 のシミュレーション

手 法 として考 案 されて以 来 、幅 広 く用 いられている。オリジナルの FDTD 法 は、電 場 と磁 場 を時間 的 にΔt/2 ずらし、また電 場 成 分 (Ex,Ey,Ez)と磁 場 成 分 (Bx,By,Bz)も空 間 的 に半 格 子 ずらす
ことによって、メモリ消 費 量 を増 やさずに Maxwell 方 程 式 に基 づく時 間 空 間 差 分 を 2 次 精 度 で行う手 法 である。近 年 では音 響 解 析 にも利 用 され ており、質 量 密 度 と圧 力 を同 様 に空 間 的 に半 格
子 ずらすことによって 2 次 精 度 の時 間 空 間 差 分 を実 現 している。FDTD3 は、３次 元 の電 磁 場 解
析 をおこなうプログラムであり、プラズマ科 学 を含 む電 磁 場 の諸 問 題 に幅 広 く適 応 されている。

2.3.2.

プログラム概 要
FDTD コードは、Maxwell 方 程 式 による電 場 の更 新 と磁 場 の更 新 を交 互 に行 う。電 磁 場 の各

成 分 （ Ex,Ey,Ez,Bx,By,Bz ） は 、 空 間 差 分 が 2 次 精 度 に な る よ う に 、 Yee 格 子 と 呼 ば れ る
Staggered 格 子 上 に定 義 される。


 1 E  B  0 J  2
 c t
B E  
t

(1)
(2)

また、式 (1)及 び(2)の時 間 積 分 が２次 精 度 になるように、電 場 と磁 場 は互 いにΔt/2 ずれた時
刻 に定 義 される。プログラム１に具 体 的 な計 算 手 順 を示 す。またプログラム２には、配 列 の定 義 の方 法 について示 す。

2.3.3.

測定環境
性 能 測 定 には、名 古 屋 大 学 の FX1、東 京 大 学 の FX10 及 び、京 を使 用 した。なお、本 測 定 は

単 一 ノードで行 い、MPI を用 いた並 列 性 能 の測 定 は行 わない。コンパイラオプションは以 下 のとおりである。
FX1（富 士 通 コンパイラ）: -Kfast,impact,OMP
FX10, 京 （富 士 通 コンパイラ）: -Kfast,visimpact,openmp,preex,simd=2

2.3.4.

測定結果
以 下 の４通 りの計 測 を行 った。また計 算 サイズは 512x512x256(～10GB)とした。

①ループを融 合 （プログラム１）、配 列 の定 義 は Type A②ループを分 割 （プログラム３）、配 列 の定 義 は Type A③ループを融 合 （プログラム１）、配 列 の定 義 は Type B④ループを分 割 （プログラム３）、配 列 の定 義 は Type B
ここで「ループを分 割 」とは、プログラム 1 では１つの 3 重 ループで行 っていた Ex,Ey,Ez 及 び
Bx,By,Bz の更 新 を、プログラム３のようにそれぞれ別 の３重 ループに分 割 して行 うことを意 味 する。
また配 列 の定 義 の違 いは、Type A では添 え字 i に対 して連 続 アクセスとなり、Type B ではある座
標 の電 磁 場 （ Ex,Ey,Ez,Bx,By,Bz ）や定 数 成 分 （ sgx,sgy,sgz,epx,epy,epz ）に対 して連 続 アク セ1

ス と な る 。 な お 、 ベ ク ト ル プ ロ セ ッ サ (VPP 等 ) で は Type A が 、 １ ０ 年 前 の ス カ ラ プ ロ セ ッ サ（PrimePower HPC2500 等 ）では Type B が高 速 であった。
なお本 プログラムでは、逐 次 計 測 に対 して、マルチスレッドでの計 測 では実 効 効 率 がかなり低下 する。これは、ループ内 の和 積 等 の浮 動 小 数 点 演 算 数 が少 ないのに対 して、 配 列 へのアクセ
スが非 常 に多 く、メモリバンド幅 ネックになっているためである。
計 測 結 果 を表 1 に示 す。FX1 及 び FX10 においては、①の場 合 が最 も高 速 であった。この理
由 は 以 下 の と お り で あ る 。 ま ず ① の 場 合 で は 、 プ ロ グ ラ ム １ の ４ -6 行 目 に お い て 、 fff(i,j,k,1),fff(i,j,k,5), fff(i,j-1,k,5), fff(i,j,k,6), fff(i,j,k-1,6), eee(i,j,k,1), eee(i,j,k,4)がキャッシュに読 み
込 まれる。また 7-9 行 目 において、fff(i,j,k,2), fff(i,j,k,4), fff(i,j,k-1,4), eee(i,j,k,2), eee(i,j,k,5)
が キ ャ ッ シ ュ に 読 み 込 ま れ る が 、 fff(i,j,k,6) は 既 に 読 み 込 ま れ て い る 。 10-13 行 目 に お い て は 、fff(i,j,k,3), fff(i,j-1,k,4), eee(i,j,k,3), eee(i,j,k,6)がキャッシュに読 み込 まれるが、fff(i,j,k,5)とfff(i,j,k,4) は 既 に 読 み 込 ま れ て い る 。 同 様 に 19-27 行 目 に お い て 、 fff(i,j,k,1), fff(i,j,k,2),fff(i,j,k,3)は既 にキャッシュに読 み込 まれたデータの再 利 用 が行 われる。 一 方 ループを分 割 する②の場 合 は、キャッシュデータの再 利 用 は行 われないため、読 み込 みが増 える。
③の場 合 では、プログラム１の４ -6 行 目 において、 fff(1,i,j,k) ～fff(4,i+2,j,k), fff(1,i,j-1,k)～fff(4,i+2,j-1,k), fff(1,i,j,k-1)～fff(4,i+2,j,k-1), eee(1,i,j,k)～eee(4,i+2,j,k)がキャッシュに読 み
込 まれる。7-9 行 目 と 10-13 行 目 においては、既 にキャッシュ読 み込 まれているデータを使 用 する
ため、Type A に比 べて読 み込 みが格 段 に減 っているのが分 かる。しかし、読 み込 まれたデータのうち fff(5,i,j-1,k)や fff(6,i,j,k-1)は使 用 されないため、キャッシュ効 率 が落 ちる。同 様 に、19-27
行 目 においても、キャッシュに読 み込 まれたデータのうち fff(2,i,j-1,k)や fff(3,i,j,k-1)は使 用 されないため、キャッシュ効 率 が落 ちる。 ループを分 割 する④の場 合 は、さらに使 用 されないデータが増 えるため、キャッシュ効 率 はさらに落 ちる。
従 って本 プログラムの場 合 、ループを融 合 し、かつ電 磁 場 データ（ Ex,Ey,Ez,Bx,By,Bz）に対 しては Type A の配 列 の定 義 を採 用 し、定 数 成 分 データ（sgx,sgy,sgz,epx,epy,epz 等 ）に対 してはType B の配 列 の定 義 を採 用 したほうが高 効 率 となる。

2.3.5.

まとめ
今 回 の計 測 で得 られた知 見 は、以 下 のとおりである。

A. 一 般 的 には Type B の配 列 の定 義 を使 用 したほうがメモリアクセスは減 るが、キャッシュへ読 み
込 まれたデータの中 で利 用 されないものがある場 合 には、Type A を採 用 したほうが良 い。
B. ループ内 の演 算 における キャッシュデータの 再 利 用 率 が高 い場 合 は 、ループを融 合 したほうが良 い。
C. シングルスレッドにおける実 効 効 率 に対 して、マルチスレッドにおける実 効 効 率 がかなり低 下 する場 合 は、プログラムがメモリバンド幅 ネックになっている可 能 性 が高 い。この場 合 、 計 算 精 度を上 げたりしてループ内 の演 算 を増 やした場 合 でも 、浮 動 小 数 点 演 算 の実 効 効 率 自 体 が上がり経 過 時 間 はそれほど変 わらない可 能 性 がある。
D. ストリーム数 を減 らすために、できるだけ配 列 を融 合 したほうがよい。また、 Type A は、配 列 のパディング（一 次 元 目 に+16 等 をする）が必 要 。

2

表１：FDTD3D の性能。
格子点数 512x512x512、時間ステップ 10 での結果。

FX1－4 スレッド

京－8 スレッド

FX10－16 スレッド

①ループ融 合 ＋Type A

45.82 sec

30.32 sec

35.45 sec

②ループ分 割 ＋Type A

58.12 sec

33.42 sec

42.53 sec

③ループ融 合 ＋Type A

58.60 sec

37.65 sec

46.72 sec

④ループ分 割 ＋Type A

166.50 sec

107.48 sec

151.42 sec

プログラム

プログラム１：計算部分（ループ融合）!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
1
2
3

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ex[HFF] ---4

ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk) &5+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk) &6-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk))!---- Ey[FHF] ---7

ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk) &8+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk) &9-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk))!---- Ez[FFH] ---10ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk) &11+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk) &12-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk))

13
14
15

end doend doend do!$OMP END DO!$OMP END PARALLEL!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
16
17
18

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hx[FHH] ---19

hx(ii,jj,kk)=hx(ii,jj ,kk )

&
3

20

-((ez(ii,jj+1,kk )-ez(ii,jj,kk))*mux(ii,jj,kk) &21-(ey(ii,jj ,kk+1)-ey(ii,jj,kk))*mux(ii,jj,kk))!---- Hy[HFH] ---22

hy(ii,jj,kk)=hy(ii ,jj,kk )&23-((ex(ii ,jj,kk+1)-ex(ii,jj,kk))*muy(ii,jj,kk) &24-(ez(ii+1,jj,kk )-ez(ii,jj,kk))*muy(ii,jj,kk))!---- Hz[HHF] ---25hz(ii,jj,kk)=hz(ii ,jj ,kk)&

26-((ey(ii+1,jj ,kk)-ey(ii,jj,kk))*muz(ii,jj,kk) &27-(ex(ii ,jj+1,kk)-ex(ii,jj,kk))*muz(ii,jj,kk))

28
29
30

end doend doend do!$OMP END DO!$OMP END PARALLEL

プログラム 2：配列の定義!------ Type A ------#define ex(i,j,k) fff(i,j,k,1)#define ey(i,j,k) fff(i,j,k,2)#define ez(i,j,k) fff(i,j,k,3)#define hx(i,j,k) fff(i,j,k,4)#define hy(i,j,k) fff(i,j,k,5)#define hz(i,j,k) fff(i,j,k,6)#define sgx(i,j,k) eee(i,j,k,1)#define sgy(i,j,k) eee(i,j,k,2)#define sgz(i,j,k) eee(i,j,k,3)#define epx(i,j,k) eee(i,j,k,4)#define epy(i,j,k) eee(i,j,k,5)#define epz(i,j,k) eee(i,j,k,6)#define mux(i,j,k) bbb(i,j,k,1)#define muy(i,j,k) bbb(i,j,k,2)#define muz(i,j,k) bbb(i,j,k,3)!---------------------!------- Type B ------#define ex(i,j,k) fff(1,i,j,k)#define ey(i,j,k) fff(2,i,j,k)#define ez(i,j,k) fff(3,i,j,k)#define hx(i,j,k) fff(4,i,j,k)4

#define hy(i,j,k) fff(5,i,j,k)#define hz(i,j,k) fff(6,i,j,k)#define sgx(i,j,k) eee(1,i,j,k)#define sgy(i,j,k) eee(2,i,j,k)#define sgz(i,j,k) eee(3,i,j,k)#define epx(i,j,k) eee(4,i,j,k)#define epy(i,j,k) eee(5,i,j,k)#define epz(i,j,k) eee(6,i,j,k)#define mux(i,j,k) bbb(1,i,j,k)#define muy(i,j,k) bbb(2,i,j,k)#define muz(i,j,k) bbb(3,i,j,k)!-----------------------

プログラム３：計算部分（ループ分割）!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
1
2
3

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ex[HFF] ---4

ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk) &5+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk) &6-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk))

7
8
9

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
10
11
12

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ey[FHF] ---13ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk) &14+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk) &15-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk))

16
17
18

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
5

19
20
21

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ez[FFH] ---22ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk) &23+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk) &24-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk))

25
26
27

end doend doend do!$OMP END DO!$OMP END PARALLEL!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
28
29
30

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hx[FHH] ---31

hx(ii,jj,kk)=hx(ii,jj ,kk )&32-((ez(ii,jj+1,kk )-ez(ii,jj,kk))*mux(ii,jj,kk) &33-(ey(ii,jj ,kk+1)-ey(ii,jj,kk))*mux(ii,jj,kk))

34
35
36

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
37
38
39

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hy[HFH] ---40

hy(ii,jj,kk)=hy(ii ,jj,kk )&41-((ex(ii ,jj,kk+1)-ex(ii,jj,kk))*muy(ii,jj,kk) &42-(ez(ii+1,jj,kk )-ez(ii,jj,kk))*muy(ii,jj,kk))

43
44
45

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
46

do kk=nzsm1,nze
6

47
48

do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hz[HHF] ---49hz(ii,jj,kk)=hz(ii ,jj ,kk)&

50-((ey(ii+1,jj ,kk)-ey(ii,jj,kk))*muz(ii,jj,kk) &51-(ex(ii ,jj+1,kk)-ex(ii,jj,kk))*muz(ii,jj,kk))

52
53
54

end doend doend do!$OMP END DO!$OMP END PARALLEL

7

FDTD3D 配列の定義
 TypeAとTypeBの配列は以下のように定義されている
配列マージ

Type

最内
○

A
B

アクセス
最外
○
-

連続
○
○

ストライド
○

TypeBallocate(fff(6,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define ex(i,j,k) fff(1,i,j,k)#define ey(i,j,k) fff(2,i,j,k)
ストライドアクセス#define ez(i,j,k) fff(3,i,j,k)(一部は連続アクセス)#define hx(i,j,k) fff(4,i,j,k)
配列マージ#define hy(i,j,k) fff(5,i,j,k)#define hz(i,j,k) fff(6,i,j,k)
allocate(eee(6,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define sgx(i,j,k) eee(1,i,j,k)#define sgy(i,j,k) eee(2,i,j,k)#define sgz(i,j,k) eee(3,i,j,k)#define epx(i,j,k) eee(4,i,j,k)#define epy(i,j,k) eee(5,i,j,k)#define epz(i,j,k) eee(6,i,j,k)
allocate(mmm(3,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define mux(i,j,k) mmm(1,i,j,k)#define muy(i,j,k) mmm(2,i,j,k)#define muz(i,j,k) mmm(3,i,j,k)

TypeA
allocate(fff(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,6))#define ex(i,j,k) fff(i,j,k,1)#define ey(i,j,k) fff(i,j,k,2)
連続アクセス#define ez(i,j,k) fff(i,j,k,3)
配列マージ#define hx(i,j,k) fff(i,j,k,4)#define hy(i,j,k) fff(i,j,k,5)#define hz(i,j,k) fff(i,j,k,6)
allocate(eee(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,6))#define sgx(i,j,k) eee(i,j,k,1)#define sgy(i,j,k) eee(i,j,k,2)#define sgz(i,j,k) eee(i,j,k,3)#define epx(i,j,k) eee(i,j,k,4)#define epy(i,j,k) eee(i,j,k,5)#define epz(i,j,k) eee(i,j,k,6)
allocate(mmm(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,3))#define mux(i,j,k) mmm(i,j,k,1)#define muy(i,j,k) mmm(i,j,k,2)#define muz(i,j,k) mmm(i,j,k,3)●配列のパディング
配列の1次元目に適宜パディングすることにより、16KB境
界からずらす。
●配列マージ
３つの配列を1つの配列にマージすることにより、ストリー
ム数が減るため、L1Dキャッシュスラッシングが回避され、さらなる高速化の可能性あり。

Copyright 2013 FUJITSU LIMITEDFDTD3D TypeA,TypeBの配列アクセス（L1$）
 Type-A

連続アクセスfff(1,1,1,1) fff(2,1,1,1) fff(3,1,1,1) fff(4,1,1,1) fff(5,1,1,1) fff(6,1,1,1) fff(7,1,1,1) fff(8,1,1,1) fff(9,1,1,1) fff(10,1,1,1) fff(11,1,1,1) fff(12,1,1,1) fff(13,1,1,1) fff(14,1,1,1) fff(15,1,1,1) fff(16,1,1,1)
ex(1,1,1)
missex(2,1,1)
hit

ex(3,1,1)
hit

ex(4,1,1)
hit

ex(5,1,1)
hit

ex(6,1,1)
hit

ex(7,1,1)
hit

ex(8,1,1)
hit

ex(9,1,1) ex(10,1,1) ex(11,1,1) ex(12,1,1) ex(13,1,1) ex(14,1,1) ex(15,1,1) ex(16,1,1)
hit
hit
hit
hit
hit
hit
hit
hit

 Type-B (配列( ii , jj , kk )の場合)

連続アクセスfff(1,1,1,1) fff(2,1,1,1) fff(3,1,1,1) fff(4,1,1,1) fff(5,1,1,1) fff(6,1,1,1) fff(1,2,1,1) fff(2,2,1,1) fff(3,2,1,1) fff(4,2,1,1) fff(5,2,1,1) fff(6,2,1,1) fff(1,3,1,1) fff(2,3,1,1) fff(3,3,1,1) fff(4,3,1,1)
ex(1,1,1) ey(1,1,1) ez(1,1,1) hx(1,1,1) hy(1,1,1) hz(1,1,1) ex(2,1,1) ey(2,1,1) ez(2,1,1) hx(2,1,1) hy(2,1,1) hz(2,1,1) ex(3,1,1) ey(3,1,1) ez(3,1,1) hx(3,1,1)
miss
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
ループ内で使用する配列が以下の場合。
(○：使用する、×：使用しない)

ex
ey
ez
hx
hy

 Type-B (配列( ii , jj , kk-1 )の場合)
ストライドアクセスhz(ii,jj,kk-1)
×
×
×
○
○
×

fff(4,3,2,1) fff(5,3,2,1) fff(6,3,2,1) fff(1,4,2,1) fff(2,4,2,1) fff(3,4,2,1) fff(4,4,2,1) fff(5,4,2,1) fff(6,4,2,1) fff(1,5,2,1) fff(2,5,2,1) fff(3,5,2,1) fff(4,5,2,1) fff(5,5,2,1) fff(6,5,2,1) fff(1,6,2,1)hx(3,2,1) hy(3,2,1) hz(3,2,1) ex(4,2,1) ey(4,2,1) ez(4,2,1) hx(4,2,1) hy(4,2,1) hz(4,2,1) ex(5,2,1) ey(5,2,1) ez(5,2,1) hx(5,2,1) hy(5,2,1) hz(5,2,1) ex(6,2,1)
miss
hit
hit
hit
hit
hit
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない

メリット

デメリット

最外次元をマージしたTypeA

・ロード・ストアのSIMD化ができる

・配列のパディングが必要

最内次元をマージしたTypeB・ストリーム数が減ることでキャッシュス
ラッシングのリスクが減る。(配列のパディングが不要)

・列の次元に+-があるときに配列のマージを行うと、一部ストライドアクセスになる。
・ロード・ストアのSIMD化ができない
Copyright 2013 FUJITSU LIMITEDFDTD3D ループ分割の再利用性
 電場のソースプログラム
ループ融合!---- Ex[HFF] ---do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1
ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk)&+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk)*dty &-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk)*dtz) &+ajx(ii,jj,kk)*dt;!---- Ey[FHF] ---ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk)&+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk)*dtz &-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk)*dtx) &+ajy(ii,jj,kk)*dt;!---- Ez[FFH] ---ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk)&+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk)*dtx &-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk)*dty) &+ajz(ii,jj,kk)*dt;
end do
同一ループ内にあるend dohz(ii,jj,kk) hy(ii,jj,kk) hx(ii,jj,kk)
end doは、キャッシュ上にあるため再利用可能。

「ループ分割」はL2キャッシュの再利用性を低下さ
せる

ループ分割
!---- Ex[HFF] ---do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1
ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk)&+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk)*dty &ループ1-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk)*dtz) &+ajx(ii,jj,kk)*dt;
end doend doend doループ2では、!---- Ey[FHF] ---ループ1にあるhz(ii,jj,kk) hx(ii,jj,kk)
do kk=nzs,nzep1
は再読み込みとなる。
do jj=nys,nyep1
do ii=nxs,nxep1
ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk)&+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk)*dtz &ループ2-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk)*dtx) &+ajy(ii,jj,kk)*dt;
end doend doループ3では、end do
ループ1にあるhy(ii,jj,kk)、!---- Ez[FFH] ---ループ2にあるhx(ii,jj,kk)
do kk=nzs,nzep1
は再読み込みとなる。
do jj=nys,nyep1
do ii=nxs,nxep1
ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk)&+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk)*dtx &ループ3-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk)*dty) &+ajz(ii,jj,kk)*dt;
end doend doend doCopyright 2013 FUJITSU LIMITED