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

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

on

  • 833 views

CMSI神戸ハンズオン資料

CMSI神戸ハンズオン資料

Statistics

Views

Total Views
833
Views on SlideShare
645
Embed Views
188

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 188

http://ma.cms-initiative.jp 188

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS チュートリアル – アプリケーションの ALPS 化 CMSI 神戸ハンズオン ALPS Collaboration http://alps.comp-phys.org/ 2013-11-06 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 1 / 35 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 Outline 1 ALPSize (ALPS 化) のすすめ 2 ALPS ビルド環境 3 C++プログラミング 4 ALPS ライブラリの利用 5 ALPS スケジューラの利用 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 2 / 35 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPSize (ALPS 化) のすすめ ALPS ライブラリを使用する利点 エラーバーと自己相関時間の自動計算 (ALPS/alea) 自動並列化 & ロードバランシング (ALPS/scheduler) チェックポイント作成とリスタート機能 (ALPS/scheduler) XML 形式による計算結果の自動出力とこれらを扱うコマンド ラインツール 入力パラメータの柔軟な扱い (ALPS/parameter) 擬似乱数生成器 (ALPS/random) 格子の容易な取扱い (ALPS/lattice) 量子ハミルトニアンの容易な取扱い (ALPS/model) ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 3 / 35 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPSize (ALPS 化) のすすめ ALPS ビルド環境を使用する利点 コンパイラ & 最適化オプションの自動設定 MPI & OpenMP 用オプションの自動設定 ライブラリ (Boost, BLAS/LAPACK, HDF5, FFTW, SQLite, Python 等) の自動検出 ALPS ライブラリを利用するためのオプションの自動設定 テスト用スクリプト 京、FX10、その他代表的なスパコン用のビルド環境が整備さ れている Windows 用のバイナリ作成が可能 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 4 / 35 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPSize (ALPS 化) のすすめ ALPSize 実習 00-01 ALPS ビルド環境の利用 (Make, CMake) 02-05 C++プログラミング 06-08 ALPS ライブラリの利用 09 ALPS スケジューラの利用 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 5 / 35 ‌
  • 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS ビルド環境 Make の利用 $ALPS HOME/share/alps/include.mk に Makefile 用の変数設 定ファイルが用意されている Makefile の例 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS ビルド環境 CMake クロスプラットフォームなビルドツール Windows にも対応 Makefile を生成 高速な並列ビルド テスト環境 ビルドルール, ライブラリ, 依存関係などは CMakeLists.txt に 記述する CMake のインストールについては, http://todo.issp. u-tokyo.ac.jp/ja/search?SearchableText=cmake ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 8 / 35 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 he $ rm hello.tmp 実行結果 (出力) を hello.op と比較 $ cat $ALPS_HOME/tutorials/alpsize-00-CMake/hello.op hello, world ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 11 / 35 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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++風のコメント { } で囲んだ変数は異なるセット 空白を適切に認識 改行, セミコロン, コンマで変数 を区別 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 17 / 35 ‌
  • 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++風のコメント { } で囲んだ変数は異なるセット 空白を適切に認識 改行, セミコロン, コンマで変数 を区別 ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 17 / 35 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS ライブラリの利用 Tips: 出力を制御する // Gnuplot 風出力 std::cout << 1./param["beta"] << " " << obs["Energy"].mean() << " " << obs["Energy"].variance() << std::endl; ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 21 / 35 ‌
  • 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 ‌
  • 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS ライブラリの利用 格子 (graph) の定義 <LATTICE name="square lattice" dimension="2"> <PARAMETER name="a" default="1"/> <BASIS><VECTOR>a 0</VECTOR><VECTOR>0 a</VECTOR></BASIS> <RECIPROCALBASIS><VECTOR>2*pi/a 0</VECTOR><VECTOR>0 2*pi/a</VECTOR></RECIPROCALBASIS </LATTICE> <UNITCELL name="simple2d" dimension="2"> <VERTEX/> <EDGE><SOURCE vertex="1" offset="0 0"/><TARGET vertex="1" offset="0 1"/></EDGE> <EDGE><SOURCE 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS ライブラリの利用 ALPS/lattice ライブラリの便利な関数 std::vector<double> d(num_sites()); std::vector<double> 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS スケジューラの利用 09 ALPS Scheduler (7) Evaluator: wolff worker.h ALPS/parapack スケジューラでは, NUM CLONES パラメータ を指定することで, 同じパラメータセットで乱数の種だけが異 なるシミュレーション (Clone) を複数並列実行可 (ばかパラ) 同じパラメータセットに属する Clone の測定量は, 終了時に自 動的にマージされる 非線形な物理量 (例: ビンダー比, 相関長) の計算は、Clone の マージが終わった後に行う必要がある Evaluator を Worker と同じ名前でスケジューラに登録しておく と, Clone のマージ後に evaluate 関数が呼び出される ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 32 / 35 ‌
  • 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 ‌
  • 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 ‌
  • ALPS チュートリアル – アプリケーションの ALPS 化 ALPS スケジューラの利用 実習 逐次プログラムの ALPS 化 オリジナルコード: ising.C 並列プログラムの ALPS 化 オリジナルコード: ising parallel.C ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ 35 / 35 ‌