Boost.MPI に MVAPICH2 を用いる

Boost.MPI は MPICH や OpenMPI では Default Configuration が良い感じに走って using mpi するだけで問題ないのですが, MVAPICH2 はコンパイラの名前が異なっているため, そのままでは動きません.

/tools/build/v2/user-config.jam に以下のように書きます.

using mpi : mpicxx ;

これだけで OpenMPI なども mpicxx が使えるので MVAPICH2 でもビルドできます.

それにしても MVAPICH2 で通信しようとすると Broken Pipe で通信がうまくできないんだが何が問題なんだろうか...

Environment Modules で複数のバージョンのソフトウェアを扱う

Modules -- Software Environment Management *1

これはユーザーが異なる複数のバージョンのソフトウェアを使用できるようにするために, load/unload を提供して管理を楽にする為のソフトウェアのようです.

PC クラスタOSCAR Project)などでの運用実績があり, クラスタスパコンなどで使うところが多いという感じを受けました.

ソフトウェアのインストール, 設定後の話をすると.

$ module avail
gnu/4.6.3 gnu/4.7.1
$ module load gnu/4.6.3
$ gcc --version
gcc 4.6.3
$ module unload gnu/4.6.3
$ gcc --version
gcc 4.4.6 # デフォルトの GCC

みたいな操作ができます.

もちろん, 自動でやってくれるわけではなく, 自分でモジュールの設定ファイルを書く必要があります. それはこのソフトウェアをインストールした後に自動で入っているモジュールを参考にすると案外簡単にかけます.

なのでインストールから module が使用できるようになるまでさっと書いておきます.

インストール

上のページのインストールからソフトウェアをダウンロードしていつものコマンドでインストール. C 言語版の Stable の方がいいでしょう.

$ ./configure
$ make install

一応 make install する前に,

$ ./modulecmd bash

と打ち込んでエラーがないか確認してください.

デフォルトのインストールパスは /usr/local/Modules のようです.

設定

これだけでは使えないので, 環境変数のロード用のスクリプトを読み込みます.<インストールディレクトリ>/<バージョン>/init ディレクトリ内に bash, sh などシェルと Python, Perl 用の設定ファイルが置かれているようです.

bash では .bashrc に以下のように書き込めば OK です.

if [ -f <インストールディレクトリ>/<バージョン>/init/bash ]; then
  . <インストールディレクトリ>/<バージョン>/init/bash
fi

これで,

$ module

と打ち込んで Usage が出力されれば OK.

これでモジュールの管理設定の前までできました.

モジュールの登録

後はこのソフトウェアで管理すべきモジュールを登録するのですが, これは設定ファイルを見て書いたほうが早いと思います.<インストールディレクトリ>/<バージョン>/modulefiles の中に幾つかモジュール設定ファイルが入っていますので, これを参考にしてください.

また, モジュール設定ファイルのパスは $MODULEPATH 環境変数に登録されています. 自分で設定すれば任意のディレクトリに置くことが可能です.

最後に

今まで GCC の変更には update-alternatives を使っていました. しかし今回紹介したソフトウェアはモジュール設定ファイルを実際に見てもらえれば分かりますが環境変数に append/prepend などができますので, 実行ファイルだけでなくライブラリなども簡単に変更できると思います.

例えば, MPI の実装などは OpenMPI や MVAPICH や MPICH などの複数ありますが, 実行ファイル名が被っていたりしてかなりめんどくさいです.

インストールが大変めんどくさくなると思いますが, 今回のソフトウェアで多少運用が楽になるかなと思います.

*1:正式な名前がよく分かりません...

メモ:jasmine + Coffeescript でテストを書く.

テストと言っていいのか, BDD ではスペックというのが一般的なのかはよくわからないのですが, gem の jasmine でテスト環境を準備したのでメモ.

jasmine 自体の説明は公式といい感じのページあったので.

pivotal/jasmine · GitHub
Jasmineでテスティング | feedforce Engineers' blog

今回はスタンドアローンでなくて, gem でインストールして Ruby 環境で動くようにした.

スタンドアローンだと, 自分で HTML にテスト対象やスペックの Javascript とかを読み込ませないといけないのだが, gem のならワイルドカードでパスを設定して自動で読み込んでくれるようなので.

導入には書いてなかったが, Rails がないと駄目らしい. jasmine だけ入れて動かそうとすると jasmine non available というようなメッセージが出てくる.

gem install jasmine
gem install rails

後は, jasmine init を叩けばプロジェクトのサンプルと一緒に環境がセットアップされる. Rakefile でテストを実行できるので, rake jasmine:ci と打ち込む.

$ mkdir jasmine
$ cd jasmine
$ jasmine init
$ rake jasmine:ci
<ここにテスト結果が出力される>

rake jasmine と打ち込むと, サーバが起動して, テストを http://localhost:8888/ にアクセスすることで実行と結果の参照ができる. rake jasmine:ci はブラウザで見る面倒を省き, テスト結果をコンソール上に出力できるようにしてくれる. 内部的には Firefox を起動して実行して結果を得るようなことをしているようです.

ただ, 打ち込むの面倒なのでデフォルトの動作を設定する. Rakefile の先頭に以下の行を追加する.

task :default => "jasmine:ci"

これで, rake と打ち込んだだけで jasmine:ci が実行される.

ソースファイルとかのディレクトリが既にある場合, spec/javascripts/support/jasmine.yml にサンプルとともにディレクトリやテスト対象のファイルなどの設定が書かれているので, ここを変更する.

ちなみに, このファイルのパスは普通には変更できないようです. もしかしたら変更できるかも知れないんですが...

jasmine-jquery を入れれば jquery 操作に対するテストも簡単に書けるようになるようなので, 便利ですね.

velesin/jasmine-jquery · GitHub

最近気になるもの

大体 CUDA か GPU 関係.

Boost.ODEIntが採択されました - Faith and Brave - C++で遊ぼう

ODEInt は常微分方程式を解くためのライブラリ. 無条件採択されたらしい. Thrust を使用して GPU で計算もできるとかなんとか.

書いてるの反復法といくつかなので使い道あるか怪しい気がしてきた... 多分使う, 気がする.

BoostでGPU計算ライブラリの話が出てる - Faith and Brave - C++で遊ぼう

Thrust みたいな STL ライクに操作できる GPU 実装を Boost でやりたいとかいう話. CUDA だけでなく OpenCL とかバックエンドを差し替えられるようにしたいとか.

一体どうなるのか. Boost.SIMD みたいになりそうな予感はする...

Sparse « CULA

線形台数 (というか反復法) の CUDA 実装を提供しているライブラリでその疎行列タイプ. 使用するのにお金がかかるが, 学術研究で1台のコンピュータで使用するタイプなら登録すればフリーで使える.

お金取られるだけあって性能はかなり高いようです. フリー版登録したので使ってみます.

guard-coffeescript と guard-shell で Coffeescript と jade を自動ビルド

jade だけだったら watch とか使えば良いと思うんですが, Coffeescript も自動ビルドしたい. しかしぱっと見 guard-jade とかなさそう.

Coffeescript の自動ビルドは guard-coffeescript でなんとかして頂きたい. ということで jade については自分で書く.

$ gem install guard
$ gem install guard-coffeescript
$ gem install guard-shell
$ gem install jade

諸事情で jade は実は npm でインストールしてあるんだが, 恐らく大丈夫.

Guardfile はこんな感じ.

# jade/ にある .jade ファイルの変更を検知してビルドしたものを public に出力
# .swp ファイルは排除 ( vim で書いてるので... )
# -P フラグで HTML 出力を人間が読みやすいようにしてくれる
guard :shell, :all_on_start => true do
  if watch /jade\/.*\.jade(?!\.swp)/ do |m|
    `jade -P -O public/ #{m}`
  end
end

# coffee/ にある .coffee ファイルの変更を検知してビルドしたものを public/js に出力
guard 'coffeescript', :input => 'coffee', :output => 'public/js', :bare => false, :all_on_start => true

all_on_start を true にすると guard を実行した瞬間にすべてビルドします.

こんな感じ. guard-jade ないかなあ. ( というか guard-coffeescript とかがどう実装しているのかは知らない )