スポンサーサイト

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

[OpenFOAM] Windowsで使う時、Windows版と仮想マシン上のLinux、どっちが良い?

11月のOpenFOAM勉強会@関東で、(スタンドアロンの)WindowsでOpenFOAMを使う時、(1)Windows版を用いるのが良いか、(2)ホスト型仮想マシン上のLinuxで動かすのが良いか、という話題が出ました。パフォーマンスは比較していないので、どちらが高いかわかりません。

物理マシン上のLinuxで動かすのに比べると、両者共にデメリットがあります。

●Windows版のデメリット
・git pullで最新にアップデートできない
・PyFoamが(まだ)動かない
・MSYS上でシェルスクリプトは使えるが、MSYSは使い勝手が悪い(と私は思った)

●Linux@仮想マシンのデメリット
・GPUが使えない
・仮想マシン製品によっては、使えるCPU数に上限がある(例:VMWare Playerは4CPUまで)

どちらを使うかは、ケースバイケースですね。
スポンサーサイト

Helyx-OSを動かしてみた

OpenFOAM勉強会@関東に刺激されて、ちょっとだけ Helyx-OSを動かしてみた。

Helyx-OSのインストール法:http://sourceforge.net/p/helyx-os/wiki/DownloadAndInstallation/

私が試した OSは 2つ。
・Ubuntu 10.04(DEXCS2011-OF20x64)
・CentOS 6.2(64bit)

インストール先は任意だが、今回は「/opt/OpenFOAM」の下にインストールする。

● Helyx-OSをダウンロード。
入手先:http://sourceforge.net/projects/helyx-os/

cd $HOME/Downloads
wget http://sourceforge.net/projects/helyx-os/files/20120721-engys-HelyxOS-100-linux-x64-JRE.tar.bz2
wget http://sourceforge.net/projects/helyx-os/files/20120721-engys-HelyxOS-100-src.tar.bz2


● プリコンパイル版を動かしてみる。

パッケージを展開。

cd /opt/OpenFOAM
tar xf $HOME/Downloads/20120721-engys-HelyxOS-100-linux-x64-JRE.tar.bz2


Helyx-OSを実行。

cd Engys/HelyxOS/v100
LANG=C ./helyxOS.sh


動いた。

もし以下のように「libmpi.so.0」がない旨のメッセージが出たら、

java.lang.UnsatisfiedLinkError: /opt/OpenFOAM/Engys/HelyxOS/v100/ext/libvtkHybridJava.so.5.10.0: libmpi.so.0: cannot open shared object file: No such file or directory
  at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807)
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1732)
  at java.lang.Runtime.loadLibrary0(Runtime.java:823)
  at java.lang.System.loadLibrary(System.java:1028)
  at eu.engys.helyx.vtk.VTKUtil.loadLibrary(VTKUtil.java:87)
  at eu.engys.helyx.vtk.VTKUtil.LoadAllNativeLibraries(VTKUtil.java:64)
  at eu.engys.helyx.gui.Launcher.main(Launcher.java:44)


以下のようにシンボリックリンクを作っておいて、再び「helyxOS.sh」を実行する。

ln -s $MPI_ARCH_PATH/lib/libmpi.so $MPI_ARCH_PATH/lib/libmpi.so.0


● ソースからビルドしてみる。

① Javaをインストール。

Helyx-OS内の Javaのバージョンを確認。

cd /opt/OpenFOAM/Engys/HelyxOS/v100
jre_linux_x64_VTK/bin/java -version


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

java version "1.6.0_32"
Java(TM) SE Runtime Environment (build 1.6.0_32-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.7-b02, mixed mode)


なるべくバージョンが近い Oracle JDKをインストールする。

Oracle JDKを入手。
入手先:http://www.oracle.com/technetwork/java/javase/downloads/jdk6-downloads-1637591.html
以下のファイルをブラウザでダウンロードした。保存先は「$HOME/Downloads」。

jdk-6u34-linux-x64.bin


今回はホームディレクトリの下でインストーラを起動。

chmod u+x $HOME/Downloads/jdk-6u34-linux-x64.bin
cd
$HOME/Downloads/jdk-6u34-linux-x64.bin


「$HOME/jdk1.6.0_34」の下にインストールされた。

② antがなければインストール。

# Ubuntu
sudo apt-get install ant1.8

# CentOS
sudo yum install ant


antのバージョン確認

ant -version


③ Helyx-OSのソースパッケージを、プリコンパイルパッケージと同じ場所で展開。

cd /opt/OpenFOAM
tar xf $HOME/Downloads/20120721-engys-HelyxOS-100-src.tar.bz2


④ ビルド。
 環境変数 JAVA_HOMEに、自分がインストールした Oracle JDKの場所を指定して antを実行する。

cd Engys/HelyxOS/v100
JAVA_HOME=$HOME/jdk1.6.0_34 ant -buildfile build_src.xml


以下のエラーが出た。

Buildfile: /opt/OpenFOAM/Engys/HelyxOS/v100/build_src.xml

init:
  [mkdir] Created dir: /opt/OpenFOAM/Engys/HelyxOS/v100/build

compile:
  [javac] Compiling 212 source files to /opt/OpenFOAM/Engys/HelyxOS/v100/build
  [javac] /opt/OpenFOAM/Engys/HelyxOS/v100/src/eu/engys/helyx/gui/AboutWindow.java:53: この文字は、エンコーディング UTF8 にマップできません。
  [javac]   //private static final String DISCLAIMER = "HELYX is not approved or endorsed by SGI Corp., owner of the OPENFOAM? trademark";
  [javac]                                                            ^
  [javac] /opt/OpenFOAM/Engys/HelyxOS/v100/src/eu/engys/helyx/gui/AboutWindow.java:54: この文字は、エンコーディング UTF8 にマップできません。
  [javac]   private static final String COPYRIGHT = "Copyright ? Engys Ltd 2012. All rights reserved.";
  [javac]                             ^
  [javac] エラー 2 個

BUILD FAILED
/opt/OpenFOAM/Engys/HelyxOS/v100/build_src.xml:34: Compile failed; see the compiler error output for details.

Total time: 1 second


nkfを使って、ソースコードを UTF8に変換する。まず、nkfがなければインストール。

# Ubuntu
sudo apt-get install nkf

# CentOS
sudo yum install nkf


現在のエンコードを確かめる。

nkf -g /opt/OpenFOAM/Engys/HelyxOS/v100/src/eu/engys/helyx/gui/AboutWindow.java


「Shift_JIS」と表示された。

UTF8に変換。

nkf -w --overwrite /opt/OpenFOAM/Engys/HelyxOS/v100/src/eu/engys/helyx/gui/AboutWindow.java
nkf -g /opt/OpenFOAM/Engys/HelyxOS/v100/src/eu/engys/helyx/gui/AboutWindow.java


「UTF-8」と表示された。

再びビルド。

JAVA_HOME=$HOME/jdk1.6.0_34 ant -buildfile build_src.xml


成功。

⑤ Helyx-OSを実行してみる。
「helyxOS.sh」を起動しても良いと思うが、自分で javaコマンドを使って動かしてみた。
 Helyx-OS内の Javaを使う。

jre_linux_x64_VTK/bin/java -jar lib/HelyxOS.jar


GUIは起動するが、右上に「Error loading VTK librares」と表示されて、レンダリングが失敗した。
端末には以下のエラーメッセージが表示されていた。

java.lang.UnsatisfiedLinkError: no vtkCommonJava in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
  at java.lang.Runtime.loadLibrary0(Runtime.java:823)
  at java.lang.System.loadLibrary(System.java:1028)
  at eu.engys.helyx.vtk.VTKUtil.loadLibrary(VTKUtil.java:87)
  at eu.engys.helyx.vtk.VTKUtil.LoadAllNativeLibraries(VTKUtil.java:60)
  at eu.engys.helyx.gui.Launcher.main(Launcher.java:44)


必要な LD_LIBRARY_PATHが通っていないのが原因。

これならどうだ。

LD_LIBRARY_PATH=/opt/OpenFOAM/Engys/HelyxOS/v100/ext:/opt/OpenFOAM/Engys/HelyxOS/v100/jre_linux_x64_VTK/lib/amd64/xawt:${LD_LIBRARY_PATH} jre_linux_x64_VTK/bin/java -jar lib/HelyxOS.jar


動いた。

[OpenFOAM] OpenFOAM 1.7.x on Windows 64bit(MS-MPI対応、GPU対応) を Ubuntu 64bitでクロスコンパイル(Symscape社の方法)

以下の Symscape社のページをもとに、「OpenFOAM on Windows(64bit)」のビルドを試みた。ofgpu(GPU Linear Solver Library for OpenFOAM)もリンクし、MS-MPIと GPUの両方に対応させた。
http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi
http://www.symscape.com/gpu-openfoam

ofgpuの現バージョン(0.1)では、MPIと GPUを同時に使うことはできないようだ(どちらかを選択する必要がある)。

ビルド作業は、NVIDIAの GPUが未搭載のマシンでも行うことができる。
バイナリの実行は、NVIDIAの GPUが未搭載のマシンでも、MPIを使った計算は可能である。

●環境

・ビルドに使用したOS     Windows 7 64bit、Ubuntu 10.10 64bit
・バイナリを試したOS     Windows 7 64bit
・CUDAバージョン       4.0.17

●OpenFOAMのディレクトリ

Linux側でビルドするとき、以下のディレクトリで作業することにした。
・OpenFOAM   $HOME/OpenFOAM-win-symscape
         ← (一時的に)シンボリックリンク $HOME/OpenFOAM

・ofgpu     $HOME/OpenFOAM-win-symscape/ofgpu

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

$HOME/Downloads

●手順1:(Windows側)コンパイラをインストール

Microsoft Visual Studioを使用して、ofgpu(GPU Linear Solver Library for OpenFOAM)を 64ビットでコンパイルする必要がある。製品版(Visual Studio 2010 Professional)と無償版(Visual Studio 2008 Express)の両方でコンパイルを試し、どちらも成功した。無償版は最新バージョンの Visual Studio 2010 Expressも試したが、これは失敗した。

デフォルトでは、無償版(Visual Studio 2008 Express)は 64ビットのコンパイルに対応していないようだ。そこで、以下の作業を行って 64ビットに対応させた。ただし、マイクロソフト公認の方法ではなさそうなので、自己責任でお願いします。

無償版を 64ビットコンパイルに対応させる方法:
http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/
  「VCE64BIT_WIN7SDK.zip」をダウンロードし、この中の readme.txtに従って以下を実行。
  この zipファイルは、④レジストリの設定でも使用する。

① Visual Studio製品や Window SDKがインストールされていないマシンで、Visual Studio 2008 Expressをインストール
入手先:http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/offline.aspx
  「VS2008ExpressWithSP1JPNX1504866.iso」を入手してインストールする(CD-Rに焼くか、VirtualCloneDrive等の仮想ドライブソフトでマウント)。
  インストール先はデフォルトのままにする。

②「Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1」をインストール
入手先:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=71DEB800-C591-4F97-A900-BEA146E4FAE1
  64ビット版の SDK「GRMSDKX_EN_DVD.iso」を入手してインストール。
  インストール先はデフォルトのままにする。

③ 以下を実行して、使用する Windows SDKを v7.0に設定

「スタートメニュー」
→「すべてのプログラム」
→「Microsoft Windows SDK v7.0」
→「Visual Studio Registration」
→「Windows SDK Configuration Tool」を起動。

「Installed Windows SDK」の「v7.0」を選択し、「Make Current」ボタンを押す。


④ レジストリを設定

「VCE64BIT_WIN7SDK.zip」の中の「setup_x64.bat」を、コマンドプロンプトで実行。
事前にレジストリをバックアップしておくと良いだろう。

⑤ 64ビットコンパイル用の環境設定バッチファイルを作成

コマンドプロンプトで以下を実行して、「C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars64.bat」を、「C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvarsamd64.bat」にリネームコピーする。

copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat" "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat"


⑥ コマンドプロンプトで 64ビットのプログラムをコンパイルするには

まず、Windows 7でスタートメニューに「ファイル名を指定して実行」がない場合は、以下のようにして表示させておく。

「スタートメニュー」を右クリック
→「プロパティ」
→ [スタートメニュー]タブ
→「カスタマイズ」
→ "[ファイル名を指定して実行]コマンド"をチェック
→ OKボタンを押す


「ファイル名を指定して実行」で以下を入力して、「Visual Studio x64 Win64 コマンド プロンプト (2008) 」を起動できる。

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" amd64


コマンドプロンプトが起動して「Setting environment for using Microsoft Visual Studio 2008 x64 tools.」と表示されれば、起動成功。
「cl.exe」を使って 64ビットのプログラムを生成できる。

●手順2:(Windows側)CUDAをインストール
入手先:http://developer.nvidia.com/cuda-downloads
  最新バージョン(4.0.17)のドライバとツールキットを入手した。

① インストール方法は他のサイトに詳しいので、概略だけ示す:

NVIDIAの GPU搭載マシンの場合、以下を順にインストール。
Parallel Nsightのインストールでは「Custom」を選択し、CUDA Toolkit v3.2をインストールしないようにした(インストールすると環境変数が v3.2用に書き換えられてしまうので)。

devdriver_4.0_winvista-win7_64_270.81_general.exe
cudatoolkit_4.0.17_win_64.msi
cudatools_4.0.17_win_64.msi
gpucomputingsdk_4.0.17_win_64.exe
Parallel_Nsight_Win64_2.0.11140.msi


NVIDIAの GPUが未搭載でも、OpenFOAMのビルドと MPI実行は可能である(GPU実行だけ不可能)。
その場合は、CUDAツールキットだけインストールすれば良い。

cudatoolkit_4.0.17_win_64.msi


② CUDAプログラムを 64ビットでコンパイルできるか確認するため、「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;
}


コンパイルするには、スタートメニューから「Visual Studio x64 Win64 コマンド プロンプト」を起動する。
無償版コンパイラ(Visual Studio 2008 Express)を使用する場合の起動法は、手順1⑥に書かれている。
以下を実行して、倍精度でコンパイル。

nvcc -arch=sm_13 -o test test.cu


「test.exe」が生成されれば、コンパイル成功。
NVIDIAの GPU搭載マシンがあれば、動かしてみて「answer = 2.5」と表示されれば成功。

「test.exe」が 64ビットでコンパイルされたか確かめるには、以下を実行する。

dumpbin /headers test.exe | findstr machine


「(x64)」と表示され、64ビットであることが確認できた。
もし32ビットなら「(x86)」と表示される。

●手順3:(Windows側)Cusp(sparse linear algebra library)をインストール
入手先:http://code.google.com/p/cusp-library/
  少し古いバージョン「cusp-v0.1.2.zip」を入手した。最新バージョン「cusp-v0.2.0.zip」ではビルドに失敗した。

① Cuspを展開

ちょっと行儀が悪いかもしれないが、以下のディレクトリの下で「cusp-v0.1.2.zip」を解凍した。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include


「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\cusp」の下にヘッダファイルが展開された。

② 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.exe


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

Thrust v1.4
Cusp v0.1


●手順4:(Windows側)CMakeをインストール
入手先:http://www.cmake.org/cmake/resources/software.html
  最新バージョン「cmake-2.8.4-win32-x86.exe」を入手して実行。

インストール途中の画面で、「Add CMake to the system PATH for current user」を選択して、CMakeに PATHを通させた。

●手順5:(Windows側)ofgpuをコンパイル
入手先:http://www.symscape.com/gpu-openfoam
  「ofgpu-0_1.tgz」を入手した。

①「ofgpu-0_1.tgz」を解凍

解凍場所は任意だが、今回は「C:\Users\Public」の下で解凍した。

② 倍精度でコンパイルする場合は、「C:\Users\Public\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を実行

コマンドプロンプトで以下を実行して、ディレクトリ移動。

C:
cd C:\Users\Public\ofgpu\src


製品版コンパイラ(Visual Studio 2010)を使う場合は、以下を実行。

cmake -G "Visual Studio 10 Win64" .


無償版コンパイラ(Visual Studio 2008 Express)を使う場合は、以下を実行。

cmake -G "Visual Studio 9 2008 Win64" .


④ スタートメニューから Visual Studioを起動し、以下を行う。

・「C:\Users\Public\ofgpu\src\ofgpu.sln」を開く
・Debug → Releaseに変更
・ターゲットが x64になっていることを確認
・ソリューションのビルド(F7)


以下のメッセージが表示され、ビルドに失敗したように見えたが、

プロジェクトはこのソリューション構成に対してビルドするように選択されていません。


「C:\Users\Public\ofgpu\src\ofgpu\Release」の下に「ofgpu.dll」と「ofgpu.lib」が生成されれば、コンパイル成功。
この2つのファイルを、Linux側でも使用する。

●手順6:MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)のコンパイル/インストール

① 下記のページの手順を、順に実行する。既に実行済みであれば、飛ばしてよい。

ただし、下記の記事を書いた時から各ソフトがバージョンアップしていたので、今回は新しいバージョンをインストールした。
・クロスコンパイラのバージョン
   バージョン: gcc-4.5.3
   インストール先: /opt/mingw-4.5.3
・mingw-w64 toolchainのバージョン
   ダウンロードしたファイル: mingw-w64-v1.0-snapshot-20110523.tar.bz2

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その1)

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)


●手順7:(Linux側)パッケージのインストールと環境変数の設定

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

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


他にも必要かもしれない。
インストールされた 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.


③ gmp、mpfr、mpc のインストール先が「/usr/local」の場合は、作業する端末で以下を実行(クロスコンパイラの実行に必要)。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


●手順8:(Linux側)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


② クロスコンパイラ用にコンパイル/インストール。

make -f win32/Makefile.gcc PREFIX='x86_64-w64-mingw32-'
sudo cp zconf.h /opt/mingw-4.5.3/x86_64-w64-mingw32/include
sudo cp zlib.h /opt/mingw-4.5.3/x86_64-w64-mingw32/include
sudo cp zlib1.dll /opt/mingw-4.5.3/bin
sudo cp libz.a /opt/mingw-4.5.3/x86_64-w64-mingw32/lib
sudo cp libzdll.a /opt/mingw-4.5.3/x86_64-w64-mingw32/lib


③ コンパイル結果を消去。

make -f win32/Makefile.gcc clean


④ ネイティブ Linux用にコンパイル/インストール。

./configure
make
sudo make install


「/usr/local/include」の下に「zlib.h」がコピーされれば成功。

●手順9:(Linux側)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-win-symscape
ln -s OpenFOAM-win-symscape 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社のページで指定されている番号に巻き戻す


●手順10:(Linux側)「libofgpu.a」を作成
入手先:http://www.symscape.com/gpu-openfoam
  「ofgpu-0_1.tgz」を入手した(手順5と同じファイル)。

① 端末で以下を実行。

cd $HOME/OpenFOAM
tar zxf $HOME/Downloads/ofgpu-0_1.tgz
mkdir -p ofgpu/install/win/lib
cd ofgpu/install/win/lib


② 手順5で作成した「ofgpu.dll」と「ofgpu.lib」を、Linuxのカレントディレクトリにコピーする。

③ 端末で以下を実行。

gendef ofgpu.dll
x86_64-w64-mingw32-dlltool -d ofgpu.def -l libofgpu.a -D ofgpu.dll


「libofgpu.a」が生成されれば作業成功。

●手順11:(Linux側)クロスコンパイル用に、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


●手順12:(Linux側)ソースコードの修正

クロスコンパイラのバージョンによっては、この手順は不要かもしれない。私の環境では、この手順を行わずにビルドすると、コンパイルは通るが、Windows環境で decomposeParやソルバが動かなかった(実行時エラー)。これを回避するため、以下のソースコード修正を行った。この修正により Windows環境で動くようになったが、その理由はよくわからない。

① 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H

エディタで「addValidParOptions」を検索して、

static void addValidParOptions(HashTable<string>& validParOptions);

        ↓ 変更

#if 0
static void addValidParOptions(HashTable<string>& validParOptions);
#else
static bool addValidParOptions();
#endif


② 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/dummy/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}
#else
bool Foam::Pstream::addValidParOptions()
{
return false;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/mpi/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#else
bool Foam::Pstream::addValidParOptions()
{
return true;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/global/argList/argList.C

エディタで「addValidParOptions」を検索して、

Pstream::addValidParOptions(validParOptions);

        ↓ 変更

#if 0
Pstream::addValidParOptions(validParOptions);
#else
if (Pstream::addValidParOptions()) {
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#endif


●手順13:(Linux側)ビルド設定(単精度の場合のみ)

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

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


●手順14:(Linux側)「ThirdParty-1.7.x」の中の「openmpi」と「scotch」を、Linux用にコンパイル

① 端末で以下を実行し、Linux用に環境変数を設定。

export MPI_ARCH_PATH=$HOME/OpenFOAM/ThirdParty-1.7.x/platforms/linux64Gcc/openmpi-1.4.1
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


② 引き続き以下を実行し、openmpiと scotchをコンパイルするためのスクリプト「Subwmake」(名前は何でもよい)を作成。

cd $WM_THIRD_PARTY_DIR
cp Allwmake Subwmake


Subwmakeをエディタで編集し、以下に示す 'if [ -d "$MPI_ARCH_PATH" ]' より下の行を全て削除。

(以下削除)
if [ -d "$MPI_ARCH_PATH" ]
then
echo "========================================"
echo "Build PTScotch decomposition library (requires MPI)"
(後略)


③ 端末で以下を実行して、openmpiと scotchをコンパイル。

./Subwmake


「$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch」の下に「libscotch.so」が生成されれば、コンパイル成功。

●手順15:(Linux側)OpenFOAMをビルドするためのツールを、Linux用にビルド

① 端末で以下を実行。

cd $WM_DIR/src
make
cd $WM_DIR/bin
ln -s linux64Gcc linux64mingw-w64


「$WM_DIR/bin/linux64mingw-w64」の下に「dirToString」と「wmkdep」が生成されれば、コンパイル成功。

●手順16:(Linux側)クロスコンパイル用に各種設定

① 端末で以下を実行して、CUDAコンパイル用に環境変数を設定する。

export WM_GPU='CUDA'
export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu


② 端末で以下を実行して、クロスコンパイル用に環境変数を設定する。

export FOAM_INST_DIR="$HOME/OpenFOAM"
export WM_OSTYPE=MSwindows
export WM_COMPILER=mingw-w64
export WM_ARCH_OPTION=64
export WM_CC='x86_64-w64-mingw32-gcc'
export WM_CXX='x86_64-w64-mingw32-g++'
export compilerInstall=system
export WM_MPLIB='MSMPI'
export MPI_ARCH_PATH="/opt/msmpi"
source "$FOAM_INST_DIR/OpenFOAM-1.7.x/etc/bashrc"


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

c++OPT = -O3 -DNDEBUG

     ↓ 変更

c++OPT = -O3 -DNDEBUG -DOF_DOUBLE_PRECISION


●手順17:(Linux側)「ThirdParty-1.7.x」の中の「scotch」を、Windows用にクロスコンパイル

① 端末で以下を実行。

cd $WM_THIRD_PARTY_DIR/scotch_5.1/src
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/Make.inc/* Make.inc/.
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/libscotch/* libscotch/.
unlink Makefile.inc
ln -s Make.inc/Makefile.inc.mingw-w64 Makefile.inc
cd libscotch
make clean
make


「libscotch.a」と「libscotch.dll」が生成されれば、コンパイル成功。

② 手順14と手順17のコンパイル結果を、然るべき場所に転送。

mkdir -p $FOAM_LIBBIN
cp libscotch.* $FOAM_LIBBIN


●手順18:(Linux側)OpenFOAMをビルド

① 端末で以下を実行。

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


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

./Allwmake 2> a.txt


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

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

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


④ pitzDailyGpuケースも解凍しておいた。
入手先:http://www.symscape.com/gpu-openfoam

run
tar zxf $HOME/Downloads/pitzDailyGpu.tgz


●手順19:(Linux側)DLLをコピー

Windows側で必要になる DLLを、「$HOME/OpenFOAM/bin」にコピーすることにした。

① 端末で以下を実行して、MinGW-w64のランタイム DLLをコピー。

cd $WM_PROJECT_INST_DIR
mkdir bin
cd bin
cp /opt/mingw-4.5.3/bin/*.dll .


② 以下を実行して、GPU用の DLLをコピー。

cp $WM_PROJECT_INST_DIR/ofgpu/install/win/lib/ofgpu.dll .


●手順20:(Linux側)ビルド結果を圧縮

① 端末で以下を実行して、ビルド結果をソースごと圧縮した。

cd
zip -r OpenFOAM-win-symscape.zip OpenFOAM-win-symscape


この zipファイルを Windows側に転送した。

●後始末(Linux側)

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

zlib-1.2.5


② ホームディレクトリの下の、一時的なシンボリックリンク「OpenFOAM」を消去した。

cd
unlink OpenFOAM


●手順21(Windows側):OpenFOAMと ParaViewのインストール

① 手順20で作成した「OpenFOAM-win-symscape.zip」を、Windows側で解凍。
  今回は Eドライブ直下で解凍した。

② ParaViewをインストール。
入手先:http://www.paraview.org/

  最新バージョンの Release 3.10.1 をインストールした。

●手順22:(Windows側)コマンドプロンプトで動作確認

① コマンドプロンプトで以下を実行し、環境変数を設定。

set WM_PROJECT_DIR=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x
set PATH=C:\Program Files (x86)\ParaView 3.10.1\bin;%PATH%
set PATH=E:\OpenFOAM-win-symscape\bin;%PATH%
set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\applications\bin\linux64mingw-w64DPOpt;%PATH%
set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt;%PATH%


MPIを使用する場合は、以下も実行。

set MPI_BUFFER_SIZE=20000000
set PATH=C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin;%PATH%
set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\msmpi;%PATH%
set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\gpuless;%PATH%


GPUを使用する場合は、以下も実行。

set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\dummy;%PATH%
set PATH=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\cuda;%PATH%


現バージョンでは MPIと GPUは同時使用できないので、どちらかを選んで設定する。
MPIと GPUの使用を切り替えるときは、コマンドプロンプトを再起動して環境変数を設定し直す。

② 以下を実行して作業ディレクトリに移動し、動作確認用にチュートリアルをコピー。

E:
cd E:\OpenFOAM-win-symscape\usrname-1.7.x\run
rd /s /q pitzDaily_test
xcopy /E pitzDailyGpu pitzDaily_test\
cd pitzDaily_test


xcopyコマンドは「C:\Windows\System32」にあった。

③ チュートリアルを動かしてみた。

MPIを使用する場合:

copy E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials\multiphase\interFoam\laminar\damBreak\system\decomposeParDict system
blockMesh
decomposePar
mpiexec -n 4 simpleFoam.exe -parallel
reconstructPar
echo.>case.foam
start paraview.exe --data="case.foam"


GPUを使用する場合:

blockMesh
simpleFoam.exe
echo.>case.foam
start paraview.exe --data="case.foam"


動いた。

●手順23:(Windows側)MSYSで動作確認

「$WM_PROJECT_DIR/bin」にあるシェルスクリプトは Windowsコマンドプロンプトでは動かないので、MSYSで試してみた。

① MSYSを起動して以下を実行し、環境変数を設定。

export WM_PROJECT_DIR=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x
export PATH=/c/Program\ Files\ \(x86\)/ParaView\ 3.10.1/bin:$PATH
export PATH=/e/OpenFOAM-win-symscape/bin:$PATH
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/applications/bin/linux64mingw-w64DPOpt:$PATH
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/lib/linux64mingw-w64DPOpt:$PATH

# foamシェルスクリプト
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/bin:$PATH

# pyFoamは動かなかったのでコメントアウト
#export PATH=/c/opt/Python2.7.1:/c/opt/Python2.7.1/Scripts:/c/opt/Python2.7.1/Lib/site-packages:$PATH


MPIを使用する場合は、以下も実行。

export MPI_BUFFER_SIZE=20000000
export PATH=/c/Program\ Files/Microsoft\ HPC\ Pack\ 2008\ SDK/Bin:$PATH
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/lib/linux64mingw-w64DPOpt/msmpi:$PATH
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/lib/linux64mingw-w64DPOpt/gpuless:$PATH


GPUを使用する場合は、以下も実行。

export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/lib/linux64mingw-w64DPOpt/dummy:$PATH
export PATH=/e/OpenFOAM-win-symscape/OpenFOAM-1.7.x/lib/linux64mingw-w64DPOpt/cuda:$PATH


現バージョンでは MPIと GPUは同時使用できないので、どちらかを選んで設定する。
MPIと GPUの使用を切り替えるときは、MSYSを再起動して環境変数を設定し直す。

② 以下を実行して、動作確認用にチュートリアルをホームディレクトリにコピー。

cd
rm -rf pitzDaily_test
cp -r /e/OpenFOAM-win-symscape/usrname-1.7.x/run/pitzDailyGpu pitzDaily_test
cd pitzDaily_test


③ チュートリアルを動かしてみた。

MPIを使用する場合:

cp /e/OpenFOAM-win-symscape/usrname-1.7.x/run/tutorials/multiphase/interFoam/laminar/damBreak/system/decomposeParDict system
blockMesh
decomposePar
mpiexec -n 4 simpleFoam.exe -parallel
reconstructPar
touch case.foam
start paraview.exe --data="case.foam"


GPUを使用する場合:

blockMesh
simpleFoam.exe
touch case.foam
start paraview.exe --data="case.foam"


動いた。

④ シェルスクリプトを動かしてみた。

#pyFoamClearCase.py . # pyFoamは動かなかった
foamCleanTutorials


foamCleanTutorialsは動くようだ。

[OpenFOAM] OpenFOAM 1.7.x on Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(Symscape社の方法)

以下の Symscape社のページをもとに、「OpenFOAM on Windows(64bit)」のビルドを試みた。
http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi

●関連記事

[OpenFOAM] OpenFOAM 1.7.0 for Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(MSMPI編)
リンク先ページでは、OpenFOAM Wikiの方法でクロスコンパイルした。

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

インストール先ディレクトリは任意だが、今回は以下のディレクトリにインストールする。
・OpenFOAM   /media/sdb1/OpenFOAM-win-symscape
         ← (一時的に)シンボリックリンク $HOME/OpenFOAM
    (私の環境では、/media/sdb1は Windowsの Eドライブ)

●手順1【Symscape社のページの手順1、手順3、手順4】
  MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)のコンパイル/インストール

① 以下のページの手順を、順に実行する。既に実行済みであれば、飛ばしてよい。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その1)

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)


② 以下を実行し、コンパイルに必要なパッケージをインストール。

sudo apt-get install flex bison wget git-core


他にも必要かもしれない。

③ gmp、mpfr、mpc のインストール先が「/usr/local」の場合は、以下を実行(クロスコンパイラの実行に必要)。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


●手順2【Symscape社のページの手順2】
(Linux側)zlibをクロスコンパイラ用にコンパイル/インストール

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

①「zlib-1.2.5.tar.gz」をホームディレクトリに置き、端末で以下を実行。既に実行済みであれば、飛ばしてよい。

cd
tar zxf zlib-1.2.5.tar.gz
cd zlib-1.2.5
make -f win32/Makefile.gcc PREFIX='x86_64-w64-mingw32-'
sudo cp zconf.h /opt/mingw-4.5.2/x86_64-w64-mingw32/include
sudo cp zlib.h /opt/mingw-4.5.2/x86_64-w64-mingw32/include
sudo cp zlib1.dll /opt/mingw-4.5.2/bin
sudo cp libz.a /opt/mingw-4.5.2/x86_64-w64-mingw32/lib
sudo cp libzdll.a /opt/mingw-4.5.2/x86_64-w64-mingw32/lib


●手順3【Symscape社のページの手順5】
(Linux側)OpenFOAM 1.7.xの取得と、ThirdParty-1.7.1の展開

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

①「ThirdParty-1.7.1.gtgz」を「$HOME/Downloads」に置き、端末で以下を実行。

cd /media/sdb1 # Windowsの Eドライブ
mkdir OpenFOAM-win-symscape
cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
ln -s /media/sdb1/OpenFOAM-win-symscape 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社のページで指定されている番号に巻き戻す


●手順4【Symscape社のページの手順6】
(Linux側)クロスコンパイル用に、OpenFOAMにパッチを当てる

入手先:http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi
  「v5-mingw-openfoam-1-7-x.patch.gz」を入手した。

①「v5-mingw-openfoam-1-7-x.patch.gz」を「$HOME/Downloads」に置き、端末で以下を実行。

gzip -dc $HOME/Downloads/v5-mingw-openfoam-1-7-x.patch.gz | patch -p0 -b


●手順5
(Linux側)ソースコードの修正

クロスコンパイラのバージョンによっては、手順5は不要かもしれない。私の環境では、手順5を行わずにビルドすると、コンパイルは通るが、Windows環境で decomposeParやソルバが動かなかった(実行時エラー)。これを回避するため、以下のソースコード修正を行う。この修正により Windows環境で動くようになったが、その理由はよくわからない。

① 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H

エディタで「addValidParOptions」を検索して、

static void addValidParOptions(HashTable<string>& validParOptions);

        ↓ 変更

#if 0
static void addValidParOptions(HashTable<string>& validParOptions);
#else
static bool addValidParOptions();
#endif


② 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/dummy/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}
#else
bool Foam::Pstream::addValidParOptions()
{
return false;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/mpi/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#else
bool Foam::Pstream::addValidParOptions()
{
return true;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/global/argList/argList.C

エディタで「addValidParOptions」を検索して、

Pstream::addValidParOptions(validParOptions);

        ↓ 変更

#if 0
Pstream::addValidParOptions(validParOptions);
#else
if (Pstream::addValidParOptions()) {
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#endif


●手順6【Symscape社のページの手順8の前半】
(Linux側)「ThirdParty-1.7.x」の中の「openmpi」と「scotch」を、Linux用にコンパイル

① 端末で以下を実行し、Linux用に環境変数を設定。

export MPI_ARCH_PATH=$HOME/OpenFOAM/ThirdParty-1.7.x/platforms/linux64Gcc/openmpi-1.4.1
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


② 引き続き以下を実行し、openmpiと scotchをコンパイルするためのスクリプト「Subwmake」(名前は何でもよい)を作成。

cd $WM_THIRD_PARTY_DIR
cp Allwmake Subwmake


Subwmakeをエディタで編集し、以下に示す 'if [ -d "$MPI_ARCH_PATH" ]' より下の行を全て削除。

(以下削除)
if [ -d "$MPI_ARCH_PATH" ]
then
echo "========================================"
echo "Build PTScotch decomposition library (requires MPI)"
(後略)


③ 端末で以下を実行して、openmpiと scotchをコンパイル。

./Subwmake


「$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch」の下に「libscotch.so」が生成されれば、コンパイル成功。

●手順7【Symscape社のページの手順9の前半】
(Linux側)OpenFOAMをビルドするためのツールを、Linux用にビルド

① 端末で以下を実行。

cd $WM_DIR/src
make
cd $WM_DIR/bin
ln -s linux64Gcc linux64mingw-w64


「$WM_DIR/bin/linux64mingw-w64」の下に「dirToString」と「wmkdep」が生成されれば、コンパイル成功。

●手順8【Symscape社のページの手順7】
(Linux側)クロスコンパイル用に、環境変数を設定し直す

① 端末で以下を実行。
 最終行でクロスコンパイル用に /etc/bashrcを source実行している。

export FOAM_INST_DIR="$HOME/OpenFOAM"
export WM_OSTYPE=MSwindows
export WM_COMPILER=mingw-w64
export WM_ARCH_OPTION=64
export WM_CC='x86_64-w64-mingw32-gcc'
export WM_CXX='x86_64-w64-mingw32-g++'
export compilerInstall=system
export WM_MPLIB='MSMPI'
export MPI_ARCH_PATH="/opt/msmpi"
source "$FOAM_INST_DIR/OpenFOAM-1.7.x/etc/bashrc"


●手順9【Symscape社のページの手順8の後半】
(Linux側)「ThirdParty-1.7.x」の中の「scotch」を、Windows用にコンパイル

① 端末で以下を実行。

cd $WM_THIRD_PARTY_DIR/scotch_5.1/src
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/Make.inc/* Make.inc/.
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/libscotch/* libscotch/.
unlink Makefile.inc
ln -s Make.inc/Makefile.inc.mingw-w64 Makefile.inc
cd libscotch
make clean
make


「libscotch.a」と「libscotch.dll」が生成されれば、コンパイル成功。

② 手順6と手順9のコンパイル結果を、然るべき場所に転送。

mkdir -p $FOAM_LIBBIN
cp libscotch.* $FOAM_LIBBIN


●手順10【Symscape社のページの手順9の後半】
(Linux側)OpenFOAMをビルド

① 端末で以下を実行。

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


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

./Allwmake 2> a.txt


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

●手順11【Symscape社のページの手順10】
 OpenFOAMのコンパイル結果を、Windows環境に転送

① 以下のファイルが Windowsで必要とのこと。

<OpenFOAM-1.7.x>/etc/*
<OpenFOAM-1.7.x>/applications/bin/linux64mingw-w64DPOpt/*.exe
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/*.dll
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/dummy/*.dll
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/msmpi/*.dll


今回は Windowsの「E:\OpenFOAM-win-symscape」にインストールしたので、何もしなかった。

② Linuxの端末で以下を実行して、チュートリアルをコピー。

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


Windowsの「E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials」にコピーされた。

●手順12【Symscape社のページの手順11】
 MinGW-w64のランタイムDLLを、Windows環境に転送

① 以下のファイルが Windowsで必要とのこと。

/opt/mingw-4.5.2/bin/zlib1.dll
/opt/mingw-4.5.2/bin/libgcc_s_sjlj-1.dll
/opt/mingw-4.5.2/bin/libstdc++-6.dll


Linuxの端末で、このようにして転送した。

cd $WM_PROJECT_INST_DIR
mkdir bin
cd bin
cp /opt/mingw-4.5.2/bin/*.dll .


Windowsの「E:\OpenFOAM-win-symscape\bin」に転送された。

●後始末(Linux側)

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

zlib-1.2.5


② ホームディレクトリの下の、一時的なシンボリックリンク「OpenFOAM」を消去した。

cd
unlink OpenFOAM


●手順13【Symscape社のページの手順12】
(Windows側)ソフトのインストールと、環境変数の設定

① ParaViewをインストール。
入手先:http://www.paraview.org/

 今回は最新バージョンの Release 3.10.1 をインストールした。

② 今回は「E:\OpenFOAM-win-symscape」にインストールしたので、以下のように環境変数を設定する必要がある。
 ただし手順14を先に行い、動作確認が成功してから、何らかの方法で環境変数を設定することにした。

WM_PROJECT_DIR

E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x


MPI_BUFFER_SIZE

20000000


PATHに追加

C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin
C:\Program Files (x86)\ParaView 3.10.1\bin
E:\OpenFOAM-win-symscape\bin
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\applications\bin\linux64mingw-w64DPOpt
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\msmpi


●手順14【Symscape社のページの手順13】
(Windows側)1ノードで動作確認

① コマンドプロンプトで以下を実行し、環境変数を設定。

set WM_PROJECT_DIR=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x
set MPI_BUFFER_SIZE=20000000
set PATH=C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin;%PATH%
set PATH=%PATH%;C:\Program Files (x86)\ParaView 3.10.1\bin
set PATH=%PATH%;E:\OpenFOAM-win-symscape\bin
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\applications\bin\linux64mingw-w64DPOpt
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\msmpi


② 以下を実行して、作業ディレクトリに移動し、動作確認用にチュートリアルをコピー。

E:
cd E:\OpenFOAM-win-symscape\usrname-1.7.x\run
:rd /s /q cavity_test
xcopy /E E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials\incompressible\icoFoam\cavity cavity_test\
cd cavity_test
copy E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials\multiphase\interFoam\laminar\damBreak\system\decomposeParDict system


xcopyコマンドは「C:\Windows\System32」にあった。

③ チュートリアルを動かしてみた。

blockMesh
decomposePar
mpiexec -n 4 icoFoam.exe -parallel
reconstructPar
echo.>case.foam
start paraview.exe --data="case.foam"


動いた。

[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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。