Tutorials:ALPS USERCODE ALPSize/ja

From ALPS
Jump to: navigation, search


ALPS化の概要

既存のプログラムをCmakeによってパッケージ化し、ALPSライブラリとのリンク等を設定することによってParametersAleaなどのALPSの計算機能やALPSスケジューラが容易に使用できるようになります。ALPSスケジューラを使うことにより次の利点があります。

  • パラメータ並列化が簡単におこなえる。
  • PCでもサーバーでもスパコンでも同じように動作する。
  • 結果の処理が簡単
  • すでに並列化されているコードの多重並列化も簡単
  • 交換法のためのアダプタなどがすでに用意されている。

Cmakeによるパッケージ化

プログラムのパッケージ化にはcmake(2.8以降)を使用します。cmakeはクロスプラットホームなMakeユーティリティーで、cmake&makeでプログラムのコンパイルが可能になります。設定ファイルCMakeLists.txtによって完全に制御されます。ユーザ自身でMakefileを生成するよりもはるかに容易にビルドがおこなえます。 次の図はパッケージ化の流れのイメージです。CMakeList.txtを編集してパッケージ化をおこないます。

パッケージ化の流れ

CMakeList.txtの編集は、ヘッダ部、ALPS環境の読み込み、ターゲットとの依存関係の記述、および必要に応じてテストの記述等をおこなってください。

ヘッダ部
cmake_minimum_required(VERSION 2.8.0 FATAL_ERROR)
project(hello NONE)
ALPS環境の読み込み
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_language(CXX)
ターゲットとの依存関係の記述
add_executable(hello hello.cpp)
(必要に応じて)テストの記述

チュートリアル

各チュートリアルをまとめたサンプルコードは http://todo.ap.t.u-tokyo.ac.jp/archive/alpsize-20120829-r2707.tar.gz にあります。

cmakeによるパッケージ化

00_cmake

$ cmake .
$ make 
$ ./hello

C言語によるWolffアルゴリズムの実装

01_original-c

$ cmake .
$ make 
$ ./wolff

C++言語によるWolffアルゴリズムの実装

02_basic-cpp

  • ヘッダファイルの変更:<math.h>から<cmath>,など
  • std名前空間
  • printf,fprintfからstd::cout,std::cerrへ
  • コメントの書式
$ cmake .
$ make 
$ ./wolff

Standard Template Libraryの利用

03_stl

  • std::vector<>:一次元配列
  • std::stack<>:スタック
    • 必要なサイズは自動的に確保/開放される
    • 配列・スタックの要素の型はtemplate parameterで指定(ユーザ定義型でも良い)
$ cmake .
$ make
$ ./wolff

Boost C++ Libraryの利用

04_boost

  • <boost/array.hpp>
    • 固定長配列
  • <boost/random.hpp>
    • 乱数生成
      • Mersenne Twister法、Lagged Fibonacci法など様々な乱数生成法
      • 一様分布、正規分布、Poisson分布、指数分布など
  • <boost/timer.hpp>
    • タイマー(実行時間測定)
$ cmake .
$ make
$ ./wolff

ALPS/parametersの利用

  • 05_parameters
$ cmake .
$ make
$ ./wolff <wolff.ip

ALPS/aleaの利用

  • 06_alea
$ cmake .
$ make
$ ./wolff wolff.ip

ALPS/latticeの利用

  • 07_lattice
$ cmake .
$ make
$ ./lattice <lattice.ip
$ ./wolff <wolff.ip

ALPS/Parapack Schedulerを利用した完全ALPS化

08_scheduler

  • シミュレーションコードをWorkerクラスにカプセル化
  • Workerクラスが実装しなければならない関数
    • コンストラクタ、init_obserbablesメンバー関数
    • runメンバー関数
    • is_thermalized&progressメンバ関数
    • save&loadメンバ関数
  • PARAPACK_REGISTER_WORKERマクロを用いてWorkerをスケジューラに登録(実行時にALGORITHMパラメータでWorkerを選択できる)
  • スケジューラがParametersとObservableSetを準備し、コンストラクタ、init_observables関数、run関数を引き渡す。
  • lattice_mc_workerはlattice_helper,rng_helperを継承しているので、lattice_helper,rng_helperの機能が中で使用できる
$ cmake .
$ make
$ ./hello < hello.ip
$ ./wolff < wolff.ip