SlideShare a Scribd company logo
1 of 40
Download to read offline
ALPS チュートリアル{ アプリケーションのALPS 化 
ALPS チュートリアル{ アプリケーションの 
ALPS 化 
CMSI ハンズオン 
ALPS Collaboration 
http://alps.comp-phys.org/ 
2014-10-16 
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 にMake
le 用の変数設 
定ファイルが用意されている 
Make
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
ALPS チュートリアル{ アプリケーションのALPS 化 
ALPS ビルド環境 
CMake 
クロスプラットフォームなビルドツール 
Windows にも対応 
Make
le を生成 
高速な並列ビルド 
テスト環境 
ビルドルール, ライブラリ, 依存関係などは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 hello.tmp 
$ 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++風のコメント 
f g で囲んだ変数は異なるセット 
空白を適切に認識 
改行, セミコロン, コンマで変数 
を区別 
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++風のコメント 
f g で囲んだ変数は異なるセット 
空白を適切に認識 
改行, セミコロン, コンマで変数 
を区別 
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/ 
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
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
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

More Related Content

What's hot

Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Nobuhiro Nakashima
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4ichikaway
 
Ext.directことはじめ
Ext.directことはじめExt.directことはじめ
Ext.directことはじめShuhei Aoyama
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
OpenFOAM の Function Object 機能について
OpenFOAM の Function Object 機能についてOpenFOAM の Function Object 機能について
OpenFOAM の Function Object 機能についてFumiya Nozaki
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介NSaitoNmiri
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたkwatch
 

What's hot (10)

Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Ext.directことはじめ
Ext.directことはじめExt.directことはじめ
Ext.directことはじめ
 
Read egg oven
Read egg ovenRead egg oven
Read egg oven
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
OpenFOAM の Function Object 機能について
OpenFOAM の Function Object 機能についてOpenFOAM の Function Object 機能について
OpenFOAM の Function Object 機能について
 
ILE-RPG Study 001
ILE-RPG Study 001ILE-RPG Study 001
ILE-RPG Study 001
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみた
 

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

Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAmazon Web Services Japan
 
AWS サービスアップデートまとめ 2013年9月
AWS サービスアップデートまとめ 2013年9月AWS サービスアップデートまとめ 2013年9月
AWS サービスアップデートまとめ 2013年9月Yasuhiro Horiuchi
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Apache Calcite の Apache Geode Adapter を弄った
Apache Calcite の Apache Geode Adapter を弄ったApache Calcite の Apache Geode Adapter を弄った
Apache Calcite の Apache Geode Adapter を弄ったAkihiro Kitada
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプトbsdhack
 
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要ADVENTURE Project
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04Minoru Chikamune
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Taro Hirose
 
Data management of cosmos db using apache gremlin
Data management of cosmos db using apache gremlinData management of cosmos db using apache gremlin
Data management of cosmos db using apache gremlinTakao Tetsuro
 
Run Spark on EMRってどんな仕組みになってるの?
Run Spark on EMRってどんな仕組みになってるの?Run Spark on EMRってどんな仕組みになってるの?
Run Spark on EMRってどんな仕組みになってるの?Satoshi Noto
 

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

Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
 
AWS サービスアップデートまとめ 2013年9月
AWS サービスアップデートまとめ 2013年9月AWS サービスアップデートまとめ 2013年9月
AWS サービスアップデートまとめ 2013年9月
 
API Gateway / AWS CLI
API Gateway / AWS CLIAPI Gateway / AWS CLI
API Gateway / AWS CLI
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Shelly
ShellyShelly
Shelly
 
Apache Calcite の Apache Geode Adapter を弄った
Apache Calcite の Apache Geode Adapter を弄ったApache Calcite の Apache Geode Adapter を弄った
Apache Calcite の Apache Geode Adapter を弄った
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
Task
TaskTask
Task
 
Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方
 
Data management of cosmos db using apache gremlin
Data management of cosmos db using apache gremlinData management of cosmos db using apache gremlin
Data management of cosmos db using apache gremlin
 
Run Spark on EMRってどんな仕組みになってるの?
Run Spark on EMRってどんな仕組みになってるの?Run Spark on EMRってどんな仕組みになってるの?
Run Spark on EMRってどんな仕組みになってるの?
 

More from Computational Materials Science Initiative

More from Computational Materials Science Initiative (20)

MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
ALPSチュートリアル
ALPSチュートリアルALPSチュートリアル
ALPSチュートリアル
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
MateriApps: OpenMXを利用した第一原理計算の簡単な実習
MateriApps: OpenMXを利用した第一原理計算の簡単な実習MateriApps: OpenMXを利用した第一原理計算の簡単な実習
MateriApps: OpenMXを利用した第一原理計算の簡単な実習
 
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
 
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
 

Recently uploaded

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 

Recently uploaded (11)

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 

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

  • 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
  • 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