More Related Content
Similar to ALPSチュートリアル(7) アプリケーションのALPS化
Similar to ALPSチュートリアル(7) アプリケーションのALPS化 (19)
More from Computational Materials Science Initiative
More from Computational Materials Science Initiative (20)
ALPSチュートリアル(7) アプリケーションのALPS化
- 1. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS チュートリアル{ アプリケーションの
ALPS 化
CMSI ハンズオン
ALPS Collaboration
http://alps.comp-phys.org/
2014-10-16
1 / 35
- 3. ALPS チュートリアル{ アプリケーションのALPS 化
ALPSize (ALPS 化) のすすめ
ALPS ライブラリを使用する利点
エラーバーと自己相関時間の自動計算(ALPS/alea)
自動並列化& ロードバランシング(ALPS/scheduler)
チェックポイント作成とリスタート機能(ALPS/scheduler)
XML 形式による計算結果の自動出力とこれらを扱うコマンド
ラインツール
入力パラメータの柔軟な扱い(ALPS/parameter)
擬似乱数生成器(ALPS/random)
格子の容易な取扱い(ALPS/lattice)
量子ハミルトニアンの容易な取扱い(ALPS/model)
3 / 35
- 4. ALPS チュートリアル{ アプリケーションのALPS 化
ALPSize (ALPS 化) のすすめ
ALPS ビルド環境を使用する利点
コンパイラ& 最適化オプションの自動設定
MPI & OpenMP 用オプションの自動設定
ライブラリ(Boost, BLAS/LAPACK, HDF5, FFTW, SQLite,
Python 等) の自動検出
ALPS ライブラリを利用するためのオプションの自動設定
テスト用スクリプト
京、FX10、その他代表的なスパコン用のビルド環境が整備さ
れている
Windows 用のバイナリ作成が可能
4 / 35
- 5. ALPS チュートリアル{ アプリケーションのALPS 化
ALPSize (ALPS 化) のすすめ
ALPSize 実習
00-01 ALPS ビルド環境の利用(Make, CMake)
02-05 C++プログラミング
06-08 ALPS ライブラリの利用
09 ALPS スケジューラの利用
5 / 35
- 6. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
ビルド環境のセットアップ
環境変数の設定
ALPS HOME: ALPS がインストールされているディレクトリ
(例: /opt/nano/alps/alps-20131104-r7230)
PATH: ツール(parameter2xml) のパスを追加
LD LIBRARY PATH: ALPS ライブラリのパスを設定
PYTHONPATH: ALPS Python モジュールのパスを追加
ALPS がプレインストールされている環境では、上記の設定を
行うシェルスクリプトが用意されている. 例)
$ source /opt/nano/alps/alpsvars.sh
6 / 35
- 9. le の例
include $(ALPS_HOME)/share/alps/include.mk
hello: hello.C
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o hello
hello.C $(LIBS)
実習
$ cp -r $ALPS_HOME/tutorials/alpsize-00-make $HOME
$ cd $HOME/alpsize-00-make
$ make
CMake の利用を推奨
7 / 35
- 11. le を生成
高速な並列ビルド
テスト環境
ビルドルール, ライブラリ, 依存関係などはCMakeLists.txt に
記述する
CMake のインストールについては, http://todo.issp.
u-tokyo.ac.jp/ja/search?SearchableText=cmake
8 / 35
- 12. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
01 CMake 化
簡単なプログラムをCMake を利用してビルドする
$ mkdir $HOME/alpsize-01-cmake
$ cd $HOME/alpsize-01-cmake
$ cmake $ALPS_HOME/tutorials/alpsize-01-cmake
$ make
$ ctest
$ ./hello
CMake ではソースディレクトリ($ALPS
HOME/tutorials/alpsize-01-cmake) とビルドディレクトリ
($HOME/alpsize-01-cmake) は別にする
9 / 35
- 13. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
CMakeLists.txt の例
$ALPS HOME/tutorials/alpsize-01-cmake/CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(hello NONE)
# find ALPS Library
find_package(ALPS REQUIRED PATHS ${ALPS_ROOT_DIR} $ENV{ALPS_HOME}
NO_SYSTEM_ENVIRONMENT_PATH)
message(STATUS "Found ALPS: ${ALPS_ROOT_DIR} (revision: ${ALPS_VERSION})")
include(${ALPS_USE_FILE})
# enable C and C++ compilers
enable_language(C CXX)
# rule for generating 'hello world' program
add_executable(hello hello.C)
target_link_libraries(hello ${ALPS_LIBRARIES})
add_alps_test(hello)
10 / 35
- 14. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
CMakeLists.txt の例
$ALPS HOME/tutorials/alpsize-01-cmake/CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(hello NONE)
# find ALPS Library
find_package(ALPS REQUIRED PATHS ${ALPS_ROOT_DIR} $ENV{ALPS_HOME}
NO_SYSTEM_ENVIRONMENT_PATH)
message(STATUS "Found ALPS: ${ALPS_ROOT_DIR} (revision: ${ALPS_VERSION})")
include(${ALPS_USE_FILE})
# enable C and C++ compilers
enable_language(C CXX)
# rule for generating 'hello world' program
add_executable(hello hello.C)
target_link_libraries(hello ${ALPS_LIBRARIES})
add_alps_test(hello)
10 / 35
- 15. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
CMakeLists.txt の例
$ALPS HOME/tutorials/alpsize-01-cmake/CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(hello NONE)
# find ALPS Library
find_package(ALPS REQUIRED PATHS ${ALPS_ROOT_DIR} $ENV{ALPS_HOME}
NO_SYSTEM_ENVIRONMENT_PATH)
message(STATUS "Found ALPS: ${ALPS_ROOT_DIR} (revision: ${ALPS_VERSION})")
include(${ALPS_USE_FILE})
# enable C and C++ compilers
enable_language(C CXX)
# rule for generating 'hello world' program
add_executable(hello hello.C)
target_link_libraries(hello ${ALPS_LIBRARIES})
add_alps_test(hello)
10 / 35
- 16. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
CMakeLists.txt の例
$ALPS HOME/tutorials/alpsize-01-cmake/CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(hello NONE)
# find ALPS Library
find_package(ALPS REQUIRED PATHS ${ALPS_ROOT_DIR} $ENV{ALPS_HOME}
NO_SYSTEM_ENVIRONMENT_PATH)
message(STATUS "Found ALPS: ${ALPS_ROOT_DIR} (revision: ${ALPS_VERSION})")
include(${ALPS_USE_FILE})
# enable C and C++ compilers
enable_language(C CXX)
# rule for generating 'hello world' program
add_executable(hello hello.C)
target_link_libraries(hello ${ALPS_LIBRARIES})
add_alps_test(hello)
10 / 35
- 17. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ビルド環境
テストスクリプト
add alps test は以下と同等
$ ./hello $ALPS_HOME/tutorials/alpsize-00-CMake/hello.ip > $ diff -u $ALPS_HOME/tutorials/alpsize-00-CMake/hello.op hello.tmp
$ rm hello.tmp
実行結果(出力) をhello.op と比較
$ cat $ALPS_HOME/tutorials/alpsize-00-CMake/hello.op
hello, world
11 / 35
- 18. ALPS チュートリアル{ アプリケーションのALPS 化
C++プログラミング
02 C プログラム
Wolff アルゴリズム
2 次元正方格子強磁性Ising 模型のモンテカルロ計算
ランダムに選んだ点からクラスターを作成し, スピン反転
ソースコード: wolff.c
ビルドと実行
$ mkdir $HOME/alpsize-02-original-c
$ cd $HOME/alpsize-02-original-c
$ cmake $ALPS_HOME/tutorials/alpsize-02-original-c
$ make
$ ./wolff
12 / 35
- 19. ALPS チュートリアル{ アプリケーションのALPS 化
C++プログラミング
03 C++プログラム
Wolff アルゴリズムC++で書きなおす
ヘッダファイル名, namespace, コメント形式
for 文中でのループ変数の宣言
iostream を用いた結果の出力
修正点: wolff.diff
ビルドと実行
$ mkdir $HOME/alpsize-03-basic-cpp
$ cd $HOME/alpsize-03-basic-cpp
$ cmake $ALPS_HOME/tutorials/alpsize-03-basic-cpp
$ make
$ ./wolff
13 / 35
- 20. ALPS チュートリアル{ アプリケーションのALPS 化
C++プログラミング
04 STL の利用
STL (C++ Standard Template Library) を利用する
std::vector : 動的配列
std::stack : pop, push, top, empty メンバ関数
修正点: wolff.diff
ビルドと実行
$ mkdir $HOME/alpsize-04-stl
$ cd $HOME/alpsize-04-stl
$ cmake $ALPS_HOME/tutorials/alpsize-04-stl
$ make
$ ./wolff
14 / 35
- 21. ALPS チュートリアル{ アプリケーションのALPS 化
C++プログラミング
05 Boost の利用
Boost ライブラリを利用する
boost::array : 固定長配列
boost::random : 擬似乱数生成器, 確率分布
boost::timer : ポータブルなタイマー
修正点: wolff.diff
ビルドとテスト
$ mkdir $HOME/alpsize-05-boost
$ cd $HOME/alpsize-05-boost
$ cmake $ALPS_HOME/tutorials/alpsize-05-boost
$ make
$ ctest
15 / 35
- 22. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
06 ALPS/parameters
ALPS/parameter ライブラリを利用する
標準入力から, 変数名と値のペアを読み込む. 値は「式」でも
良い
alps::Parameter, alps::Parameters, alps::ParameterList
デフォルト値の設定
修正点: wolff.diff
ビルドとテスト
$ mkdir $HOME/alpsize-06-parameters
$ cd $HOME/alpsize-06-parameters
$ cmake $ALPS_HOME/tutorials/alpsize-06-parameters
$ make
$ ctest
16 / 35
- 23. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/parameter ライブラリ
プログラムに与えるパラメータを解釈するライブラリ
LATTICE = "chain lattice";
L = 16,
SEED = 2873
// C++ style comment
SWEEPS = 4096;
THERMALIZATION = SWEEPS/8;
/* C style comment */
{ T = 2; Sq = 2*PI/3; }
{ T = 1.8; }
四則演算可能
を文字で指定
空行も正しく認識
C 風, C++風のコメント
f g で囲んだ変数は異なるセット
空白を適切に認識
改行, セミコロン, コンマで変数
を区別
17 / 35
- 24. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/parameter ライブラリ
プログラムに与えるパラメータを解釈するライブラリ
LATTICE = chain lattice;
L = 16,
SEED = 2873
// C++ style comment
SWEEPS = 4096;
THERMALIZATION = SWEEPS/8;
/* C style comment */
{ T = 2; Sq = 2*PI/3; }
{ T = 1.8; }
四則演算可能
を文字で指定
空行も正しく認識
C 風, C++風のコメント
f g で囲んだ変数は異なるセット
空白を適切に認識
改行, セミコロン, コンマで変数
を区別
17 / 35
- 25. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/parameter ライブラリの利用法
#include boost/foreach.hpp
#include alps/parameter.h
...
int main(int argc, char** argv) {
...
alps::ParameterList plist = read_param(argc, argv);
BOOST_FOREACH(alps::Parameters p, plist) {
double a = p[a];
double b = p.value_or_default(b, 0.5);
...
}
...
}
18 / 35
- 26. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/parameter ライブラリの利用法
#include boost/foreach.hpp
#include alps/parameter.h
...
int main(int argc, char** argv) {
...
alps::ParameterList plist = read_param(argc, argv);
BOOST_FOREACH(alps::Parameters p, plist) {
double a = p[a];
double b = p.value_or_default(b, 0.5);
...
}
...
}
18 / 35
- 27. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
07 ALPS/alea
ALPS/alea ライブラリを利用する
マルコフ連鎖における平均値, エラーバー, 自己相関を計算する
ライブラリ
非線形な量についても, ジャックナイフ法を用いて正しいエ
ラーバーを評価可能(例: Binder 比⟨m2⟩2=⟨m4⟩)
修正点: wolff.diff
ビルドとテスト
$ mkdir $HOME/alpsize-07-alea
$ cd $HOME/alpsize-07-alea
$ cmake $ALPS_HOME/tutorials/alpsize-07-alea
$ make
$ ctest
19 / 35
- 28. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/alea ライブラリの利用法
マルコフ連鎖における平均値, 分散, 自己相関を計算するライブラリ
#include alps/alea.h
...
alps::ObservableSet obs;
...
obs alps::RealObservable(Energy);
...
for (int i = 0; i != N; ++i) {
double e = energy(); // calclulate something
obs.reset(i == THERM); // when thermalized
obs[Energy] e;
}
...
std::cout obs[Energy];
20 / 35
- 29. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
Tips: 出力を制御する
// Gnuplot 風出力
std::cout 1./param[beta]
obs[Energy].mean()
obs[Energy].variance() std::endl;
21 / 35
- 30. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
08 ALPS/lattice
ALPS/lattice ライブラリを利用する
XML により任意の次元の任意の格子(グラフ) を生成可
サイト数, ボンド数, 全サイト, 全ボンド, 最近接サイト, etc へ
のアクセス関数
修正点: wolff.diff
ビルドとテスト
$ mkdir $HOME/alpsize-08-lattice
$ cd $HOME/alpsize-08-lattice
$ cmake $ALPS_HOME/tutorials/alpsize-08-lattice
$ make
$ ctest
22 / 35
- 31. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/lattice ライブラリの利用法
#include alps/lattice.h
...
class ising : public alps::graph_helper {
public:
ising(alps::Parameters const p)
: graph_helper(p) {}
...
};
23 / 35
- 32. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
格子(graph) の定義
LATTICE name=square lattice dimension=2
PARAMETER name=a default=1/
BASISVECTORa 0/VECTORVECTOR0 a/VECTOR/BASIS
RECIPROCALBASISVECTOR2*pi/a 0/VECTORVECTOR0 2*pi/a/VECTOR/RECIPROCALBASIS
/LATTICE
UNITCELL name=simple2d dimension=2
VERTEX/
EDGESOURCE vertex=1 offset=0 0/TARGET vertex=1 offset=0 1//EDGE
EDGESOURCE vertex=1 offset=0 0/TARGET vertex=1 offset=1 0//EDGE
/UNITCELL
LATTICEGRAPH name = square lattice
FINITELATTICE
LATTICE ref=square lattice/
PARAMETER name=W default=L/
EXTENT dimension=1 size=L/
EXTENT dimension=2 size=W/
BOUNDARY type=periodic/
/FINITELATTICE
UNITCELL ref=simple2d/
/LATTICEGRAPH
24 / 35
- 33. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS ライブラリの利用
ALPS/lattice ライブラリの便利な関数
std::vectordouble d(num_sites());
std::vectordouble J(num_bonds());
...
double energy = 0.;
BOOST_FOREACH(site_descriptor s, sites()) {
BOOST_FOREACH(bond_descriptor b, neighbor_bonds(s)) {
energy += J[b] * d[source(b)] * d[target(b)];
}
}
...
boost::mt19937 rng;
boost::uniform_int dst(0, num_bonds()-1);
J[bond(dst(rng))] = 0;
Jtemp = param[J + bond_type(b)];
sites(), bonds() はBOOST FOREACH と組み合わせる
index(s) やindex(b) で数字に変換
bond(n) やsite(n) で* descriptor に変換
25 / 35
- 34. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (1)
ALPS には3 種類のスケジューラ. 本講習ではALPS/parapack
スケジューラを使用
ユーザのシミュレーションコードをWorker クラスにカプセル
化(例: hello worker.h)
Worker クラスが実装しなければならない関数
コンストラクタ、init obserbables メンバー関数
run メンバー関数
is thermalized progress メンバ関数
save load メンバ関数
PARAPACK REGISTER WORKER マクロを用いてWorker を
スケジューラに登録(例: hello worker.C)
実行時にALGORITHM パラメータでWorker を選択できる
26 / 35
- 35. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (2)
メイン文: worker.C)
int main(int argc, char** argv) {
return alps::parapack::start(argc, argv);
}
ビルド, テスト, (マルチスレッド) 実行
$ mkdir $HOME/alpsize-09-scheduler
$ cd $HOME/alpsize-09-scheduler
$ cmake $ALPS_HOME/tutorials/alpsize-09-scheduler
$ make
$ ctest
$ parameter2xml $ALPS_HOME/.../wolff_params wolff_params
$ ./wolff wolff_params.in.xml
27 / 35
- 36. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (3)
Worker の一生
初回: コンストラクタ) init observables ) run ) run ) run
) ) save ) デストラクタ
チェックポイントリスタート後: コンストラクタ) load )
run ) run ) run ) ) save ) デストラクタ
init observables は初回のみ呼び出される
progress の返り値が1 に達するor 制限時間に達するまでrun
が繰り返し呼ばれる
定期的にsave 関数が呼ばれる
28 / 35
- 37. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (4)
コンストラクタ: worker(alps::Parameters const);
パラメタの読み込み、配列の初期化など
init observables(alps::Parameters const,
alps::ObservableSet obs);
物理量の宣言 登録
run(alps::ObservableSet);
何らかの計算を1 ステップだけ実行
bool is thermalized() const;
この値がtrue の間だけ物理量が保存される. (false からtrue に
変わった時点でリセットされる)
double progress() const;
進捗状況を[0,1] で返す
29 / 35
- 38. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (5)
save(alps::ODump) const;
チェックポイントの書き出し. スピン配位などをバイナリ形式
(xdr) で保存する
alps::ODump には, int, doulbe, std::vector 等ほとんど何でも書
き込める
ユーザが宣言した構造体, クラスのインスタンスを書き込みた
い場合には, 演算子をオーバーロードする
dp mcs spin sz;
load(alps::IDump);
チェックポイントからの読み込み
書き出しと同じ順序で読み込む
dp mcs spin sz;
30 / 35
- 39. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (6)
Worker の基底クラス
alps::parapack::abstract worker : 最も基本的な基底クラス
alps::parapack::mc worker : alps::rng helper を継承. 乱数生成
器が利用可. 乱数生成器の状態のチェックポイントリスタート
も自動的に行われる
alps::parapack::lattice mc worker⟨⟩ : alps::graph helper を継承.
ALPS/lattice ライブラリの関数が利用可
alps::parapack::latticemodel mc worker⟨⟩ : alps::protected
model helper⟨⟩ を継承. ALPS/model ライブラリの関数が利
用可
31 / 35
- 40. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (7)
Evaluator: wolff worker.h
ALPS/parapack スケジューラでは, NUM CLONES パラメータ
を指定することで, 同じパラメータセットで乱数の種だけが異
なるシミュレーション(Clone) を複数並列実行可(ばかパラ)
同じパラメータセットに属するClone の測定量は, 終了時に自
動的にマージされる
非線形な物理量(例: ビンダー比, 相関長) の計算は、Clone の
マージが終わった後に行う必要がある
Evaluator をWorker と同じ名前でスケジューラに登録しておく
と, Clone のマージ後にevaluate 関数が呼び出される
32 / 35
- 41. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
09 ALPS Scheduler (8)
Worker の並列化(OpenMP 並列)
CMake 時に, -DALPS ENABLE OPENMP WORKER=ON が
指定されていれば、Worker の中でOpenMP 利用可
Worker の並列化(MPI 並列)
Worker のコンストラクタを修正
worker(mpi::communicator const, alps::Parameters const
)
コンストラクタに渡されたmpi::communicator の中は自由に
使ってよい.
PARAPACK REGISTER PARALLEL WORKER マクロを用い
てWorker を登録
実行時に-r オプションと-p オプションで, 総スレッド数と
Worker あたりのスレッド数を指定
33 / 35
- 42. ALPS チュートリアル{ アプリケーションのALPS 化
ALPS スケジューラの利用
10,11 ALPS Fortran
Fortran プログラムをALPS に組み込む
クラスの代わりにサブルーチン群を作成する(alps init, alps
init observable, alps run, など)
サブルーチン間の状態の受け渡しは, common またはmodule
を利用する
C++ポインタの受け渡しにinteger(2) を使う(caller 変数)
チュートリアル
ALPS Fortran Introduction
ALPS Fortran Application Development
34 / 35