OpenFOAM を Intel C++ コンパイラでコンパイルする2011年1月29日 はじめにOpenFOAM を Intel C++ コンパイラでコンパイルしてみる。 はじめに言うが、残念な結果だった。 環境
Intel C++ Composer XE 2011 のインストール
~/.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 の性能が結構よいのか、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で試してみたが、結果は変わらなかった。 | ||||||||||||||||
| PENGUINITIS | ||||||||||||||||