2011年12月13日火曜日

粒子ベースシミュレーション記述言語のコンパイル


前回のエントリでは、粒子ベースシミュレーション記述言語を使ってN-Body(多体問題)シミュレーションを記述し、それをインタプリタとして実行しました。

今回は、それをコンパイルして実行するようにしたので紹介します。

実装方針
実装の方法としては、Template Haskellを使ってDSLをHaskellのコードに変換しています。この展開によって、前回のエントリでHaskellで直接書いた場合と同様のコードを生成し、さらにghcでコンパイルしています。

つまり、ホスト言語が粒子ベースシミュレーション記述言語、ターゲット言語がHaskellということになります。もっとも、組み込みDSLなので明確な線引きがあるわけではありませんが。

コード
コードはこちらに置いてあります。前回のインタプリタとあわせて、モジュールとして整理しました。

モジュールの構成は以下のようになっています。
- Examples/          実行例をまとめています
- SimulationDSL/
  - SimulationDSL.hs   モジュール外へのエクスポート
  - SimulationDSL/
    - Compiler/        コンパイラに関するコード
    - Data/            基本的なデータ構造
    - Interpreter/     インタプリタに関するコード
    - Language/        シミュレーション記述言語の構文と解釈
    - Test/            テストを追加していく予定

実行方法
以下のように、ExamplesフォルダのCompilerRun.hsをコンパイルし、ファイルを実行します。
$ cd Examples
$ ghc -i../SimulationDSL --make -O2 CompilerRun.hs
$ ./CompilerRun

実行効率の確認
実行速度を、以下について比べてみます
  • コンパイラを使った場合 - CompilerRun
  • Haskellで直接書いた場合 - NBody
  • インタプリタを使った場合 - InterpreterRun

実行速度は以下のようになりました。
$ time ./CompilerRun > /dev/null

real 0m0.949s
user 0m0.927s
sys 0m0.011s

$ time ./NBody > /dev/null

real 0m0.972s
user 0m0.950s
sys 0m0.011s

$ time ./InterpreterRun > /dev/null
real 0m2.932s
user 0m2.906s
sys 0m0.022s

グラフにすると以下のようになります。



狙い通り、コンパイラを使った場合は、インタプリタのx2〜x3の速度、つまり、Haskellで直接書いた場合と同等の速さで動いています。

まとめ
このエントリでは、粒子ベースシミュレーション記述言語をHaskellにコンパイルしました。その結果、実行速度が改善されたことを示しました。

今回は組み込みDSLとしてターゲット言語をHaskellにしましたが、Cにコンパイルすることや、さらにOpenMPやCUDAに対応させて並列計算を可能にすることも検討しています。

また、HackageDBにAccelerateという配列をCUDAで計算するライブラリがあるようなので、これを使う方法もありそうです。

逆の方向として、粒子ベースシミュレーション記述言語の表現力を強化することも考えられます。
  • 境界条件の指定
  • 効率的な近傍探索のサポート
  • 例外処理
  • デバッガ
  • プロファイラ
  • 階層構造の導入(剛体シミュレーション)
  • ドメインの導入(固液連成)

ラグランジュ的表現とオイラー的表現
この言語はラグランジュ的な表現を記述することができます。一方、オイラー的な表現を記述することはできません。

有限差分法や有限要素法、あるいは格子ガス法や格子ボルツマン法といった、格子およびメッシュをベースにした表現を使ったシミュレーションを記述するには、また別の言語モデルを設計することになるでしょう。


関連エントリ
このエントリに関連するページです。

粒子法シミュレーション記述言語によるn-Body(多体問題)シミュレーション
粒子法シミュレーションを記述するための言語を設計中
【まとめ】埋め込みDSL関係の論文(1)
【まとめ】埋め込みDSL関係の論文(2)


まとめページ

粒子法(SPH)のプログラムを解説したシリーズです。ソースコードも公開しています。

粒子法(SPH)のプログラム一覧




シミュレーションの結果をレンダリングして作った動画です。流体シミュレーションや剛体シミュレーションの動画を見ることができます。

動画の一覧






--

0 件のコメント: