OpenFOAM を Intel C++ コンパイラでコンパイルする

2011年1月29日

はじめに

OpenFOAM を Intel C++ コンパイラでコンパイルしてみる。

はじめに言うが、残念な結果だった。

環境

CPUIntel Core i7 87
OSopenSUSE 11.3
CompilerIntel C++ Composer XE 2011 (非商用版)
対象OpenFOAM 1.7.1

Intel C++ Composer XE 2011 のインストール

  1. ここ から非商用版 (non-commercial) Intel C++ Composer XE 2011 を入手する。ここでは l_compoxe_intel64_2011.1.107.tgz を入手。シリアル番号をメモしておく。
  2. パッケージを展開。
  3. パッケージの中の install.sh を実行。
  4. sudo を使うか聞いてくるので、使うようにする。
  5. "unsupported OS" とか言われるが、skip する。
  6. License が表示される。最後までスクロールして "accept" と入力。
  7. シリアル番号でアクティベイトするようにする。シリアル番号を入力する。(たぶん) ネットにつないでアクティベイトされる。
  8. デフォルトでインストール。
  9. 終了。

~/.bashrc に以下を追加する。

. /opt/intel/bin/compilervars.sh intel64

~/.bashrc を読み込む。

$ . ~/.bashrc

C コンパイラは icc、C++ は icpc、Fortran は ifort。

OpenFOAM のコンパイル

パッケージを展開。

$ mkdir ~/OpenFOAM-1.7.1-intel
$ tar xvzf OpenFOAM-1.7.1.gtgz -C ~/OpenFOAM-1.7.1-intel
$ tar xvzf ThirdParty-1.7.1.gtgz -C ~/OpenFOAM-1.7.1-intel
$ ln -s ~/OpenFOAM-1.7.1-intel ~/OpenFOAM

~/.bashrc に以下のように設定。

WM_COMPILER=Icc
. ~/OpenFOAM/OpenFOAM-1.7.1/etc/bashrc

~/.bashrc を読み込む。

$ . ~/.bashrc

コンパイルの設定を編集。

~/OpenFOAM/OpenFOAM-1.7.1/wmake/rules/linux64Icc/cOpt

cDBUG =
cOpt = -O3 -no-prec-div -xSSE4.2 -ipo

~/OpenFOAM/OpenFOAM-1.7.1/wmake/rules/linux64Icc/c++Opt

c++DBUG =
c++Opt = -O3 -no-prec-div -xSSE4.2 -ipo -std=c++0x

c++Opt の最後の "-std=c++0x" がないと、iomanip を使っているところでエラーになる。

~/OpenFOAM/OpenFOAM-1.7.1/wmake/rules/linux64Icc/general

CPP = /lib/cpp -traditional-cpp $(GFLAGS)
AR = xiar
ARFLAGS = cr
RANLIB = xiar s
LD = xild
...

ここ にしたがってソースコードを修正。

~/OpenFOAM/OpenFOAM-1.7.1/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C

下記のように names の定義をコメントにする。

/*
template<>
const char*
NamedEnum<turbulentHeatFluxTemperatureFvPatchScala rField::heatSourceType, 2>::
names[] =
{
"power",
"flux"
};
*/

ファイルの末尾 (名前空間の外) に下記のように追加する。

template<>
const char*
Foam::NamedEnum
<Foam::compressible::turbulentHeatFluxTemperatureFvPatchScalarField::heatSourceType, 2>::
names[] =
{
"power",
"flux"
}; 

OpenFOAM のコンパイル。

$ cd ~/OpenFOAM/OpenFOAM-1.7.1
$ ./Allwmake

ParaView のコンパイル。

$ cd ../ThirdParty-1.7.1
$ ./makeParaView

PV3FoamReader のコンパイル。

$ cd $FOAM_APP/utilities/postProcessing/graphics/PV3FoamReader/
$ ./Allwmake

性能比較

GCC 版 OpenFOAM と性能比較をしてみた。GCC のバージョンは 4.5.0。

ケース: セル数 11 万, simpleFoam。計算時間はそれぞれ 3 回計算して平均を取る。

GCC 版シリアル50.3 s
Intel C++ 版シリアル52 s
GCC 版 4 パラレル25.7 s
Intel C++ 版 4 パラレル26 s

うーん…。問題が小さすぎるのか、指定した最適化オプションがまずいのか、GCC の性能が結構よいのか、OpenFOAM のコードが最適化しにくいものなのか…。

追記

コンパイルオプションを

cOpt = -O3 -no-prec-div -ipo
c++Opt = -O3 -no-prec-div -ipo -std=c++0x
や
cOpt = -O3 -no-prec-div
c++Opt = -O3 -no-prec-div -std=c++0x
で試してみたが、結果は変わらなかった。