スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[OpenFOAM] GPU Linear Solver Library for OpenFOAM を Ubuntu 64bitでビルドする

以下の Symscape社のページをもとに、GPU Linear Solver Library for OpenFOAM のビルドを試みた。
http://www.symscape.com/gpu-openfoam

●記事修正
(2011/6/02) 動作確認の部分を書き換えました。

●環境

・OS          Ubuntu 10.10 64bit
・CUDAバージョン    4.0.13

●インストールの(私の)方針

インストール先ディレクトリは任意だが、今回は以下のディレクトリにインストールする。
・OpenFOAM   $HOME/OpenFOAM-cuda
         ← (一時的に)シンボリックリンク $HOME/OpenFOAM

・ofgpu     $HOME/OpenFOAM-cuda/ofgpu

●ダウンロードするファイルの保存先

$HOME/Downloads

●手順1【Symscape社のページの Preparationの4番目】
  必要なパッケージをインストール。

① 端末で以下を実行し、CMake等、必要なパッケージをインストール。

sudo apt-get install cmake g++ git-core flex


他にも必要かもしれない。
g++のバージョンは以下の通り。

$ g++ --version
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


●手順2【Symscape社のページの Preparationの1~2番目】
  CUDAをインストール。

入手先:http://developer.nvidia.com/cuda-toolkit-40
  最新バージョンのドライバとツールキットを入手した。

① インストール方法は他のサイトに詳しいので、概略だけ示す:
  端末で以下を実行。ただし、ドライバのインストールだけは gdmを停止して行う。

cd
sudo Downloads/devdriver_4.0_linux_64_270.40.run
sudo Downloads/cudatoolkit_4.0.13_linux_64_ubuntu10.10.run
sudo Downloads/cudatools_4.0.13_linux_64.run
Downloads/gpucomputingsdk_4.0.13_linux.run


②「$HOME/.bashrc」の最後に、以下の2行を追加。

#### CUDA
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64


端末でも以下を実行。

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64


③ CUDAの動作確認を行うため、「test.cu」を作成した。

#include <iostream>
#include <cstdlib>

__global__ void calc(double* answer, double lhs, double rhs)
{
*answer = lhs / rhs;
}

int main()
{
cudaError_t err;
double answer;
double* dev_answer;

err = cudaMalloc(&dev_answer, sizeof(double));
if (err != cudaSuccess) {
std::cerr << cudaGetErrorString(err) << std::endl;
return EXIT_FAILURE;
}
calc<<<1, 1>>>(dev_answer, 5.0, 2.0);
cudaMemcpy(&answer, dev_answer, sizeof(double), cudaMemcpyDeviceToHost);
std::cout << "answer = " << answer << std::endl;
cudaFree(dev_answer);
return 0;
}


以下を実行して、倍精度でコンパイルして動かしてみた。

nvcc -arch=sm_13 -o test test.cu
./test


「answer = 2.5」と表示されれば成功。

CUDAの動作確認として、「$HOME/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/deviceQuery」もコンパイル/実行してみると良いだろう。

●手順3【Symscape社のページの Preparationの3番目】
  Cusp(& Thrust)をインストール。

Cuspの入手先:http://code.google.com/p/cusp-library/
  最新バージョン「cusp-v0.1.2.zip」を入手した。
Thrustの入手先:http://code.google.com/p/thrust/

① 端末で以下を実行。古いバージョンの CUDAには Thrustが入っていないので、そのときは Thrustもインストールする(今回は不要)。

cd /usr/local/cuda/include
sudo unzip $HOME/Downloads/cusp-v0.1.2.zip
# sudo unzip $HOME/Downloads/thrust-1.4.0.zip # CUDA 4では不要


「/usr/local/cuda/include/cusp/」の下にヘッダファイルがコピーされれば、Cuspのインストール成功。

② Cuspの動作確認を行うため、「/usr/local/cuda/include/cusp/README」をもとに「version.cu」を作成した。

#include <thrust/version.h>
#include <cusp/version.h>
#include <iostream>

int main(void)
{
int thrust_major = THRUST_MAJOR_VERSION;
int thrust_minor = THRUST_MINOR_VERSION;

int cusp_major = CUSP_MAJOR_VERSION;
int cusp_minor = CUSP_MINOR_VERSION;

std::cout << "Thrust v" << thrust_major << "." << thrust_minor << std::endl;
std::cout << "Cusp v" << cusp_major << "." << cusp_minor << std::endl;

return 0;
}


以下を実行して、コンパイルして動かしてみた。

nvcc version.cu -o version
./version


以下のように表示された。

Thrust v1.4
Cusp v0.1



●手順4
  zlibをコンパイル/インストール。

入手先:http://zlib.net/
  最新バージョン「zlib-1.2.5.tar.gz」(ソース)を入手した。

① 端末で以下を実行。

cd
tar zxf Downloads/zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure
make
sudo make install


「/usr/local/include」の下に「zlib.h」がコピーされれば、インストール成功。

●手順5【Symscape社のページの Preparationの5番目】
  OpenFOAM 1.7.xの取得と、ThirdParty-1.7.1の展開

入手先:http://www.openfoam.com/download/source.php
  「ThirdParty-1.7.1.gtgz」(ソース)を入手した。

① 端末で以下を実行。

cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
mkdir OpenFOAM-cuda
ln -s OpenFOAM-cuda OpenFOAM # 一時的にシンボリックリンク
cd OpenFOAM
tar zxf $HOME/Downloads/ThirdParty-1.7.1.gtgz # ThirdParty-1.7.1を展開
mv ThirdParty-1.7.1 ThirdParty-1.7.x
git clone git://github.com/OpenCFD/OpenFOAM-1.7.x.git # OpenFOAM 1.7.xを取得
cd OpenFOAM-1.7.x
git checkout 14b79332ee4a1827656951db39fe81cc5ba52d78 # Symscape社のページで指定されている番号に巻き戻す


●手順6【Symscape社のページの手順1~3】
  ofgpu libraryをコンパイル/インストール。

入手先:http://www.symscape.com/gpu-openfoam
  「ofgpu-0_1.tgz」(ソース)を入手した。

① 端末で以下を実行。

cd $HOME/OpenFOAM
tar zxf $HOME/Downloads/ofgpu-0_1.tgz
cd ofgpu/src



② 倍精度でコンパイルする場合は、「ofgpu/CMakeLists.txt」をエディタで編集し、2行挿入する。

set(LIB_NAME ofgpu)

set(SRCS
pbicg.cu
pcg.cu
sparsematrixsystem.cu
)

cuda_add_library(${LIB_NAME} SHARED ${SRCS})

install(TARGETS ${LIB_NAME} DESTINATION ${OFGPU_INSTALL_DIR})

     ↓ 変更

set(LIB_NAME ofgpu)

set(SRCS
pbicg.cu
pcg.cu
sparsematrixsystem.cu
)

# 以下の2行を挿入
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -arch=sm_13)
add_definitions(-DOF_DOUBLE_PRECISION)

cuda_add_library(${LIB_NAME} SHARED ${SRCS})

install(TARGETS ${LIB_NAME} DESTINATION ${OFGPU_INSTALL_DIR})


③ 引き続き端末で以下を実行。

cmake -DCMAKE_INSTALL_PREFIX=`pwd`/../install
make
make install


「$HOME/OpenFOAM/ofgpu/install/lib」の下に「libofgpu.so」が生成されれば、インストール成功。

●手順7【Symscape社のページの手順4~5】
  GPU用に、OpenFOAMにパッチを当てる。

入手先:http://www.symscape.com/gpu-openfoam
  「v7-mingw-openfoam-1-7-x.patch.gz」を入手した。

① 端末で以下を実行して、OpenFOAMにパッチを当てる。

cd $HOME/OpenFOAM/OpenFOAM-1.7.x
gzip -dc $HOME/Downloads/v7-mingw-openfoam-1-7-x.patch.gz | patch -p0 -b


② 引き続き以下を実行して、シェルスクリプトに実行権限を付与する。

chmod ug+x src/gpu/Allwmake


●手順8【Symscape社のページの手順6】
  OpenFOAMをビルド。

① 単精度でコンパイルする場合は、「$HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc」をエディタで以下のように変更する。

: ${WM_PRECISION_OPTION:=DP}; export WM_PRECISION_OPTION
     ↓ 変更
: ${WM_PRECISION_OPTION:=SP}; export WM_PRECISION_OPTION


② 端末で以下を実行。

export WM_GPU='CUDA'
export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


③ 倍精度でコンパイルする場合は、「$WM_DIR/rules/linux64Gcc/c++Opt」をエディタで編集し、コンパイルオプションに「-DOF_DOUBLE_PRECISION」を追加する。

c++OPT = -O3
#c++OPT = -march=nocona -O3

     ↓ 変更

c++OPT = -O3 -DOF_DOUBLE_PRECISION
#c++OPT = -march=nocona -O3 -DOF_DOUBLE_PRECISION



④ このままビルドしたら以下のエラーが出た。

+ wmake decomposePar
~/OpenFOAM/OpenFOAM-1.7.x/lib/linux64GccDPOpt/libscotch.so: undefined reference to `SCOTCH_errorPrintW'
~/OpenFOAM/OpenFOAM-1.7.x/lib/linux64GccDPOpt/libscotch.so: undefined reference to `SCOTCH_errorPrint'
collect2: ld returned 1 exit status
make[1]: *** [~/OpenFOAM/OpenFOAM-1.7.x/applications/bin/linux64GccDPOpt/decomposePar] エラー 1


このエラーを回避するため、あらかじめ「$WM_PROJECT_DIR/src/decompositionMethods/scotchDecomp/Make/options」をエディタで編集し、「libscotcherrexit.so」をリンク先に加える。

LIB_LIBS = \
-ldecompositionMethods \
-lscotch

     ↓ 変更

LIB_LIBS = \
-ldecompositionMethods \
-lscotch -lscotcherrexit


⑤ ビルドを行う。ただし、パッチを当てた後の「Allwmake」を実行すると、以下のエラーが出た。

OPwrite.C:29:17: error: mpi.h: No such file or directory


そこで、パッチを当てる前の「Allwmake.orig」を実行。

cd $WM_PROJECT_DIR
chmod u+x applications/utilities/parallelProcessing/Allwmake # なぜか実行権限が付与されていなかった
./Allwmake.orig # 時間がかかる


⑥ コンパイルエラーが発生していないか確かめるために、以下を実行してエディタで a.txtを確認した。

./Allwmake.orig 2> a.txt


a.txtの中に、「error:」や「エラー」の文字は見当たらず、コンパイルは成功したようだ。

倍精度の場合は、「$WM_PROJECT_DIR/lib/linux64GccDPOpt/cuda/」と「$WM_PROJECT_DIR/lib/linux64GccDPOpt/gpuless/」の下に「libgpu.so」が生成されれば、コンパイル成功。

単精度の場合は、「$WM_PROJECT_DIR/lib/linux64GccSPOpt/cuda/」と「$WM_PROJECT_DIR/lib/linux64GccSPOpt/gpuless/」の下に「libgpu.so」が生成されれば、コンパイル成功。

⑦ チュートリアルをコピーしておいた。

mkdir -p $FOAM_RUN
cp -r $FOAM_TUTORIALS $FOAM_RUN


●後始末

① ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。

zlib-1.2.5


●動作確認【Symscape社のページの Example Case】
ケース入手先:http://www.symscape.com/gpu-openfoam
  「pitzDailyGpu.tgz」を入手した。

GPUを使って OpenFOAMを動かしてみた。

① 環境変数の設定。

GPUを使う場合は、端末を再起動後、以下を実行する。

export WM_GPU='CUDA'
export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


GPUを使わない場合は、端末を再起動後、以下を実行する。

source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc



② pitzDailyGpuケースの実施

格子点数が少ないときは、CPUの方が速かった。
格子点数を増やすと逆転して、GPUの方が速くなった。

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

カネダック

Author:カネダック
 
普通のC++プログラマですが、業務で流体解析をやっていて格子職人と呼ばれています。
J.S.バッハ等、古楽をピリオド楽器による演奏で聴くのが好き。
リュート演奏にあこがれつつ、クラシックギターを弾きます。

保有資格
・中小企業診断士
・Oracle Master 8 Platinum(今のGold相当)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。