Your SlideShare is downloading. ×
ALPSチュートリアル(7) アプリケーションのALPS化
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

ALPSチュートリアル(7) アプリケーションのALPS化

643

Published on

CMSIハンズオン資料

CMSIハンズオン資料

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
643
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ALPS チュートリアル{ アプリケーションのALPS 化 ALPS チュートリアル{ アプリケーションの ALPS 化 CMSI ハンズオン ALPS Collaboration http://alps.comp-phys.org/ 2014-10-16 1 / 35
  • 2. ALPS チュートリアル{ アプリケーションのALPS 化 Outline 1 ALPSize (ALPS 化) のすすめ 2 ALPS ビルド環境 3 C++プログラミング 4 ALPS ライブラリの利用 5 ALPS スケジューラの利用 2 / 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
  • 7. ALPS チュートリアル{ アプリケーションのALPS 化 ALPS ビルド環境 Make の利用 $ALPS HOME/share/alps/include.mk にMake
  • 8. le 用の変数設 定ファイルが用意されている Make
  • 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
  • 10. ALPS チュートリアル{ アプリケーションのALPS 化 ALPS ビルド環境 CMake クロスプラットフォームなビルドツール Windows にも対応 Make
  • 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
  • 43. ALPS チュートリアル{ アプリケーションのALPS 化 ALPS スケジューラの利用 実習 逐次プログラムのALPS 化 オリジナルコード: ising.C 並列プログラムのALPS 化 オリジナルコード: ising parallel.C 35 / 35

×