FDPSを使ってみる その1

はじめに

粒子系の並列シミュレーションフレームワーク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に入れた。

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

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

環境設定

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

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

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

//------------------------------------------------------------------------
#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でコンパイルできるはず。

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。

     //==================================\\
     ||                                  ||
     || ::::::: ::::::. ::::::. .::::::. ||
     || ::      ::    : ::    : ::       ||
     || ::::::  ::    : ::::::'  `:::::. ||
     || ::      ::::::' ::      `......' ||
     ||     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による並列実行

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

//------------------------------------------------------------------------
#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になるだろう。

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が必要になる。

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

$ 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へ続く。