lbm2d_openclのインテルVisual Fortranによるコンパイル
By K.Yoshimi
lbm2d_openclは、 格子ボルツマン法による流体計算を、OpenCLとModern Fortran(今どきのFortran)で実装しています。
この記事では、lbm2d_openclをインテルVisual Fortranでコンパイルし、テスト計算を行います。
テストした環境は
- Fortranコンパイラ:インテル(R) Parallel Studio XE 2019(Visual Studio 2017にバインド)
- OpenCL: CUDA Version 11.0.182に含まれるOpenCLライブラリ
です。
格子ボルツマン法
格子ボルツマン法(LBM: Lattice Boltzmann method)は、流体を格子上を並進・衝突する仮想粒子の集合体と仮定し、 格子上の粒子の速度分布関数について時間発展方程式を解く手法です。
格子ボルツマン法の計算は、他格子にある粒子の情報を必要とせず、局所的な計算から構成されているので、 GPUなどによる並列化に向いた手法といえます。
ソースコードの入手
lbm2d_openclのソースコードは、lbm2d_openclのホームぺージにあるzipファイルを ダウンロードするか、もしくは、下記のgitコマンドで入手します。
git clone --recursive https://github.com/LKedward/lbm2d_opencl.git
Focalライブラリの作成
lbm2d_openclをビルドするのに必要となるFocalライブラリを作成します。
Focalライブラリは、lbm2d_openclと同じ作者によるライブラリで、lbm2d_openclのソースコードに含まれています。
このライブラリは、OpenCL APIの全機能を維持しつつ、簡潔でアクセスしやすいFortranインターフェースを提供します。
Focalライブラリのプロジェクト作成
それでは、Focalライブラリを作成するVisual Studioのプロジェクトを作成しましょう。
Visual Studio 2017を起動し、
- File > 新規作成 > プロジェクト(P)…
から、「新しいプロジェクト」窓を開きます。
上図のように、「インテル(R) Visual Fortran」のツリーから、「ライブラリー」を選択し、さらに 「スタティック・ライブラリー」を選択します。
- 名前:focal
- 場所:D:\work\open_sources\build\lbm2d_opencl
を入力し、OKを押します(「場所」は、任意のパスを指定できますので、ご所望のパスを設定してください)。
次に、「ソリューション プラットフォーム」を下図のようにして、“x64"に変更します。
次に、lbm2d_openclのソースコードに含まれる
lbm2d_opencl/external/focal
の下にある
- srcフォルダ
- externalフォルダ
を、focalプロジェクト(focal.slnのあるフォルダ)の下にコピーします。
また、これに合わせて、ソリューションエクスプローラーにも、下図のようにフォルダを作成して、各フォルダ内に
- 右クリック > 追加 > 既存の項目(G)…
からソースコードを選択し、追加していきます。
Focalライブラリのビルド
最後に、ビルドします。
- ビルド > ソリューションのビルド
ビルドが無事に終了すると、
Releaseであれば
D:\work\open_sources\build\lbm2d_opencl\focal\x64\Release
Debugであれば
D:\work\open_sources\build\lbm2d_opencl\focal\x64\Debug
の下に
- focal.lib
が作成されますので、確認ください。
lbm2d_openclのコンパイル
それでは、lbm2d_openclのコンパイルをしましょう。
lbm2d_openclのプロジェクト作成
Focalライブラリが作成されましたら、lbm2d_openclのプロジェクトを作成します。
新たに、Visual Studio 2017を起動し
- File > 新規作成 > プロジェクト(P)…
から、「新しいプロジェクト」を開きます。
今度は、上図のように、「インテル(R) Visual Fortran」のツリーから、「コンソール・アプリケーション」、 「空のプロジェクト」を選択します。
- 名前:lbm2d_opencl
- 場所:D:\work\open_sources\build\lbm2d_opencl
を入力し、OKを押します(「場所」は、適宜、ご自分で指定したパスに読み替えてください)。
次に、「ソリューション プラットフォーム」をFocalプロジェクトの場合と同様にして、“x64"に変更します。
次に、ソースコードをlbm2d_opencl.slnのあるフォルダにコピーします。
- srcフォルダ
- external/ConfigLoaderフォルダ
- kernels.cl (格子ボルツマン法を実装したOpenCL Cカーネルコード)
- lbm.cfg (lbm2d_openclの設定ファイル)
続けて、ソリューションエクスプローラーも同様な、フォルダ構成にし、各フォルダ内に
- 右クリック > 追加 > 既存の項目(G)…
からソースコードを追加し、下図のようにします。
次に、「lbm2d_openclのプロパティ」の「追加のインクルード・ディレクトリ-」に
- focalライブラリのフォルダ(focalライブラリのモジュールを含むフォルダ)
- OpenCLのincludeフォルダ
を下図のように指定します。
ただし、「Program Files」のように、パスにスペースを含む場合は、ダブルコーテーションで囲むか、 短縮名を使用する必要がありますのでご注意ください。
続けて、リンカーの「追加の依存ファイル」には
-
focalライブラリのfocal.lib
D:\work\open_sources\build\lbm2d_opencl\focal\x64\Release\focal.lib -
OpenCLのOpenCL.lib
“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\lib\x64\OpenCL.lib”
を絶対パスで指定します。
lbm2d_openclのビルド
それでは、lbm2d_openclをビルドしましょう。
と、その前に、プログラムを少し修正します。
lbmocl.f90の下記の行(OpenCLのソースコード(kernels.cl)をロードする部分)
! Load and compile OpenCL sourcec
call fclGetKernelResource(programSource)
を
! Load and compile OpenCL sourcec
call fclSourceFromFile('kernels.cl', programSource)
に変更します。
それでは、ビルドしましょう。
- ビルド > ソリューションのビルド
テスト計算
lbm2d_openclのビルドで問題が無ければ、
- Ctrl + F5
でプログラムを実行します。計算が終了すると、以下のように出力されます。

計算時間は、時間ステップ数5000で、メッシュ数は16000ですが、GPUで計算しているのですぐに終わりました。
結果は、TecplotのBinary形式(Ascii形式でも出力可)で、指定した時間ステップ分だけ出力されます。
TecplotのBinary形式をサポートした可視化ツール(ANSYS EnSightやParaViewなど)で結果を描画します。
キャビティ流れの計算は上手くできているようですね。