1■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step1では、Linux側の作業のうち、ネットに接続する必要のある部分をあらかじめ行う。 ●環境 ・ビルドに使用したOS     Windows 7 Home Premium 64bit、Ubuntu 10.10 64bit ・バイナリを試したOS     Windows 7 Home Premium 64bit ・CUDAバージョン       4.0.17 ●OpenFOAMのディレクトリ Linux側でビルドするとき、以下のディレクトリで作業することにした。 ・OpenFOAM   $HOME/OpenFOAM-win-symscape          ← (一時的に)シンボリックリンク $HOME/OpenFOAM ・ofgpu     $HOME/OpenFOAM-win-symscape/ofgpu ●ダウンロードするファイルの保存先(Linux側) $HOME/Downloads ●手順1:(Linux側)ファイルをダウンロード。 ・ファイルの保存先は「$HOME/Downloads」 ・ダウンロードするファイル ThirdParty-1.7.1.gtgz (step6) binutils-2.21.tar.gz (step4) cc_himenoBMTxp_mpi.lzh (step5) gcc-4.5.3.tar.gz (step4) gmp-5.0.2.tar.bz2 (step3) mingw-w64-gendef.tar.gz (step5) mingw-w64-v1.0-snapshot-20110523.tar.bz2 (step4) mpc-0.9.tar.gz (step3) mpfr-3.0.1.tar.gz (step3) ofgpu-0_1.tgz (step6) pitzDailyGpu.tgz (step6) v7-mingw-openfoam-1-7-x.patch.gz (step6) zlib-1.2.5.tar.gz (step6) ●手順2:(Linux側)必要なパッケージをあらかじめインストール。 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- sudo apt-get install m4 libppl0.10-dev libc6-dev-i386 lha git cmake g++ flex bison ------------------------------ (end) ---------------------------------------- インストールされた g++のバージョンは以下の通り。 ----------------------------- (begin) --------------------------------------- $ 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. ------------------------------ (end) ---------------------------------------- ●手順3:(Linux側)gitコマンドで OpenFOAM 1.7.xを取得 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd mkdir OpenFOAM-win-symscape unlink OpenFOAM # 既存のシンボリックリンクを消去 ln -s OpenFOAM-win-symscape OpenFOAM # 一時的にシンボリックリンク cd OpenFOAM git clone git://github.com/OpenCFD/OpenFOAM-1.7.x.git # OpenFOAM 1.7.xを取得 ------------------------------ (end) ---------------------------------------- 2■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step2では、Linux側のビルド作業に入る前に、Windows側でできる作業をあらかじめ行う。 ●参考URL http://kanedaq.blog24.fc2.com/blog-entry-23.html ●手順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ファイルは、Cレジストリの設定でも使用する。 @ 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等の仮想ドライブソフトでマウント)。   インストール先はデフォルトのままにする。 A「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」を入手してインストール。   インストール先はデフォルトのままにする。 B 以下を実行して、使用する Windows SDKを v7.0に設定 ----------------------------- (begin) --------------------------------------- 「スタートメニュー」 →「すべてのプログラム」 →「Microsoft Windows SDK v7.0」 →「Visual Studio Registration」 →「Windows SDK Configuration Tool」を起動。 ------------------------------ (end) ---------------------------------------- 「Installed Windows SDK」の「v7.0」を選択し、「Make Current」ボタンを押す。 C レジストリを設定 「VCE64BIT_WIN7SDK.zip」の中の「setup_x64.bat」を、コマンドプロンプトで実行。 事前にレジストリをバックアップしておくと良いだろう。 D 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」にリネームコピーする。 ----------------------------- (begin) --------------------------------------- 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" ------------------------------ (end) ---------------------------------------- E コマンドプロンプトで 64ビットのプログラムをコンパイルするには まず、Windows 7でスタートメニューに「ファイル名を指定して実行」がない場合は、以下のようにして表示させておく。 ----------------------------- (begin) --------------------------------------- 「スタートメニュー」を右クリック →「プロパティ」 → [スタートメニュー]タブ →「カスタマイズ」 → "[ファイル名を指定して実行]コマンド"をチェック → OKボタンを押す ------------------------------ (end) ---------------------------------------- 「ファイル名を指定して実行」で以下を入力して、「Visual Studio x64 Win64 コマンド プロンプト (2008) 」を起動できる。 ----------------------------- (begin) --------------------------------------- %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" amd64 ------------------------------ (end) ---------------------------------------- コマンドプロンプトが起動して「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用に書き換えられてしまうので)。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- NVIDIAの GPUが未搭載でも、OpenFOAMのビルドと MPI実行は可能である(GPU実行だけ不可能)。 その場合は、CUDAツールキットだけインストールすれば良い。 ----------------------------- (begin) --------------------------------------- cudatoolkit_4.0.17_win_64.msi ------------------------------ (end) ---------------------------------------- A CUDAプログラムを 64ビットでコンパイルできるか確認するため、「test.cu」を作成した。 ----------------------------- (begin) --------------------------------------- #include #include __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; } ------------------------------ (end) ---------------------------------------- コンパイルするには、スタートメニューから「Visual Studio x64 Win64 コマンド プロンプト」を起動する。 無償版コンパイラ(Visual Studio 2008 Express)を使用する場合の起動法は、手順1Eに書かれている。 以下を実行して、倍精度でコンパイル。 ----------------------------- (begin) --------------------------------------- nvcc -arch=sm_13 -o test test.cu ------------------------------ (end) ---------------------------------------- 「test.exe」が生成されれば、コンパイル成功。 NVIDIAの GPU搭載マシンであれば、動かしてみて「answer = 2.5」と表示されれば成功。 「test.exe」が 64ビットでコンパイルされたか確かめるには、以下を実行する。 ----------------------------- (begin) --------------------------------------- dumpbin /headers test.exe | findstr machine ------------------------------ (end) ---------------------------------------- 「(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」を解凍した。 ----------------------------- (begin) --------------------------------------- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include ------------------------------ (end) ---------------------------------------- 「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\cusp」の下にヘッダファイルが展開された。 A Cuspの動作確認を行うため、READMEをもとに「version.cu」を作成した。 ----------------------------- (begin) --------------------------------------- #include #include #include 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; } ------------------------------ (end) ---------------------------------------- 以下を実行して、コンパイルして動かしてみた。 ----------------------------- (begin) --------------------------------------- nvcc version.cu -o version version.exe ------------------------------ (end) ---------------------------------------- 以下のように表示された。 ----------------------------- (begin) --------------------------------------- Thrust v1.4 Cusp v0.1 ------------------------------ (end) ---------------------------------------- ●手順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をコンパイルして、Linux側に転送 入手先:http://www.symscape.com/gpu-openfoam   「ofgpu-0_1.tgz」を入手した。 @「ofgpu-0_1.tgz」を解凍 解凍場所は任意だが、今回は「C:\Users\Public」の下で解凍した。 A 倍精度でコンパイルする場合は、「C:\Users\Public\ofgpu\src\ofgpu\CMakeLists.txt」をエディタで編集し、2行挿入する。 ----------------------------- (begin) --------------------------------------- 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}) ------------------------------ (end) ---------------------------------------- B cmakeを実行 コマンドプロンプトで以下を実行して、ディレクトリ移動。 ----------------------------- (begin) --------------------------------------- C: cd C:\Users\Public\ofgpu\src ------------------------------ (end) ---------------------------------------- Visual Studio 2010を使う場合は、以下を実行。 ----------------------------- (begin) --------------------------------------- cmake -G "Visual Studio 10 Win64" . ------------------------------ (end) ---------------------------------------- Visual Studio 2008を使う場合は、以下を実行。 ----------------------------- (begin) --------------------------------------- cmake -G "Visual Studio 9 2008 Win64" . ------------------------------ (end) ---------------------------------------- C スタートメニューから Visual Studioを起動し、以下を行う。 ----------------------------- (begin) --------------------------------------- ・ソリューション「C:\Users\Public\ofgpu\src\ofgpu.sln」を開く ・Debug → Releaseに変更 ・ターゲットが x64になっていることを確認 ・ソリューションのビルド(F7) ------------------------------ (end) ---------------------------------------- 以下のメッセージが表示され、ビルドに失敗したように見えたが、 ----------------------------- (begin) --------------------------------------- プロジェクトはこのソリューション構成に対してビルドするように選択されていません。 ------------------------------ (end) ---------------------------------------- 「C:\Users\Public\ofgpu\src\ofgpu\Release」の下に「ofgpu.dll」と「ofgpu.lib」が生成されれば、コンパイル成功。 この2つのファイルを、Linux側でも使用する。 E Linuxの端末で以下を実行して、「ofgpu.dll」と「ofgpu.lib」を Linux側にコピーする。 ----------------------------- (begin) --------------------------------------- cd $HOME/OpenFOAM mkdir -p ofgpu/install/win/lib cd ofgpu/install/win/lib cp '/mnt/hgfs/share/ofgpu/src/ofgpu/Release/ofgpu.dll' . cp '/mnt/hgfs/share/ofgpu/src/ofgpu/Release/ofgpu.lib' . ------------------------------ (end) ---------------------------------------- ●手順6:(Windows側)「Microsoft HPC SDK SP2」をインストールして、Linux側に転送 入手先:http://www.microsoft.com/downloads/en/details.aspx?familyid=13644DCD-4022-4BBC-B18F-1C9E9461D5BD&displaylang=en   「sdk_x64.msi」を入手。 インストールは、入手した「sdk_x64.msi」を実行するだけ。 @「C:\Program Files\Microsoft HPC Pack 2008 SDK\*」を Linux側にコピー インストールされた以下のファイルが、Linux側で必要となる。 C:\Program Files\Microsoft HPC Pack 2008 SDK\* これをディレクトリごと Linux側にコピーする。 まず「$HOME/ms-hpc-2008-sp2」にコピーし、若干の作業の後に「/opt/ms-hpc-2008-sp2」に移すことにする。 Linuxの端末で、以下を実行した。 ----------------------------- (begin) --------------------------------------- cd cp -r '/mnt/hgfs/share/Microsoft HPC Pack 2008 SDK' ms-hpc-2008-sp2 ------------------------------ (end) ---------------------------------------- A MS-MPIのインストール・パッケージから「msmpi64.dll」を抽出して、Linux側にコピー msixコマンドを使用して、「sdk_x64.msi」から全ファイルを抽出する。 msixコマンドの入手法と使用法については、以下のページを参照。 http://www.atmarkit.co.jp/fwin2k/win2ktips/865msix/msix.html 作業場所は任意だが、今回は「C:\Users\Public」の下で作業した。 「MsiX.exe」と「sdk_x64.msi」を「C:\Users\Public」の下に置いて、Windowsのコマンドプロンプトで以下を実行。 ----------------------------- (begin) --------------------------------------- C: cd C:\Users\Public mkdir sdk_x64 msix sdk_x64.msi /out sdk_x64 /ext ------------------------------ (end) ---------------------------------------- 抽出された product.cab.cab を、WinRAR等のアーカイバを使って解凍する。 WinRARの入手先:http://www.diana.dti.ne.jp/~winrar/ 解凍されたファイルの中に、以下があった。 msmpi.dll(32ビット版らしい) msmpi64.dll(64ビット版らしい) E Linuxの端末で以下を実行して、「msmpi64.dll」を「msmpi.dll」という名前で Linux側にコピーする。 ----------------------------- (begin) --------------------------------------- cd cd ms-hpc-2008-sp2/Lib/amd64 cp '/mnt/hgfs/share/sdk_x64/msmpi64.dll' ./msmpi.dll ------------------------------ (end) ---------------------------------------- 3■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step3では、gccのインストールに必要な gmp、mpfr、mpcをインストールする。 参考ページ:http://kanedaq.blog24.fc2.com/blog-entry-1.html ●gmpのインストール(gccのインストールに必要) 入手先:http://gmplib.org/   最新バージョン「gmp-5.0.2.tar.bz2」(ソース)を入手した。 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar jxf Downloads/gmp-5.0.2.tar.bz2 cd gmp-5.0.2 mkdir build cd build ../configure make # 約70秒 sudo make install ------------------------------ (end) ---------------------------------------- 「/usr/local」の「include」「lib」サブディレクトリの下に、gmp関連のファイルがコピーされればインストール成功。 ●mpfrのインストール(gccのインストールに必要) 入手先:http://www.mpfr.org/mpfr-current/   最新バージョン「mpfr-3.0.1.tar.gz」(ソース)を入手した。 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/mpfr-3.0.1.tar.gz cd mpfr-3.0.1 mkdir build cd build ../configure --with-gmp=/usr/local make # 約50秒 sudo make install ------------------------------ (end) ---------------------------------------- 「/usr/local」の「include」「lib」サブディレクトリの下に、mpfr関連のファイルがコピーされればインストール成功。 ●mpcのインストール(gccのインストールに必要) 入手先:http://www.multiprecision.org/index.php?prog=mpc&page=download   最新バージョン「mpc-0.9.tar.gz」(ソース)を入手した。 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/mpc-0.9.tar.gz cd mpc-0.9 mkdir build cd build ../configure --with-gmp=/usr/local make sudo make install ------------------------------ (end) ---------------------------------------- 「/usr/local」の「include」「lib」サブディレクトリの下に、mpc関連のファイルがコピーされればインストール成功。 ●後始末(Linux側) @ ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。 ----------------------------- (begin) --------------------------------------- gmp-5.0.2 mpfr-3.0.1 mpc-0.9 ------------------------------ (end) ---------------------------------------- 4■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step4では、Windowsで動くプログラムを Linuxでコンパイルするための、MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)を構築する。 参考ページ:http://kanedaq.blog24.fc2.com/blog-entry-8.html 後に出てくる用語を整理しておくと、  ・target:クロスコンパイラによってコンパイルされたプログラムが動く環境(=Windows)  ・host:クロスコンパイラが動く環境(=Linux)  ・build:クロスコンパイラをビルドする環境(=Linux) ●インストール方針 今回インストールするクロスコンパイラは、gcc-4.5.3 である。 「/opt/mingw-4.5.3」にインストールすることにする。 クロスコンパイラのビルドに使用したコンパイラのバージョンは、以下の通りである。 ----------------------------- (begin) --------------------------------------- $ gcc --version gcc (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. ------------------------------ (end) ---------------------------------------- ●手順1(Linux側):binutilsのコンパイル/インストール 入手先:http://ftp.gnu.org/gnu/binutils/   最新バージョン「binutils-2.21.tar.gz」(ソース)を入手した。 @「binutils-2.21.tar.gz」を「$HOME/Downloads」に置き、端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/binutils-2.21.tar.gz cd binutils-2.21 mkdir build cd build ../configure --target=x86_64-w64-mingw32 --disable-multilib \ --with-sysroot=/opt/mingw-4.5.3 --prefix=/opt/mingw-4.5.3 \ --with-windres make # 約2分 sudo make install sudo cp /opt/mingw-4.5.3/bin/x86_64-w64-mingw32-windmc \ /opt/mingw-4.5.3/x86_64-w64-mingw32/bin/windmc sudo cp /opt/mingw-4.5.3/bin/x86_64-w64-mingw32-windres \ /opt/mingw-4.5.3/x86_64-w64-mingw32/bin/windres ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/bin」の下に、「x86_64-w64-mingw32-ar」等がコピーされればインストール成功。 ●手順2(Linux側):「mingw-w64 toolchain」の中の、headerをインストール 入手先:http://sourceforge.net/projects/mingw-w64/   「mingw-w64-v1.0-snapshot-20110523.tar.bz2」を入手した。 @「mingw-w64-v1.0-snapshot-20110523.tar.bz2」を「$HOME/Downloads」に置き、端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar jxf Downloads/mingw-w64-v1.0-snapshot-20110523.tar.bz2 cd mingw-w64-v1.0-20110523 mkdir build-header cd build-header ../mingw-w64-headers/configure --host=x86_64-w64-mingw32 \ --prefix=/opt/mingw-4.5.3 sudo make install cd /opt/mingw-4.5.3 sudo ln -s x86_64-w64-mingw32 mingw cd mingw sudo ln -s lib lib64 ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/x86_64-w64-mingw32/include」の下に、ヘッダファイルがコピーされればインストール成功。 私は最初、hostは Linux、targetは Windowsのはずだから、configureのオプションで--hostを省略し、「--target=x86_64-w64-mingw32」と与えていた。ところが、これではちっともうまくいかず、思い切りハマってしまった。試行錯誤の結果、--targetの代わりに「--host=x86_64-w64-mingw32」とすればうまくいくことが判明した(理屈はわからない)。 ●手順3(Linux側):gcc(クロスコンパイラ)のコア部分のコンパイル/インストール 入手先:ftp://ftp.gnu.org/gnu/gcc/   最新バージョン「gcc-4.5.3.tar.gz」(ソース)を入手した。 @「gcc-4.5.3.tar.gz」を「$HOME/Downloads」に置き、以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/gcc-4.5.3.tar.gz cd gcc-4.5.3 mkdir build cd build ../configure --target=x86_64-w64-mingw32 --disable-multilib \ --prefix=/opt/mingw-4.5.3 --with-sysroot=/opt/mingw-4.5.3 \ --with-gmp=/usr/local make all-gcc # 約9分半 sudo make install-gcc ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/bin」の下に、「x86_64-w64-mingw32-gcc」等がコピーされればインストール成功。 ●手順4(Linux側):「mingw-w64 toolchain」の中の、crt関連をインストール @「$HOME/.bashrc」の最後に、以下の2行を追加しておく。 ----------------------------- (begin) --------------------------------------- #### MinGW-w64 Cross Compiler (64bit) export PATH=$PATH:/opt/mingw-4.5.3/bin ------------------------------ (end) ---------------------------------------- A 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- export PATH=$PATH:/opt/mingw-4.5.3/bin export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH cd cd mingw-w64-v1.0-20110523 mkdir build-crt cd build-crt ../mingw-w64-crt/configure --host=x86_64-w64-mingw32 \ --prefix=/opt/mingw-4.5.3 --with-sysroot=/opt/mingw-4.5.3 make # 約3分 sudo make install ------------------------------ (end) ---------------------------------------- 「sudo make install」を実行したとき、以下のエラーが出た。 ----------------------------- (begin) --------------------------------------- /bin/bash: line 5: x86_64-w64-mingw32-ranlib: コマンドが見つかりません ------------------------------ (end) ---------------------------------------- whichで調べてみると、 ----------------------------- (begin) --------------------------------------- $ which x86_64-w64-mingw32-ranlib /opt/mingw-4.5.3/bin/x86_64-w64-mingw32-ranlib ------------------------------ (end) ---------------------------------------- コマンドへのPATHは通っている。 エラーを回避するため、Makefileを修正することにした。 エディタで「ranlib」(小文字)を検索し、以下のように ranlibをフルパスで指定した。 ----------------------------- (begin) --------------------------------------- RANLIB = x86_64-w64-mingw32-ranlib   ↓ 変更 RANLIB = /opt/mingw-4.5.3/bin/x86_64-w64-mingw32-ranlib ------------------------------ (end) ---------------------------------------- 再び以下を実行したら、インストールできた。 ----------------------------- (begin) --------------------------------------- sudo make install ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/x86_64-w64-mingw32/lib」の下に、lib*.aがコピーされればインストール成功。 ●手順5(Linux側):gcc(クロスコンパイラ)の残りをコンパイル/インストール @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd cd gcc-4.5.3/build make # 約6分 sudo make install ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/bin」の下に、「libstdc++-6.dll」等のdllがコピーされればインストール成功。 ●手順6(Linux側):ファイル修正 @ float.hを修正。 以下のページの手順3によると、float.hの修正が必要らしい。 http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi この手順に従い、以下のファイルを修正する。 /opt/mingw-4.5.3/lib/gcc/x86_64-w64-mingw32/4.5.3/include/float.h エディタでファイルの末尾に行き、「#endif /* _FLOAT_H___ */」の前にinclude_next文を追加した。 ----------------------------- (begin) --------------------------------------- #endif /* __STDC_WANT_DEC_FP__ */ #endif /* _FLOAT_H___ */   ↓ 変更 #endif /* __STDC_WANT_DEC_FP__ */ #include_next #endif /* _FLOAT_H___ */ ------------------------------ (end) ---------------------------------------- ●手順7:DLLを Windows環境に転送 @「/opt/mingw-4.5.3/bin/*.dll」を Windows環境に転送し、PATHを通す。 ●後始末(Linux側) @ ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。 ----------------------------- (begin) --------------------------------------- binutils-2.21 mingw-w64-v1.0-20110523 gcc-4.5.3 ------------------------------ (end) ---------------------------------------- ●テスト @ Linux側で「hello.cpp」を作成した。 ----------------------------- (begin) --------------------------------------- #include int main() { std::cout << "Hello, world!" << std::endl; return 0; } ------------------------------ (end) ---------------------------------------- A Linuxの端末で以下を実行し、クロスコンパイルした。 「-static」オプションを与えると、スタティックリンクされる。 ----------------------------- (begin) --------------------------------------- x86_64-w64-mingw32-g++ -o hello_d.exe hello.cpp x86_64-w64-mingw32-g++ -o hello_s.exe hello.cpp -static ------------------------------ (end) ---------------------------------------- 生成された exeを Windows上(コマンドプロンプト)で動かしてみたら、いずれも動いた。 ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。 スタティックリンクの exeは、これらの dllがなくても動いた。 5■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step5では、MS-MPIを使うプログラムをクロスコンパイルするための環境を構築する。 参考ページ:http://kanedaq.blog24.fc2.com/blog-entry-9.html  ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)  ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 64bit(今回は Windows 7) ●参考URL http://www.symscape.com/configure-msmpi-for-mingw-w64 ●インストール方針 以下のディレクトリにインストールすることにする。 ・MSMPI    /opt/ms-hpc-2008-sp2        ← シンボリックリンク /opt/msmpi ・gendef   /opt/mingw-4.5.3/bin ●手順1(Linux側):gendefをコンパイル/インストール 入手先:http://sourceforge.net/apps/trac/mingw-w64/wiki/gendef   「mingw-w64-gendef.tar.gz」(ソース)を入手した。 @「mingw-w64-gendef.tar.gz」を「$HOME/Downloads」に置き、端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/mingw-w64-gendef.tar.gz cd gendef mkdir build cd build #../configure -h ../configure --prefix=/opt/mingw-4.5.3 make sudo make install ------------------------------ (end) ---------------------------------------- 「/opt/mingw-4.5.3/bin」の下に、「gendef」がコピーされればインストール成功。 ●手順2(Linux側):「libmsmpi.a」を作成 @ 端末で以下を実行(gmp、mpfr、mpc のインストール先が「/usr/local」の場合)。 ----------------------------- (begin) --------------------------------------- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ------------------------------ (end) ---------------------------------------- A 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd cd ms-hpc-2008-sp2/Lib/amd64 gendef msmpi.dll x86_64-w64-mingw32-dlltool -d msmpi.def -l libmsmpi.a -D msmpi.dll ------------------------------ (end) ---------------------------------------- 「libmsmpi.a」が生成されれば作業成功。 ●手順3(Linux側):ファイル修正 @ mpi.hを修正。 以下のページによると、mpi.hの修正が必要らしい。 http://www.symscape.com/configure-msmpi-for-mingw-w64 このページの手順に従い、以下のファイルを修正する。 $HOME/ms-hpc-2008-sp2/Include/mpi.h エディタでファイルの先頭に行き、「#define MPI_INCLUDED」の下あたりに include文を1行追加した。 ----------------------------- (begin) --------------------------------------- #ifndef MPI_INCLUDED #define MPI_INCLUDED #include ------------------------------ (end) ---------------------------------------- ●手順4(Linux側):MS-MPIを「/opt/ms-hpc-2008-sp2」に転送 @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd sudo mv ms-hpc-2008-sp2 /opt cd /opt sudo ln -s ms-hpc-2008-sp2 msmpi ------------------------------ (end) ---------------------------------------- ●後始末(Linux側) @ ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。 ----------------------------- (begin) --------------------------------------- gendef ------------------------------ (end) ---------------------------------------- ●テスト(その1) @ Linux側で「mpitest.cpp」を作成した。 ----------------------------- (begin) --------------------------------------- #include #include "mpi.h" int main(int argc, char* argv[]) { int myrank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); std::cout << "myrank = " << myrank << std::endl; MPI_Finalize(); return 0; } ------------------------------ (end) ---------------------------------------- A Linuxの端末で以下を実行して、クロスコンパイルした。 「-static」オプションを与えると、スタティックリンクされる。 ----------------------------- (begin) --------------------------------------- x86_64-w64-mingw32-g++ -O3 -o mpitest_d.exe mpitest.cpp \ -I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi x86_64-w64-mingw32-g++ -O3 -o mpitest_s.exe mpitest.cpp \ -I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi -static ------------------------------ (end) ---------------------------------------- 「mpitest_d.exe」と「mpitest_s.exe」が生成されれば、コンパイル成功。 B 生成された exeを、Windows(コマンドプロンプト)で動かしてみた。 ----------------------------- (begin) --------------------------------------- >mpiexec -n 4 mpitest_d.exe myrank = 1 myrank = 0 myrank = 3 myrank = 2 >mpiexec -n 4 mpitest_s.exe myrank = 0 myrank = 1 myrank = 2 myrank = 3 ------------------------------ (end) ---------------------------------------- いずれも動いた。 ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。 スタティックリンクの exeは、これらの dllがなくても動いた。 ●テスト(その2):姫野ベンチマーク 入手先:http://accc.riken.jp/HPC/HimenoBMT/download2.html   「cc_himenoBMTxp_mpi.lzh」(ソースコード、C + MPI、static allocate version)を入手した。 @「cc_himenoBMTxp_mpi.lzh」を Linuxの「$HOME/Downloads」に置き、端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd mkdir cc_himenoBMTxp_mpi cd cc_himenoBMTxp_mpi lha e $HOME/Downloads/cc_himenoBMTxp_mpi.lzh mv himenobmtxps.c himenoBMTxps.c # lhaで解凍するとファイル名が小文字になってしまうので chmod u+x paramset.sh ------------------------------ (end) ---------------------------------------- A 引き続き以下を実行して、逐次処理用プログラムをクロスコンパイルした。 ----------------------------- (begin) --------------------------------------- rm param.h ./paramset.sh S 1 1 1 x86_64-w64-mingw32-gcc -O3 -o himeno1.exe himenoBMTxps.c \ -I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi ------------------------------ (end) ---------------------------------------- 「himeno1.exe」が生成されればコンパイル成功。 B 引き続き、2並列処理用プログラムをクロスコンパイルした。 ----------------------------- (begin) --------------------------------------- rm param.h ./paramset.sh S 1 1 2 x86_64-w64-mingw32-gcc -O3 -o himeno2.exe himenoBMTxps.c \ -I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi ------------------------------ (end) ---------------------------------------- 「himeno2.exe」が生成されればコンパイル成功。 C 引き続き、4並列処理用プログラムをクロスコンパイルした。 ----------------------------- (begin) --------------------------------------- rm param.h ./paramset.sh S 1 1 4 x86_64-w64-mingw32-gcc -O3 -o himeno4.exe himenoBMTxps.c \ -I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi ------------------------------ (end) ---------------------------------------- 「himeno4.exe」が生成されればコンパイル成功。 D 生成された exeを、WindowsノートPCに転送して動かしてみた。  このノートPCの CPUは 2コアで、ハイパースレッディング=オンのため 4コアに見える。  本当はハイパースレッディングをオフにしたいが、この機種は BIOSでオフに設定できなかった。 ----------------------------- (begin) --------------------------------------- mpiexec -n 1 himeno1.exe mpiexec -n 2 himeno2.exe mpiexec -n 4 himeno4.exe ------------------------------ (end) ---------------------------------------- 逐次処理の結果 ----------------------------- (begin) --------------------------------------- >mpiexec -n 1 himeno1.exe Sequential version array size mimax = 65 mjmax = 65 mkmax = 129 Parallel version array size mimax = 65 mjmax = 65 mkmax = 129 imax = 64 jmax = 64 kmax =128 I-decomp = 1 J-decomp = 1 K-decomp =1 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 1467.350528 time(s): 0.033668 3.288628e-003 Now, start the actual measurement process. The loop will be excuted in 5346 times This will take about one minute. Wait for a while cpu : 44.068811 sec. Loop executed for 5346 times Gosa : 6.575345e-007 MFLOPS measured : 1997.700906 Score based on Pentium III 600MHz : 24.115173 ------------------------------ (end) ---------------------------------------- 2並列の結果 ----------------------------- (begin) --------------------------------------- >mpiexec -n 2 himeno2.exe Sequential version array size mimax = 65 mjmax = 65 mkmax = 129 Parallel version array size mimax = 65 mjmax = 65 mkmax = 67 imax = 64 jmax = 64 kmax =65 I-decomp = 1 J-decomp = 1 K-decomp =2 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 2082.186924 time(s): 0.023727 3.302404e-003 Now, start the actual measurement process. The loop will be excuted in 7586 times This will take about one minute. Wait for a while cpu : 39.938608 sec. Loop executed for 7586 times Gosa : 2.382049e-008 MFLOPS measured : 3127.899239 Score based on Pentium III 600MHz : 37.758320 ------------------------------ (end) ---------------------------------------- 4並列の結果 ----------------------------- (begin) --------------------------------------- >mpiexec -n 4 himeno4.exe Sequential version array size mimax = 65 mjmax = 65 mkmax = 129 Parallel version array size mimax = 65 mjmax = 65 mkmax = 35 imax = 64 jmax = 64 kmax =33 I-decomp = 1 J-decomp = 1 K-decomp =4 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 1869.251395 time(s): 0.026429 3.293020e-003 Now, start the actual measurement process. The loop will be excuted in 6810 times This will take about one minute. Wait for a while cpu : 42.718009 sec. Loop executed for 6810 times Gosa : 7.458185e-008 MFLOPS measured : 2625.239633 Score based on Pentium III 600MHz : 31.690483 ------------------------------ (end) ---------------------------------------- 6■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step6では、Symscapeのページをもとに、「OpenFOAM on Windows(64bit)」を構築する。 参考ページ:http://kanedaq.blog24.fc2.com/blog-entry-23.html ●参考URL http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi http://www.symscape.com/gpu-openfoam ●手順1:(Linux側)環境変数の設定 @ 端末で以下を実行(gmp、mpfr、mpc のインストール先が「/usr/local」の場合)。 ----------------------------- (begin) --------------------------------------- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ------------------------------ (end) ---------------------------------------- ●手順2:(Linux側)zlibをコンパイル/インストール(実施済みであれば飛ばして良い) 入手先:http://zlib.net/   最新バージョン「zlib-1.2.5.tar.gz」(ソース)を入手した。 @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd tar zxf Downloads/zlib-1.2.5.tar.gz cd zlib-1.2.5 ------------------------------ (end) ---------------------------------------- A クロスコンパイラ用にコンパイル/インストール。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- B コンパイル結果を消去。 ----------------------------- (begin) --------------------------------------- make -f win32/Makefile.gcc clean ------------------------------ (end) ---------------------------------------- C ネイティブ Linux用にコンパイル/インストール。 ----------------------------- (begin) --------------------------------------- ./configure make sudo make install ------------------------------ (end) ---------------------------------------- 「/usr/local/include」の下に「zlib.h」がコピーされれば成功。 ●手順3:(Linux側)OpenFOAM 1.7.xの取得と、ThirdParty-1.7.1の展開 入手先:http://www.openfoam.com/download/source.php   「ThirdParty-1.7.1.gtgz」(ソース)を入手した。 @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd cd OpenFOAM tar zxf $HOME/Downloads/ThirdParty-1.7.1.gtgz # ThirdParty-1.7.1を展開 mv ThirdParty-1.7.1 ThirdParty-1.7.x cd OpenFOAM-1.7.x git checkout 14b79332ee4a1827656951db39fe81cc5ba52d78 # Symscape社のページで指定されている番号に巻き戻す ------------------------------ (end) ---------------------------------------- ●手順4:(Linux側)「libofgpu.a」を作成 入手先:http://www.symscape.com/gpu-openfoam   「ofgpu-0_1.tgz」を入手した(手順5と同じファイル)。 @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd cd OpenFOAM tar zxf $HOME/Downloads/ofgpu-0_1.tgz cd ofgpu/install/win/lib ------------------------------ (end) ---------------------------------------- A カレントディレクトリに「ofgpu.dll」と「ofgpu.lib」があることを確認する。 B 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- gendef ofgpu.dll x86_64-w64-mingw32-dlltool -d ofgpu.def -l libofgpu.a -D ofgpu.dll ------------------------------ (end) ---------------------------------------- 「libofgpu.a」が生成されれば作業成功。 ●手順5:(Linux側)クロスコンパイル用に、OpenFOAMにパッチを当てる。 入手先:http://www.symscape.com/gpu-openfoam   「v7-mingw-openfoam-1-7-x.patch.gz」を入手した。 @ 端末で以下を実行して、OpenFOAMにパッチを当てる。 ----------------------------- (begin) --------------------------------------- cd $HOME/OpenFOAM/OpenFOAM-1.7.x gzip -dc $HOME/Downloads/v7-mingw-openfoam-1-7-x.patch.gz | patch -p0 -b ------------------------------ (end) ---------------------------------------- A 引き続き以下を実行して、シェルスクリプトに実行権限を付与する。 ----------------------------- (begin) --------------------------------------- chmod ug+x src/gpu/Allwmake ------------------------------ (end) ---------------------------------------- ●手順6:(Linux側)ソースコードの修正 クロスコンパイラのバージョンによっては、この手順は不要かもしれない。私の環境では、この手順を行わずにビルドすると、コンパイルは通るが、Windows環境で decomposeParやソルバが動かなかった(実行時エラー)。これを回避するため、以下のソースコード修正を行った。この修正により Windows環境で動くようになったが、その理由はよくわからない。 @ 以下のファイルをエディタで修正。 $HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H エディタで「addValidParOptions」を検索して、 ----------------------------- (begin) --------------------------------------- static void addValidParOptions(HashTable& validParOptions);         ↓ 変更 #if 0 static void addValidParOptions(HashTable& validParOptions); #else static bool addValidParOptions(); #endif ------------------------------ (end) ---------------------------------------- A 以下のファイルをエディタで修正。 $HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/dummy/Pstream.C エディタで「addValidParOptions」を検索して、 ----------------------------- (begin) --------------------------------------- void Foam::Pstream::addValidParOptions(HashTable& validParOptions) {}         ↓ 変更 #if 0 void Foam::Pstream::addValidParOptions(HashTable& validParOptions) {} #else bool Foam::Pstream::addValidParOptions() { return false; } #endif ------------------------------ (end) ---------------------------------------- B 以下のファイルをエディタで修正。 $HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/mpi/Pstream.C エディタで「addValidParOptions」を検索して、 ----------------------------- (begin) --------------------------------------- void Foam::Pstream::addValidParOptions(HashTable& 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& 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 ------------------------------ (end) ---------------------------------------- C 以下のファイルをエディタで修正。 $HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/global/argList/argList.C エディタで「addValidParOptions」を検索して、 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- ●手順7:(Linux側)ビルド設定(単精度の場合のみ) @ 単精度でコンパイルする場合は、「$HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc」をエディタで以下のように変更する。 ----------------------------- (begin) --------------------------------------- : ${WM_PRECISION_OPTION:=DP}; export WM_PRECISION_OPTION      ↓ 変更 : ${WM_PRECISION_OPTION:=SP}; export WM_PRECISION_OPTION ------------------------------ (end) ---------------------------------------- ●手順8:(Linux側)「ThirdParty-1.7.x」の中の「openmpi」と「scotch」を、Linux用にコンパイル @ 端末で以下を実行し、Linux用に環境変数を設定。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- A 引き続き以下を実行し、openmpiと scotchをコンパイルするためのスクリプト「Subwmake」(名前は何でもよい)を作成。 ----------------------------- (begin) --------------------------------------- cd $WM_THIRD_PARTY_DIR cp Allwmake Subwmake ------------------------------ (end) ---------------------------------------- Subwmakeをエディタで編集し、以下に示す 'if [ -d "$MPI_ARCH_PATH" ]' より下の行を全て削除。 ----------------------------- (begin) --------------------------------------- (以下削除) if [ -d "$MPI_ARCH_PATH" ] then echo "========================================" echo "Build PTScotch decomposition library (requires MPI)" (後略) ------------------------------ (end) ---------------------------------------- B 端末で以下を実行して、openmpiと scotchをコンパイル。 ----------------------------- (begin) --------------------------------------- ./Subwmake # 約5分半 ------------------------------ (end) ---------------------------------------- 「$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch」の下に「libscotch.so」が生成されれば、コンパイル成功。 ●手順9:(Linux側)OpenFOAMをビルドするためのツールを、Linux用にビルド @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- cd $WM_DIR/src make cd $WM_DIR/bin ln -s linux64Gcc linux64mingw-w64 ------------------------------ (end) ---------------------------------------- 「$WM_DIR/bin/linux64mingw-w64」の下に「dirToString」と「wmkdep」が生成されれば、コンパイル成功。 ●手順10:(Linux側)クロスコンパイル用に各種設定 @ 端末で以下を実行して、CUDAコンパイル用に環境変数を設定する。 ----------------------------- (begin) --------------------------------------- export WM_GPU='CUDA' export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu ------------------------------ (end) ---------------------------------------- A 端末で以下を実行して、クロスコンパイル用に環境変数を設定する。 ----------------------------- (begin) --------------------------------------- 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" ------------------------------ (end) ---------------------------------------- B 倍精度でコンパイルする場合は、「$WM_DIR/rules/linux64mingw-w64/c++Opt」をエディタで編集し、コンパイルオプションに「-DOF_DOUBLE_PRECISION」を追加する。 ----------------------------- (begin) --------------------------------------- c++OPT = -O3 -DNDEBUG      ↓ 変更 c++OPT = -O3 -DNDEBUG -DOF_DOUBLE_PRECISION ------------------------------ (end) ---------------------------------------- ●手順11:(Linux側)「ThirdParty-1.7.x」の中の「scotch」を、Windows用にクロスコンパイル @ 端末で以下を実行。 ----------------------------- (begin) --------------------------------------- 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 # 約20秒 ------------------------------ (end) ---------------------------------------- 「libscotch.a」と「libscotch.dll」が生成されれば、コンパイル成功。 A 手順14と手順17のコンパイル結果を、然るべき場所に転送。 ----------------------------- (begin) --------------------------------------- mkdir -p $FOAM_LIBBIN cp libscotch.* $FOAM_LIBBIN ------------------------------ (end) ---------------------------------------- ●手順12:(Linux側)OpenFOAMをビルド @ 端末で以下を実行して、OpenFOAMをビルド。 ----------------------------- (begin) --------------------------------------- cd $WM_PROJECT_DIR chmod u+x applications/utilities/parallelProcessing/Allwmake # なぜか実行権限が付与されていなかった ./Allwmake # 約2時間 ------------------------------ (end) ---------------------------------------- step7に続く。 7■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ step7では、「OpenFOAM on Windows(64bit)」の構築の続きを行い、Windows上に転送して動かしてみる。 参考ページ:http://kanedaq.blog24.fc2.com/blog-entry-23.html ●参考URL http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi http://www.symscape.com/gpu-openfoam ●手順1:(Linux側)環境変数の設定 @ 端末で以下を実行(gmp、mpfr、mpc のインストール先が「/usr/local」の場合)。 ----------------------------- (begin) --------------------------------------- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ------------------------------ (end) ---------------------------------------- A 端末で以下を実行して、CUDAコンパイル用に環境変数を設定する。 ----------------------------- (begin) --------------------------------------- export WM_GPU='CUDA' export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu ------------------------------ (end) ---------------------------------------- B 端末で以下を実行して、クロスコンパイル用に環境変数を設定する。 ----------------------------- (begin) --------------------------------------- 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" ------------------------------ (end) ---------------------------------------- ●手順2:(Linux側)OpenFOAMをビルド @ step6でコンパイルエラーが発生していないか確かめるために、以下を実行してエディタで a.txtを確認した。 ----------------------------- (begin) --------------------------------------- cd $WM_PROJECT_DIR ./Allwmake 2> a.txt ------------------------------ (end) ---------------------------------------- a.txtの中に、「error:」(後ろにコロンがつく)や「エラー」の文字は見当たらず、コンパイルは成功したようだ。 A チュートリアルをコピーしておいた。 ----------------------------- (begin) --------------------------------------- mkdir -p $FOAM_RUN cp -r $FOAM_TUTORIALS $FOAM_RUN ------------------------------ (end) ---------------------------------------- B pitzDailyGpuケースも解凍しておいた。 入手先:http://www.symscape.com/gpu-openfoam ----------------------------- (begin) --------------------------------------- run tar zxf $HOME/Downloads/pitzDailyGpu.tgz ------------------------------ (end) ---------------------------------------- ●手順3:(Linux側)DLLをコピー Windows側で必要になる DLLを、「$HOME/OpenFOAM/bin」にコピーすることにした。 @ 端末で以下を実行して、MinGW-w64のランタイム DLLをコピー。 ----------------------------- (begin) --------------------------------------- cd $WM_PROJECT_INST_DIR mkdir bin cd bin cp /opt/mingw-4.5.3/bin/*.dll . ------------------------------ (end) ---------------------------------------- A 以下を実行して、GPU用の DLLをコピー。 ----------------------------- (begin) --------------------------------------- cp $WM_PROJECT_INST_DIR/ofgpu/install/win/lib/ofgpu.dll . ------------------------------ (end) ---------------------------------------- ●手順4:(Linux側)ビルド結果を圧縮 @ 端末で以下を実行して、ビルド結果をソースごと圧縮した。 ----------------------------- (begin) --------------------------------------- cd zip -r OpenFOAM-win-symscape.zip OpenFOAM-win-symscape ------------------------------ (end) ---------------------------------------- この zipファイルを Windows側に転送した。 ●後始末(Linux側) @ ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。 ----------------------------- (begin) --------------------------------------- zlib-1.2.5 ------------------------------ (end) ---------------------------------------- A ホームディレクトリの下の、一時的なシンボリックリンク「OpenFOAM」を消去した。 ----------------------------- (begin) --------------------------------------- cd unlink OpenFOAM ------------------------------ (end) ---------------------------------------- ●手順5(Windows側):OpenFOAMと ParaViewのインストール @ 手順4で作成した「OpenFOAM-win-symscape.zip」を、Windows側で解凍。   今回は Eドライブ直下で解凍した。 A コマンドプロンプトで以下を実行し、OpenFOAMユーザ用のディレクトリ名を好みの名前に変更。 ----------------------------- (begin) --------------------------------------- E: cd E:\OpenFOAM-win-symscape move ubuntu-1.7.x usrname-1.7.x ------------------------------ (end) ---------------------------------------- B ParaViewをインストール。 入手先:http://www.paraview.org/   最新バージョンの Release 3.10.1 をインストールした。 ●手順6:(Windows側)コマンドプロンプトで動作確認 @ コマンドプロンプトで以下を実行し、環境変数を設定。 ----------------------------- (begin) --------------------------------------- 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% ------------------------------ (end) ---------------------------------------- MPIを使用する場合は、以下も実行。 ----------------------------- (begin) --------------------------------------- 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% ------------------------------ (end) ---------------------------------------- GPUを使用する場合は、以下も実行。 ----------------------------- (begin) --------------------------------------- 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% ------------------------------ (end) ---------------------------------------- 現バージョンでは MPIと GPUは同時使用できないので、どちらかを選んで設定する。 MPIと GPUの使用を切り替えるときは、コマンドプロンプトを再起動して環境変数を設定し直す。 ちなみに MPIも GPUも使用しない場合は、以下を実行。 ----------------------------- (begin) --------------------------------------- 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\gpuless;%PATH% ------------------------------ (end) ---------------------------------------- A 以下を実行して作業ディレクトリに移動し、動作確認用にチュートリアルをコピー。 ----------------------------- (begin) --------------------------------------- E: cd E:\OpenFOAM-win-symscape\usrname-1.7.x\run rd /s /q pitzDaily_test xcopy /E pitzDailyGpu pitzDaily_test\ cd pitzDaily_test ------------------------------ (end) ---------------------------------------- xcopyコマンドは「C:\Windows\System32」にあった。 B チュートリアルを動かしてみた。 MPIを使用する場合: ----------------------------- (begin) --------------------------------------- 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.>pitzDailyGpu.foam start paraview.exe --data="pitzDailyGpu.foam" ------------------------------ (end) ---------------------------------------- GPUを使用する場合: ----------------------------- (begin) --------------------------------------- blockMesh simpleFoam.exe echo.>pitzDailyGpu.foam start paraview.exe --data="pitzDailyGpu.foam" ------------------------------ (end) ---------------------------------------- 動いた。 ●手順7:(Windows側)MSYSで動作確認 「$WM_PROJECT_DIR/bin」にあるシェルスクリプトは Windowsコマンドプロンプトでは動かないので、MSYSで試してみた。 参考までに、MSYSシェルを使いやすくする方法はこちら: http://darusuna.sakura.ne.jp/archives/4ffmpegwin/01ffmepg/06msys.html @ MSYSシェルを起動して以下を実行し、環境変数を設定。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- MPIを使用する場合は、以下も実行。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- GPUを使用する場合は、以下も実行。 ----------------------------- (begin) --------------------------------------- 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 ------------------------------ (end) ---------------------------------------- 現バージョンでは MPIと GPUは同時使用できないので、どちらかを選んで設定する。 MPIと GPUの使用を切り替えるときは、MSYSシェルを再起動して環境変数を設定し直す。 ちなみに MPIも GPUも使用しない場合は、以下を実行。 ----------------------------- (begin) --------------------------------------- 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/gpuless:$PATH ------------------------------ (end) ---------------------------------------- A 以下を実行して、動作確認用にチュートリアルをホームディレクトリにコピー。 ----------------------------- (begin) --------------------------------------- cd rm -rf pitzDaily_test cp -r /e/OpenFOAM-win-symscape/usrname-1.7.x/run/pitzDailyGpu pitzDaily_test cd pitzDaily_test ------------------------------ (end) ---------------------------------------- B チュートリアルを動かしてみた。 MPIを使用する場合: ----------------------------- (begin) --------------------------------------- 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 pitzDailyGpu.foam start paraview.exe --data="pitzDailyGpu.foam" ------------------------------ (end) ---------------------------------------- GPUを使用する場合: ----------------------------- (begin) --------------------------------------- blockMesh simpleFoam.exe touch pitzDailyGpu.foam start paraview.exe --data="pitzDailyGpu.foam" ------------------------------ (end) ---------------------------------------- 動いた。 C シェルスクリプトを動かしてみた。 ----------------------------- (begin) --------------------------------------- #pyFoamClearCase.py . # pyFoamは動かなかった foamCleanTutorials ------------------------------ (end) ---------------------------------------- foamCleanTutorialsは動くようだ。 □■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■