はじめに
粒子系の並列シミュレーションフレームワークFDPSを使ってみる。FDPSとはFramework for Developing Particle Simulatorの略。チュートリアルやサンプルコードを見ただけでは、「最低限何を書けば何をしてくれるのか」がわかりにくかったので、実際に使ってみた自分用の覚書。その1と書いたが、どこまで続くかはわからない。
コードはここにおいてある。
環境
- 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へ続く。