粒子系シミュレータ開発フレームワークFDPSと粒子間相互作用カーネルジェネレータPIKGの紹介野村 昴太郎 / Kentaro Nomura
神戸大学理学研究科惑星科学研究センター1

背景• 一般の研究者にとって，現代の多様なスパコン上でスケーラブルに動作するプログラムを書くのは非常に大変/困難• シリアルコードをかけば並列化してくれるフレームワークが必要• 分子動力学やN体，SPHなどの粒子系シミュレータのコードの性能は(多くの場合)粒子間相互作用計算の実装(最適化)に大きく依存• ユーザはそれぞれの計算機向けに最適化された相互作用カーネルを書かないといけないができあがるものは(大抵の場合)再利用できない• 単一のコードからさまざまな計算機上で性能を引き出したい！
2

唐突ですがここで富岳概要
https://news.livedoor.com/article/detail/18423524/

https://www.r-ccs.riken.jp/jp/post-k/overview.html

3

FDPS (Framework for Developing Particle Simulators)•

粒子同士が相互作用しながら時間発展するシミュレーションの開発支援フレームワーク•

FDPSはノード間通信・系の分割・相互作用リスト作成など面倒なことを引き受けてくれる•

ユーザはユーザー定義クラス，時間発展(main関数)と相互作用カーネルを記述•

粗密にあわせて動的に領域を分割(右図)•ツリー構造を使った相互作用リストの作成•

Fortran・Cインターフェース/アクセラレータの利用
ユーザが記述ヘッダーをインクルード
ユーザが記述
main

FDPS
APIs

kernelユーザが記述user deﬁned class

白い点ひとつひとつが星(粒子)，
黒い部分はなにもない空間
粒子の数に応じて空間を分割
Iwasawa+, PASJ(2016)
4

FDPSの計算の流れ
１．領域分割ロードバランスを考慮しながら計算領域をサブ領域に分割して各MPIプロセスに粒子を割り当て

２．粒子情報の交換

並列化
ノード間通信粒子の移動などにあわせてそれぞれのプロセスが持つ粒子の情報を交換

３．相互作用情報の交換相互作用に必要な情報を隣接するプロセスから取得

４．相互作用の計算
各MPIプロセス内で相互作用を計算

５．粒子の時間発展それぞれのプロセスが担当するの相互作用を計算

APIを提供相互作用リストを提供し計算を高速に実行
ユーザーが自由に記述
5

FDPSを用いたコード開発

Ui =NX
j=0(✓

1|rij |

◆12✓

1|rij |

◆6 )それではLennard-Jones流体のサンプルコードを

6

FDPSを用いたコード開発

FDPS
main

APIs

kernel

それではLennard-Jones流体のサンプルコードを user deﬁned class
粒子クラス

初期化

時間発展

相互作用カーネル

7

解説① 3つの主要クラス

FDPS
main

APIs

kerneluser deﬁned class

ヘッダーファイルをインクルード
treeForForceparticleSystem

相互作用計算を担当

粒子の情報を保持・通信

calcForceAllAndWriteBack()
pos
FullParticle
pospos
posvel
pos
pos
vel
vel
vel
vel
force
vel
force
force
forceidforce
force
ididididid

copyFromFP

copy
F

rom

exchangeParticle()domainInfo

Force

EssentialParticle
pos
pos
pos
pos
pos
pos
id
idid
idididツリー構造生成相互作用リスト生成
ユーザ定義相互作用カーネル

計算領域の情報を保持
decomposeDomainAll()

Force force
force
force
force
force
force
force
8

解説② 粒子クラスの定義

FDPS
main

APIs

kerneluser deﬁned class

ここでは，粒子の全情報を持ったFullParticleクラス(FP)を定義• 粒子の座標(r)，速度(v)，力(f)を保持• FDPSのAPIに必要なメンバ関数を定義• 力の計算に必要な力を持ったEssentialPraticleクラス(EPI/EPJ)や相互作用計算の計算結果を保持するForceクラスも設計できる• 本サンプルでは簡単のために全てFPで代用している• (基本的にはEPやForceはFPのサブセット)•9

解説③ 相互作用カーネルの定義

FDPS
main

APIs

kerneluser deﬁned class

引数は決まっている
i粒子のEPのリスト，リスト長
j粒子のEPのリスト，リスト長，力を保持するForceのリスト(ここではEPもForceもFPで代用)

Fi =NX
j=0(48✓

1|rij |

◆1224✓

1|rij |

◆6 )rijを計算|rij |210解説④ main関数(初期条件)

FDPS
main

APIs

kerneluser deﬁned classParticleSimulatorの初期化

立方格子上に1000分子を配置

領域の分割
粒子の交換相互作用計算

11

解説⑤ main関数(時間発展)

FDPS
main

APIs

kerneluser deﬁned class

速度ベルレ法で時間発展
領域の分割，粒子の交換力の計算
速度ベルレ法で時間発展
ParticleSimulatorの終了処理

70行程度でMPI/OpenMPハイブリッド並列のMDコードが完成！
(あと出力いれるとか最適化が必要ですが…)
ますは https://github.com/FDPS/FDPS からダウンロード
12並列化性能• 様々なスパコンで高い並列化効率• 相互作用カーネルの速度が性能に大きく影響• これまではエキスパートたちの手によって素晴らしいカーネルが作られてきたが…
Iwasawa+, PASJ(2016)13

唐突ですがここで富岳概要
https://news.livedoor.com/article/detail/18423524/

https://www.r-ccs.riken.jp/jp/post-k/overview.html

14

PIKG
• (Paricle-particle Interaction Kernel Generatorの略)• 相互作用計算をDSLで簡単に記述• ジェネレータにDSLコードとオプション(アーキテクチャの指定とか)を与えると最適化された粒子間相互作用カー
ネルコードがでてくる• ユーザーは(ほとんど)最適化については考えない• 単一コードから複数アーキテクチャの最適化コードを生成
15

使い方• ユーザは相互作用を及ぼされる粒子(EPI)と及ぼす粒子(EPJ)とEPIにかかる相互作用(FORCE)の変数を定義• 定義した関数などを用いて2粒子間相互作用の計算を記述• オプション等を設定してジェネレータにかけるとカーネルができる

16

例(N体)
Variable deﬁnition:[class_type] type varname [: member_name]
Function deﬁnition:function name(variables…)[statements…]
return val
end
Kernel deﬁnition:
variable (=|+=|-=) expression

17

生成コード(最適化なし)

18富岳向け最適化
元コード
for(int i=0;i<N;i++){ A(i); B(i);}• ループ分割• 長い(というわけでもないものも)
ループを分割してレジスタへの負荷を減らす• ストリップマイニング• L1$にのるようにループの回転数を分割• ループアンロール• (とても)長い命令レイテンシを隠蔽

for(int i=0;i<N;i++){ A(i);}for(int i=0;i<N;i++){ B(i);}for(int i=0;i<N/n;i++){for(int j=0;j<n;j++) A(n*i+j);for(int j=0;j<n;j++) B(n*i+j);}for(int i=0;i<N/n;i++){for(int j=0;j<n/m;j+=m){A(n*i+j+0); … A(n*i+j+m-1);}
for(int j=0;j<n/m;j+=m){
B(n*i+j+0); … B(n*i+j+m-1);}
19}最適化の効果A64FX 2.0 GHz (1コア, 単精度ピーク128Gﬂops)
コンパイラ: FCC 4.1.0 20200415
オプション: -Kfast -Nclang
条件: 512 x 512のN2ループ
40

Monopole
Quadrupole

35

Performance / Gfops

302520
15
1050

Ref

SVE+LoopFission+LoopUnroll※富岳共用開始後の性能を保証するものではありません 20

まとめ• 粒子系シミュレータ開発フレームワークFDPSの紹介• FDPSのAPIを用いることで並列化(MPI/OpenMP)に関わる部
分を考えずにシミュレータの実装を行える• 使ってみたい方はぜひ初級講習会へ(今のところ8月3週の予定)• 粒子間相互作用計算カーネルジェネレータPIKGの紹介• DSLで粒子間相互作用計算を記述してジェネレータにかけると，オプションによってさまざまなアーキテクチャに最適化されたカーネルが生成される• 現在ARM SVE/AVX-512/AVX2向けの最適化が利用可能• GPU(CUDA)やPEZY-SC2などにも対応する予定
謝辞
本研究は，文部科学省「富岳」成果創出加速プログラム「宇宙の構造形成と進化から惑星表層環境変動までの統一的描像の構築」の一環として実施したものです。
21

その他富岳を使って• 使い勝手としては基本的に京と変わらない(らしい)• できたてのシステムではよくあることでしょうが，実装の過程でコンパイラのバグを何個か踏んだ．対処法はあるが直ってなかったりするのでポータルのレポートやマニュアル(既知の問題とか)はしっかり読みましょう• A64FXの詳細はA64FX̲Microarchitecture̲Manualを参照• (頑張って最適化したい人向け)A64FXの気持ちになるためには理研シミュレータ＋gem5可視化ソフト(Konata)が便利• ロボ太先生(@kaityo256)の記事がわかりやすい• https://qiita.com/kaityo256/items/
00fc50221d86ce3ﬀ2ea
22