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

40
ALPS チュートリアル アプリケーションの ALPS ALPS チュートリアル アプリケーションの ALPS CMSI ハンズオン ALPS Collaboration http://alps.comp-phys.org/ 2014-10-16 1 / 35

Upload: computational-materials-science-initiative

Post on 26-Jun-2015

744 views

Category:

Technology


4 download

DESCRIPTION

CMSIハンズオン資料

TRANSCRIPT

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

ALPSチュートリアル – アプリケーションの ALPS化

ALPSチュートリアル – アプリケーションのALPS化

CMSIハンズオン

ALPS Collaborationhttp://alps.comp-phys.org/

2014-10-16

1 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化Outline

1 ALPSize (ALPS化)のすすめ

2 ALPSビルド環境

3 C++プログラミング

4 ALPSライブラリの利用

5 ALPSスケジューラの利用

2 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSize (ALPS化)のすすめ

ALPSライブラリを使用する利点

エラーバーと自己相関時間の自動計算 (ALPS/alea)

自動並列化 & ロードバランシング (ALPS/scheduler)

チェックポイント作成とリスタート機能 (ALPS/scheduler)

XML形式による計算結果の自動出力とこれらを扱うコマンドラインツール入力パラメータの柔軟な扱い (ALPS/parameter)

擬似乱数生成器 (ALPS/random)

格子の容易な取扱い (ALPS/lattice)

量子ハミルトニアンの容易な取扱い (ALPS/model)

3 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSize (ALPS化)のすすめ

ALPSビルド環境を使用する利点

コンパイラ & 最適化オプションの自動設定MPI & OpenMP用オプションの自動設定ライブラリ (Boost, BLAS/LAPACK, HDF5, FFTW, SQLite,Python等)の自動検出ALPSライブラリを利用するためのオプションの自動設定テスト用スクリプト京、FX10、その他代表的なスパコン用のビルド環境が整備されているWindows用のバイナリ作成が可能

4 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSize (ALPS化)のすすめ

ALPSize実習

00-01 ALPSビルド環境の利用 (Make, CMake)

02-05 C++プログラミング

06-08 ALPSライブラリの利用

09 ALPSスケジューラの利用

5 / 35

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

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

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

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

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSビルド環境

CMake

クロスプラットフォームなビルドツールWindowsにも対応

Makefileを生成

高速な並列ビルド

テスト環境

ビルドルール, ライブラリ, 依存関係などは CMakeLists.txt に記述する

CMakeのインストールについては, http://todo.issp.u-tokyo.ac.jp/ja/search?SearchableText=cmake

8 / 35

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

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ではソースディレクトリ ($ALPSHOME/tutorials/alpsize-01-cmake)とビルドディレクトリ($HOME/alpsize-01-cmake)は別にする

9 / 35

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

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

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

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

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

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

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

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

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSビルド環境

テストスクリプト

add alps testは以下と同等

$ ./hello $ALPS_HOME/tutorials/alpsize-00-CMake/hello.ip > hello.tmp

$ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSライブラリの利用

Tips: 出力を制御する

// Gnuplot 風出力std::cout << 1./param["beta"] << " "

<< obs["Energy"].mean() << " "

<< obs["Energy"].variance() << std::endl;

21 / 35

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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::protectedmodel helper⟨⟩ を継承. ALPS/modelライブラリの関数が利用可

31 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSスケジューラの利用

09 ALPS Scheduler (7)

Evaluator: wolff worker.h

ALPS/parapackスケジューラでは, NUM CLONESパラメータを指定することで, 同じパラメータセットで乱数の種だけが異なるシミュレーション (Clone)を複数並列実行可 (ばかパラ)同じパラメータセットに属する Cloneの測定量は, 終了時に自動的にマージされる非線形な物理量 (例: ビンダー比, 相関長)の計算は、Cloneのマージが終わった後に行う必要があるEvaluatorをWorkerと同じ名前でスケジューラに登録しておくと, Cloneのマージ後に evaluate関数が呼び出される

32 / 35

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

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

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSスケジューラの利用

10,11 ALPS Fortran

Fortranプログラムを ALPSに組み込むクラスの代わりにサブルーチン群を作成する (alps init, alpsinit observable, alps run, など)サブルーチン間の状態の受け渡しは, common または moduleを利用するC++ポインタの受け渡しに integer(2) を使う (caller変数)

チュートリアルALPS Fortran IntroductionALPS Fortran Application Development

34 / 35

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

ALPSチュートリアル – アプリケーションの ALPS化ALPSスケジューラの利用

実習

逐次プログラムの ALPS化オリジナルコード: ising.C

並列プログラムの ALPS化オリジナルコード: ising parallel.C

35 / 35