FDPSを使ってみる その1

# はじめに

粒子系の並列シミュレーションフレームワーク[FDPS](https://github.com/FDPS/FDPS)を使ってみる。FDPSとはFramework for Developing Particle Simulatorの略。チュートリアルやサンプルコードを見ただけでは、「最低限何を書けば何をしてくれるのか」がわかりにくかったので、実際に使ってみた自分用の覚書。その1と書いたが、どこまで続くかはわからない。

コードはここにおいてある。

https://github.com/kaityo256/fdps_sample

# 環境

* MacOS X
* g++ (brewから入れた。clang++ではなく、GCCのc++)
* OpenMPI (brewから入れた)

# インストール

インストールはとりあえずcloneするだけ。個人的に`~/git`に入れた。

```shell-session
$ mkdir git
$ cd git
$ git clone --depth=1 https://github.com/FDPS/FDPS.git 
```

基本的にhppファイルが見えればよいので、ビルドなどは不要。

# 環境設定

MacでMPI環境を作るのはわりと面倒。特にFDPSはなぜかMPIのC++バインディングを使っているので注意。環境構築については[MacにMPI+OpenMPハイブリッド並列環境を構築する](http://qiita.com/kaityo256/items/ae9329dae24ea8828ae0)に書いたのでそちらを参照。この方法でFDPSが使えるようになるはず。

# コンパイルとシリアル実行

FDPSのミニマルコード、初期化と終了処理のみのコードは以下のようになる。

```cpp:test.cpp
//------------------------------------------------------------------------
#include <stdio.h>
#include <particle_simulator.hpp>
int
main(int argc, char **argv) {
  PS::Initialize(argc, argv);
  PS::Finalize();
}
//------------------------------------------------------------------------
```

コンパイルは、FDPSの`particle_simulator.hpp`が見えれば良い。`~/git`以下にいれたなら、こんなmakefileでコンパイルできるはず。

```mf
all: a.out

CC=g++

FDPS_PATH=$(HOME)/git/FDPS/src
CPPFLAGS=-I$(FDPS_PATH)

a.out: test.cpp
	$(CC) $(CPPFLAGS) $(LDFLAGS) $< -o $@

clean:
	rm -f a.out
```

実行して、以下のような表示がされればOK。

```shell-session
     //==================================\\
     ||                                  ||
     || ::::::: ::::::. ::::::. .::::::. ||
     || ::      ::    : ::    : ::       ||
     || ::::::  ::    : ::::::'  `:::::. ||
     || ::      ::::::' ::      `......' ||
     ||     Framework for Developing     ||
     ||        Particle Simulator        ||
     ||     Version 2.0 (2016/06)        ||
     \\==================================//

       Home   : https://github.com/fdps/fdps 
       E-mail : fdps-support@mail.jmlab.jp
       Licence: MIT (see, https://github.com/FDPS/FDPS/blob/master/LICENSE)
       Note   : Please cite Iwasawa et al. (in press.)

       Copyright (C) 2015 
         Masaki Iwasawa, Ataru Tanikawa, Natsuki Hosono,
         Keigo Nitadori, Takayuki Muranushi, Daisuke Namekata
         Junichiro Makino and many others
******** FDPS has successfully begun. ********
******** FDPS has successfully finished. ********
```

# MPIによる並列実行

並列実行ができているかどうかのサンプル。

```cpp:test.cpp
//------------------------------------------------------------------------
#include <stdio.h>
#include <particle_simulator.hpp>
int
main(int argc, char **argv) {
  PS::Initialize(argc, argv);
  PS::Comm::barrier();
  printf("%d/%d\n", PS::Comm::getRank(), PS::Comm::getNumberOfProc());
  PS::Finalize();
}
//------------------------------------------------------------------------
```

`PS::Comm`というMPIのラッパーがある。例えば`PS::Comm::getRank()`が、`MPI_Comm_rank`に対応する。
バリアは単に表示が乱れるのを防ぐために入れてある。

並列実行をするには、コンパイル時に`DPARTICLE_SIMULATOR_MPI_PARALLEL`マクロを有効にする。こんなmakefileになるだろう。

```mf
all: a.out

CC=g++

FDPS_PATH=$(HOME)/git/FDPS/src
CPPFLAGS=-I$(FDPS_PATH)
CPPFLAGS += -DPARTICLE_SIMULATOR_MPI_PARALLEL
LDFLAGS=-lmpi -lmpi_cxx

a.out: test.cpp
  $(CC) $(CPPFLAGS) $(LDFLAGS) $< -o $@

clean:
  rm -f a.out
```

前述の通り、FDPSはMPIのC++ bindingsを使っているため、OpenMPIなら `-lmpi_cxx`が必要になる。

ビルドして実行してみる。

```shell-session
$ make
$ mpirun -np 4 ./a.out 

     //==================================\\
     ||                                  ||
     || ::::::: ::::::. ::::::. .::::::. ||
     || ::      ::    : ::    : ::       ||
     || ::::::  ::    : ::::::'  `:::::. ||
     || ::      ::::::' ::      `......' ||
     ||     Framework for Developing     ||
     ||        Particle Simulator        ||
     ||     Version 2.0 (2016/01)        ||
     \\==================================//

       Home   : https://github.com/fdps/fdps 
       E-mail : fdps-support@mail.jmlab.jp
       Licence: MIT (see, https://github.com/FDPS/FDPS/blob/master/LICENSE)
       Note   : Please cite Iwasawa et al. (in prep.)

       Copyright (C) 2015 
         Masaki Iwasawa, Ataru Tanikawa, Natsuki Hosono,
         Keigo Nitadori, Takayuki Muranushi, Junichiro Makino
         and many others
******** FDPS has successfully begun. ********
0/4
3/4
2/4
1/4
******** FDPS has successfully finished. ********
```

できたっぽい。

# まとめ

まずはFDPSを使ったコードをコンパイルし、並列実行するまでやってみた。FDPSはテンプレートを利用しており、FDPSフレームワークを利用するのにビルドは不要で、必要なヘッダをインクルードするだけ使える。

[その2](http://qiita.com/kaityo256/items/8da0ac002a6d8d0fc62d)へ続く。