OpenFOAMのGPGPU版オープンソース実装「RapidCFD」を試す

おそらく世界で一番使われているオープンソースのCAEツール[OpenFOAM](http://openfoam.org/)ですが、このたびsimFlowから[RapidCFD](https://sim-flow.com/rapid-cfd-gpu/)というGPGPU版が出ました。

というわけでそれを手元で試した時の方法などをメモがてら書いておきます。
※私はOpenFOAMもAWSも専門家じゃないので、やり方間違ってたりするかもしれませんし、実はなにか壊してるかもしれないのでその辺りはご注意ください。

なお、試した環境は以下の通りです

* OS: Fedora21 3.19.7-200.fc21.x86_64
* CPU: Intel Corei7 920
* GPU: GeForce GTX 680
* RAM: 12GB (TS1333KLU-6GK x3 + TS1333KLU-6GK x3)

## CUDA SDKをインストールする

とりあえず[CUDA SDKをダウンロード](https://developer.nvidia.com/cuda-downloads)インストールしたいのですが、これを書いてる時点ではFedoraは"Coming Soon"になっていて、提供されていません・・・。
と思うかもしれませんが、実はRunfile Installerはどれもほとんど同じなので、適当にRHELのを持ってきても使えます。
*.runをダウンロードしたら、[Getting Started Guide](http://developer.download.nvidia.com/compute/cuda/7_0/Prod/doc/CUDA_Getting_Started_Linux.pdf)に従ってインストールしてください。

私がつまづいたのは、普通に``yum install kernel-devel``すると、自分のカーネルと違うバージョンが入ったりするので、いつものごとく``uname -r``で確認して[kojipgks](https://kojipkgs.fedoraproject.org/packages/kernel/)からrpmを落として自力でインストールしてください。既に新しいのが入っている場合は、一度新しいのを削除するか、バージョン違いオプションを付けて入れる必要があります。

PATHとLD_LIBRARY_PATHを通したら完了です。

## RapidCFDをダウンロード＆ビルドする

0. OpenFOAMの時と同じように、以下の必要なパッケージをyumとかでインストールします。
    * gcc
    * openmpi, openmpi-devel
    * qtwebkit, qtwebkit-devel
    * CGAL, CGAL-devel
0. ${HOME}にRapidCFDというディレクトリを作ります。OpenFOAMの場合のrootディレクトリに相当するものです。
0. ${HOME}/RapidCFDに、RapidCFDをダウンロードします。[Githubのレポジトリ](https://github.com/Atizar/RapidCFD-dev)から持ってくるのが手っ取り早いと思います。${HOME}/RapidCFD/Rapid-devという形にして下さい。
0. 同様に、[ThirdParty-devも持ってきます](http://sourceforge.net/projects/rapidcfd/files/ThirdParty/ThirdParty-dev.zip/download)。${HOME}/RapidCFD/ThirdParty-devという形にして下さい。
    * ちなみにこれ、最初はなくて、[その後にくれって言ったらくれた](https://github.com/Atizar/RapidCFD-dev/issues/2)ものです。
    * なので、最初に試した時はOpenFOAM-2.3.1用のThirdParty-2.3.1を試して動かしてました。もし先のsourceforgeにあるやつが動かなかったら、そっちを試しても動くと思います。
0. source ${HOME}/RapidCFD/RapidCFD-dev/etc/bashrcして環境変数を設定します
0. cd ${HOME}/RapidCFD/Rapid-dev && ./Allwmakeでビルドします。OpenFOAMと同様、``export WM_NCOMPPROCS=<並列数>``で並列ビルドできますが、nvccを使っているのでかなり時間がかかります。以下注意点です。
    * [Githubのwiki](https://github.com/Atizar/RapidCFD-dev/wiki/Install)にこそっと書いてあるのですが、CUDA SDKを修正する必要があります（OpenFOAMとstdの関数名がぶつかるらしいです・・・。using namespaceするやつはほんと滅びればいい）。通常だと/usr/local/cuda/include/math_functions.hにある関数に、そこに示されているパッチをあてます。なお、CUDA SDK 7.0の場合は、math_functions.hppにあてなければならないので注意してください。
    * もしかするとThirdParty-devのビルド中にscotchのビルドに失敗するかもしれません（というか私はしました）。原因はThirdParty-devの中のAllwmakeの5291行目ぐらいに``if settings=$WM_PROJECT_DIR/bin/foamEtcFile config/scotch.sh``というscotch.shの場所を取ってくる処理があるのですが、なぜかfoamEtcFileがうまくとってきれくれなかったりしました。ので、ここを``if settings=$WM_PROJECT_DIR/etc/config/scotch.sh``と直接指定したらなんとかなります。
0. 全部うまく行ったら、pimpleFoamなどが動くはずです。

[私の環境でのビルド済みバイナリ](https://drive.google.com/folderview?id=0B12aBSkB3z8JfldNT2cwNzhkUmMtenJlQ0RUYWw5OXF6dkFENzRBM0x3WmxMR3E0eFFhZzQ&usp=sharing.)も一応置いておきます。
普通のx86_64のFedora21だったら（かつ、カーネルのバージョンも合わせたら）そのままコピーで動くと思います。

後述のAWSを使う場合など、ビルド時間のお金がもったいない場合にご利用ください。

## RapidCFDを試す

動かしてみるのはチュートリアルでもなんでもいいのですが、せっかくなので他の人と性能など比べてみたいので[オープンCAE学会のV&V委員会が使っている条件:channelReTau110](https://github.com/opencae/VandV/tree/master/OpenFOAM/OpenFOAM-BenchmarkTest/channelReTau110)を試してみます。

普通の使い方はREADMEに書いてあるとおりです。

0. 先のレポジトリをダウンロードします。git cloneするのが簡単じゃないですかね・・・。
0. ``cd OpenFOAM/OpenFOAM-BenchmarkTest/channelReTau110``
0. とりあえず動かすだけならバッチを使わないので、NoBatchをそのまま使います。``cd NoBatch``または``cp -r NoBatch <好きな名前>``して、好きな名前のディレクトリで作業してください。
0. 何も考えずにその作業ディレクトリで``../bin/benchmark.sh``すると計算が開始されます。
0. 全部終わったら``../bin/table.sh``するとtable.csvというファイルが出来ます。色々書いてありますが、最後の方に実行時間があります。
0. ``../bin/plot.py``すると実行時間のグラフがplot.pdfに出てきます。私の場合は``yum install python-matplotlib``が必要でした。
0. 実行環境などを添えて結果をV&V委員会に送ってあげると喜んでくれるかもしれません（どうやって送るのがいいんだろう・・・issueかpull reqかな）
0. 参考までに[私の実行結果](https://bitbucket.org/aokomoriuta/openfoam-result)を貼っておくので、見比べてみると面白いかもしれません（というか結果教えてください）。

とさも簡単にできそうに書きましたが、実は普通のOpenFOAMと違って、存在しないfunctionや前処理があったりするので、実際にbenchmark.shを実行前に以下の修正が必要だったりします（c.f. [@_masazさん情報1](https://twitter.com/_masaz/status/601654391809052672)、[@_masazさん情報2](https://twitter.com/_masaz/status/601639803784826880))。

* fieldAverage1が動かないのでコメントアウトして、存在しない前処理方法もコメントアウトします（[こんな感じ](https://github.com/aokomoriuta/VandV/commit/8457fa216b19882fa91255e30317c2586043f5b5)）。[修正済みのブランチ](https://github.com/aokomoriuta/VandV/tree/for_rapidcfd)も作ってみたので良ければどうぞ。
* また、blockMeshなどがありません。そのため少々手順が必要です（c.f. [@_masazさん情報](https://twitter.com/_masaz/status/601639803784826880))
    1. RapidCFDとは別に、普通のOpenFOAMもインストールしてchannelReTau110を一度実行してみます（CPUとの比較ためにやってみた結果でよいです）
    1. 結果は作業ディレクトリのn_0008の下に出てくるので、それをRapidCFD用の作業ディレクトリにコピーします。
    1. ``n_00008/mpi_*/simulationType*``を消します。
    1. ここで改めて先の手順通り../bin/benchmark.shをすると、OpenFOAMで作ったメッシュで計算をすることができます。

これでようやくRapidCFDを動かすことができました！！

## AWSのGPUインスタンスを使う場合

手元にGPUなんてないよ！という方は、AWSのGPUインスタンスを使うことができます。

0. 普通にAWSのインスタンス作成画面に入ります。
0. 先となるべく環境を合わせるため、Fedora21のCloudを使います。また、HVMじゃないとGPUインスタンスは動かないのでそっちを選択します。ということで、コミュニティAMIのami-c0935cc0を選びました。
0. ストレージの容量は既定の6[GB]では全然足りないので100[GB]ぐらいにしておきます。
0. 作成したらsshでつなぎます（Windowsからだと、.pemをダウンロードして、PuTTYKeyGenで.pemをloadして.ppkを作ってPagentに入れて、ユーザー名fedoraでTeraTermでつなぐ、とかでつなげます）
0. ほんとに必要最低限以外なーんにも入ってないので、色々入れます
    * gccやOpenMPIなど、先述のRapidCFDのビルドに必要なパッケージ
    * git
    * make
    * bc
    * which（これがないとCUDA SDKのインストール時にgccがないって怒られて意味が分からない・・・ってなります）。
0. あとは、先述のようにCUDA SDKを入れて、RapidCFDをビルドして、実行できます。が、ビルド時間も課金されてもったいないので、先のビルド済みバイナリをコピーした方がいいと思います。