FDPS 講習会の手引
谷川衝、岩澤全規、細野七月、似鳥啓吾、村主崇行、野村昴太郎、坪内美幸、牧野淳一郎

2023 年 9 月 7 日

目次
12

準備
1.1 自分で用意した計算機で実行する場合. . . . . . . . . . . . . . . . . . . . .

22

実習本番
2.1 重力 N 体シミュレーションコード . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 シリアルコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2.1 ディレクトリ移動 . . . . . . . . . . . . . . . . . . . . . . .
2.1.2.2 make の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2.3 計算の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2.4 結果の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.3 Phantom-GRAPE の利用 . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.4 PIKG の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.5 OpenMP/MPI の利用 . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 SPH シミュレーションコード . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 シリアルコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2.1 ディレクトリ移動 . . . . . . . . . . . . . . . . . . . . . . .
2.2.2.2 make の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2.3 計算の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2.4 結果の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.3 OpenMP/MPI の利用 . . . . . . . . . . . . . . . . . . . . . . . . . .

22333334456777778881

1

準備

1.1

自分で用意した計算機で実行する場合

https://github.com/FDPS/FDPS から FDPS の最新版をダウンロードし、好きなディレクトリ下で解凍する。これによってディレクトリ FDPS-master が出来る。
以下の方法のいずれかで FDPS の最新バージョンを取得できる。
 ブラウザから

1. ウェブサイト https://github.com/FDPS/FDPS で”Download ZIP”をクリックし、ファイル FDPS-master.zip をダウンロード
2. FDPS を展開したいディレクトリに移動し、圧縮ファイルを展開
 コマンドラインから以下のコマンドを実行するとカレントディレクトリにディレクトリ FDPS ができ、その下を Git のレポジトリとして使用できる$ git clone git://github.com/FDPS/FDPS.git


以下では、ウェブサイトからダウンロードした場合を想定し、ディレクトリ FDPS-masterがあるディレクトリの名前を fdps とする。

2

実習本番

実習で行うことは、FDPS を使って実装された重力 N 体シミュレーションコードと SPHシミュレーションコードを使用することである。最初に重力 N 体シミュレーションコード、次に SPH シミュレーションコードを使用する。
なお、実習の際に Makefile を更新し、コンパイルし直すという作業を何回か行うが、ここで注意しなくてはならないのは、Makefile を編集しただけでは実行ファイルの再作成は行われないということである。この場合、きちんと前回作った実行ファイルを明示的に “$rm ./nbody.out” などで消す必要がある。これを忘れた場合、「make: ‘nbody.out’ は更新済みです」と出る。

2.1

重力 N 体シミュレーションコード

ここでは、重力 N 体シミュレーションコードでの cold collapse を、並列環境無し、OpenMPを用いた並列計算環境、OpenMP + MPI を用いた並列計算環境の 3 つで行う。MPI は、環境があれば行う。

22.1.1

概要

ここでは、用意された重力 N 体シミュレーションコードを動かしてみよう。このコードは、重力多体系のコールドコラプスを計算する。この節でまず行うことは、シリアルコードのコンパイルと実行、出て来た結果の解析である。次にシリアルコードを Phantom-GRAPEや PIKG を用いて高速化して、その速さを体験しよう。最後に OpenMP や MPI を利用して、さらにコードを高速化する。

2.1.2

シリアルコード

以下の手順で本コードを使用できる。

 ディレクトリ fdps/FDPS-master/sample/c++/nbody に移動 make を実行 ジョブの投入
 結果の解析 OpenMP/MPI の利用 (オプション)

2.1.2.1

ディレクトリ移動

ディレクトリ fdps/FDPS-master/sample/c++/nbody に移動する。

$ cd fdps/FDPS-master/sample/c++/nbody


2.1.2.2

make の実行

make コマンドを実行する。

$ make2.1.2.3



計算の実行

まずは、インタラクティブ実行で計算を実行する。これは、生成された実行ファイルの名前をそのまま実行すればよい。
$ ./nbody.out

正しくジョブが終了すると、標準入出力の最後には以下のようなログが出力されるはずである。energy error は絶対値で 1 × 10−3 のオーダーに収まっていればよい。

3





time: 9.5000000 energy error: -3.804653e-03
time: 9.6250000 energy error: -3.971175e-03
time: 9.7500000 energy error: -3.822343e-03
time: 9.8750000 energy error: -3.884310e-03******** FDPS has successfully finished. ********


ただし、後述する Phantom-GRAPE や PIKG を用いた場合、energy error 数値は変わるので注意する。

2.1.2.4

結果の解析

ディレクトリ result に粒子分布を出力したファイル”000*.dat”ができている。*は 0 から9 の値で、時刻を表す。出力ファイルフォーマットは 1 列目から順に粒子の ID, 粒子の質量、位置の x, y, z 座標、粒子の x, y, z 軸方向の速度である。
ここで実行したのは、粒子数 1024 個からなる一様球 (半径 3) のコールドコラプスである。
コマンドライン上で以下のコマンドを実行すれば、時刻 9 における xy 平面に射影した粒子分布を見ることができる。
$ gnuplot$ plot "result/0009.dat" using 3:4


他の時刻の粒子分布をプロットすると、一様球が次第に収縮し、その後もう一度膨張する様子を見ることができる (図 1 参照)。

2.1.3

Phantom-GRAPE の利用

以下では、相互作用計算に Phantom-GRAPE を使う場合について、記述する。この場合、ユーザーはまずは Phantom-GRAPE のコンパイルを行わなければならない。今回使う
Phantom-GRAPE のソースコードは、fdps/FDPS-master/src/phantom grape x86/G5/newton/libpg5/以下に存在するので、そこまで移動し、コンパイルを行う。以下は、現在 sample/c++/nbody/に居る場合の例である。
$ cd ../../../src/phantom_grape_x86/G5/newton/libpg5/$ makeコンパイルが成功したら、元のディレクトリに戻る。次に、Makefile の修正を行う。Makefileの 13 行目に Phantom-GRAPE を使用するか否かを決定しているスイッチが存在している。
このスイッチはデフォルトではコメントアウトされて no になっているため、以下のようにしてコメントアウトを解除する。


use_phantom_grape_x86 = yes

45time=0time=3time=6time=9y0-55y0-5-50x5x

図 1:
無事にコンパイルが通れば、以降の実行・解析の手順は同様である。実行直後に次のような表示がされれば、正しく実行ができている。
******** FDPS has successfully begun. ********./result/t-de.dat
Number of processes: 1
Number of threads per process: 1
rsqrt: MSE = 1.158186e-04, Bias = 8.375360e-08(以下省略)

2.1.4

PIKG の利用

以下では、相互作用計算に PIKG を使う場合について、記述する。この Makefile の修正を行う。Makefile の 14 行目に PIKG を使用するか否かを決定しているスイッチが存在している。このスイッチはデフォルトではコメントアウトされて no になっているため、以下のようにしてコメントアウトを解除する。


use_pikg_x86 = yes

デフォルトでは，PIKG は通常の C++コードを生成するようになっている．55・56 行目

5

のコメントアウトを外すことにより，AVX2 向けに最適化されたコードが生成されるのでコンパイルし直して (make -B など) 実行すると速度が変わる．
無事にコンパイルが通れば、以降の実行・解析の手順は同様である。

2.1.5

OpenMP/MPI の利用

OpenMP や MPI を利用する場合について以下に記述する。
 OpenMP のみ使用の場合– Makefile の編集* マクロ CC に OpenMP 対応の C++コンパイラを代入する。今回の実習の環境
では変更する必要は無い。
* “CFLAGS += -DPARTICLE SIMULATOR THREAD PARALLEL -fopenmp” の行のコ
メントアウトを外す– make コマンドを実行する。
– 実行方法はシリアルコードの場合と同じである。
******** FDPS has successfully begun. ********./result/t-de.dat
Number of processes: 1
Number of threads per process: 4rsqrt: MSE = 1.158186e-04, Bias = 8.375360e-08(以下省略)



見て分かる通り、Number of threads per process: 4 となっている。これで、4 スレッドでの並列計算が行われている事が確認できた。

 OpenMP と MPI の同時使用の場合– Makefile の編集* マクロ CC に MPI 対応の C++コンパイラを代入する。今回の実習の環境ではmpic++にする。
* “CFLAGS += -DPARTICLE SIMULATOR THREAD PARALLEL -fopenmp” の行のコ
メントアウトを外す (インテルコンパイラの場合は-fopenmp を外す)
* “CFLAGS += -DPARTICLE SIMULATOR MPI PARALLEL” の行のコメントアウトを外す– make コマンドを実行する。
– システムの MPI 環境の方法で実行する。(例えば、 mpirun -np 4 nbody.out) 正
しく実行された場合、以下のように表示されるはずである。
6





(省略)
******** FDPS has successfully begun. ********./result/t-de.dat./result/t-de.dat
Number of processes: 2
Number of threads per process: 4
rsqrt: MSE = 1.158186e-04, Bias = 8.375360e-08
rsqrt: MSE = 1.158186e-04, Bias = 8.375360e-08(以下省略)

見て分かる通り、Number of processes: 2 となっている。これで、2 プロセス4 スレッドでの並列計算が行われている事が確認できた。

2.2

SPH シミュレーションコード

2.2.1

概要

ここでは、SPH シミュレーションコードを動かす。用意されているコードは、断熱スフィアコラプスの計算を行う。この節でまず行うことは、シリアルコードのコンパイルと実行、出て来た結果の解析である。最後に OpenMP や MPI を利用して、さらにコードを高速化する。

2.2.2

シリアルコード

以下の手順で本コードを使用できる。

 ディレクトリ fdps/FDPS-master/sample/c++/nbodysph に移動
 make を実行 ジョブの投入
 結果の解析 OpenMP/MPI の利用 (オプション)

2.2.2.1

ディレクトリ移動

ディレクトリ fdps/FDPS-master/sample/c++/nbodysph に移動する。

2.2.2.2

make の実行

make コマンドを実行する。
7

2.2.2.3

計算の実行

まずは、インタラクティブ実行で計算を実行する。これは、生成された実行ファイルの名前をそのまま実行すればよい。
$ ./sph.out

正しくジョブが終了すると、標準入出力の最後には以下のようなログが出力されるはずである。
(省略)//================================
time = 7.6861124696015781e-01, dt = 3.5727841270539857e-03
step = 88//================================
9.9999999999997635e-01
6.6872858041836647e-01
9.7700092080239072e-04
9.7700092080317243e-04
9.7700092080318761e-04******** FDPS has successfully finished. ********


2.2.2.4



結果の解析

ディレクトリ result にファイルが出力されている。ファイル名は”00**.dat”(* には数字が入る) となっている。ファイル名は時刻を表す。出力ファイルフォーマットは 1 列目から順に粒子の ID、粒子の質量、位置の x, y, z 座標、粒子の x, y, z 軸方向の速度、密度、内部エネルギー、圧力である。
これは３次元の Evrard sphere である。以下のコマンドを実行すれば、横軸に r、縦軸に密度の logscale での図が作成される。
$ gnuplot$ set logscale$ plot "result/0040.dat" using (sqrt($3**2 + $4**2 + $5**2)):9

正しい答が得られれば、図 2 のような図を描ける。

2.2.3

OpenMP/MPI の利用

OpenMP や MPI を利用する場合を以下に示す。
 OpenMP のみ使用の場合

8

図 2:

– Makefile の編集* マクロ CC に OpenMP 対応の C++コンパイラを代入する* “CFLAGS += -DPARTICLE SIMULATOR THREAD PARALLEL -fopenmp” の行のコ
メントアウトを外す– make コマンドを実行する。
– シリアルコードと同じように実行する。正しく実行された場合、以下のように表示されるはずである。
******** FDPS has successfully begun. ********//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::’ ‘:::::. |||| ::::::::’ ::‘......’ ||||
Framework for Developing||||
Particle Simulator||\\==================================////=====================================
This is a sample program of Smoothed Particle Hydrodynamics on FDPS!
# of proc is1# of thread is 4//=====================================



9 OpenMP と MPI の同時使用の場合– Makefile の編集* マクロ CC に MPI 対応の C++コンパイラを代入する* “CFLAGS += -DPARTICLE SIMULATOR THREAD PARALLEL -fopenmp” の行のコ
メントアウトを外す (インテルコンパイラの場合は-fopenmp を外す)
* “CFLAGS += -DPARTICLE SIMULATOR MPI PARALLEL” の行のコメントアウトを外す– make コマンドを実行する。
– システムの MPI 環境の使い方に従って実行する。正しく実行された場合、以下のように表示されるはずである。
******** FDPS has successfully begun. ********//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::’ ‘:::::. |||| ::::::::’ ::‘......’ ||||
Framework for Developing||||Particle Simulator||\\==================================////=====================================
This is a sample program of Smoothed Particle Hydrodynamics on FDPS!
# of proc is2# of thread is 4//=====================================

10