Home > OpenFOAM v2.3.0 on Xeon Phi

OpenFOAM v2.3.0 on Xeon Phi

  • 2014-07-03 (木) 10:07

OpenFOAM を Xeon Phi 向けにクロスコンパイルしたときの覚書.

  • OS は CentOS 6.5, コンパイラは intel composer xe 2013 とimpi 4.1.3.
  • 基本的に -mmic オプションをつけてXeonPhi向けにコンパイルすればよい.
  • wmake はCPUで実行するのであらかじめ -mmic なしでコンパイルしておく.
  • ptscotch のコンパイルができない(調査中)ので,libptscotch 関連はリンクしない.
  • 現状,ptscotch は特になくても困らない.
  • intel MPI のlibmpi.so は,micとamd64を区別して適切にリンクさせること.
  • flex, zlib, boost もクロスコンパイルが必要.
  • CGAL はコンパイルに失敗する(現在調査中)のでv2.3.0 から新しく実装された機能は利用できない.
  • foamyHexMesh などはホストで実行するのでMICで実行できなくても問題ない?
  • CGAL はビルドしないで boost だけビルドする.
  • v2.2.2 も同様の方法でコンパイル可能.
  • 以前は https://github.com/mic-hackathon/mic-hackathon_20130803にXeon Phi 向け OpenFOAM コンパイルの情報があったが,現在は削除されている模様.(03/07/2014)

$HOME/.bashrc の設定1

mic 向けコンパイルのため PATH を通しておく.


export I_MPI_ROOT=/opt/intel/impi/4.1.3.045
export PATH=/usr/linux-k1om-4.7/bin:$PATH
export LD_LIBRARY_PATH=$I_MPI_ROOT/libmic:$LD_LIBRARY_PATH
source /opt/OpenFOAM/OpenFOAM-2.3.0/etc/bashrc    ## インストール場所(環境に合わせて適宜変更のこと)
source /opt/intel/impi/4.1.3/mic/bin/mpivars.sh

OpenFOAM/ThirdParty ソースディレクトリの展開

適当なディレクトリにダウンロードしてそれぞれ展開しておく.
ここでは,上記の .bashrc に合わせて /opt/OpenFOAM 以下に展開する.
その後,以下を実行.

source ~/.bashrc

エラーが無ければ次へ進む.

$WM_PROJECT_DIR/etc/bashrc の設定

$WM_PROJECT_DIR/etc/bashrc の設定
コンパイラをicc に変更.


#- Compiler:
#    WM_COMPILER = Gcc | Gcc43 | Gcc44 | Gcc45 | Gcc46 | Clang | Icc (Intel icc)
export WM_COMPILER=Icc

MPI はインテルMPIを使用.


#- MPI implementation:
#    WM_MPLIB = SYSTEMOPENMPI | OPENMPI | MPICH | MPICH-GM | HPMPI
#               | GAMMA | MPI | QSMPI | SGIMPI
export WM_MPLIB=INTELMPI

$WM_PROJECT_DIR/etc/config/settings.sh の設定

64ビットLinuxのエントリを以下のように編集.


       64)
            WM_ARCH=linux64
            export WM_COMPILER_LIB_ARCH=64
            export WM_CC='icc'
            export WM_CXX='icpc'
            export WM_CFLAGS='-mmic -m64 -fPIC'
            export WM_CXXFLAGS='-mmic -m64 -fPIC'
            export WM_LDFLAGS='-mmic -m64'
            ;;

MIC 上で実行するときのために Unknown processor type の部分を以下のように編集.


*)
# echo Unknown processor type `uname -m` for Linux 1>&2  ## この行をコメントアウトして以下を追加.
         WM_ARCH=linux64
         export WM_COMPILER_LIB_ARCH=64
         export WM_CC='icc'
         export WM_CXX='icpc'
         export WM_CFLAGS='-mmic -m64 -fPIC'
         export WM_CXXFLAGS='-mmic -m64 -fPIC'
         export WM_LDFLAGS='-mmic -m64'

MPI ライブラリの設定


# Communications library
# ~~~~~~~~~~~~~~~~~~~~~~

INTELMPI)
    MPI_ROOT=${I_MPI_ROOT} ##この行を追加
    # no trailing slash
    [ "${MPI_ROOT%/}" = "${MPI_ROOT}" ] || MPI_ROOT="${MPI_ROOT%/}"

zlib flex mpi の環境変数を適当な場所に追加


#### zlib
export ZLIB_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/zlib-1.2.8
_foamAddLib $ZLIB_ARCH_PATH/lib

#### flex
export FLEX_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/flex-2.5.37

#### xeon phi mpi
export MPI_LIB=$MPI_ARCH_PATH/libmic
_foamAddLib $MPI_LIB

設定を反映させるために

 source $HOME/.bashrc 

を実行.

zlib のビルド

$HOHE/Downloads など適当なディレクトリにソースをダウンロード・展開してコンパイルする.

 
wget http://zlib.net/zlib-1.2.8.tar.gz
tar zxvf zlib-1.2.8.tar.gz

cd zlib-1.2.8

CC=icc CXX=icpc CFLAGS=-mmic CXXFLAGS=-mmic LDFLAGS=-mmic ./configure --prefix=$ZLIB_ARCH_PATH
make
make install

flex のビルド

zlib と同様にソースをダウンロードしてクロスコンパイルする.


wget http://prdownloads.sourceforge.net/flex/flex-2.5.37.tar.bz2
tar jxvf flex-2.5.37.tar.bz2
cd flex

CC=icc CXX=icpc CFLAGS=-mmic CXXFLAGS=-mmic LDFLAGS=-mmic ./configure --prefix=$FLEX_ARCH_PATH --build=x86_64-unknown-linux-gnu --host=x86_64-k1om-linux
make
make install

3rd Party ビルドのための設定

$WM_THIRD_PARTY_DIR/etc/wmakeFiles/scotch/Makefile.inc.i686_pc_linux2.shlib-OpenFOAM-64 の編集

ここでは CFLAGS と LDFLAGS をホスト向けとコプロ向けに分離する(scotchのビルドに必要).


EXE             =
LIB             = .so
OBJ             = .o

MAKE            = make
AR              = icc
ARFLAGS         = -mmic -shared -o
CAT             = cat
CCS             = icc
CCP             = icc
CCD             = icc
CFLAGS_NATIVE   = -I$(MPI_ARCH_PATH)/include -I$(ZLIB_ARCH_PATH)/include -O3 -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -Drestrict=__restrict
CFLAGS          = -mmic $(CFLAGS_NATIVE)
CLIBFLAGS       = -mmic -shared -fPIC
LDFLAGS_NATIVE  = -lz -lm -lrt
LDFLAGS         = -mmic -L$(ZLIB_ARCH_PATH)/lib $(LDFLAGS_NATIVE) -pthread -L$(MPI_ARCH_PATH)/libmic -lmpi -ldl -Wl,--export-dynamic -lnsl -lutil
CP              = cp
LEX             = flex -Pscotchyy -olex.yy.c
LN              = ln
MKDIR           = mkdir
MV              = mv
RANLIB          = echo
YACC            = bison -pscotchyy -y -b y

$WM_THIRD_PARTY_DIR/scotch-6.0.0/src/libscotch/Makefile の編集

dummysizes と ptdummysizes は-mmic を付けずにコンパイルする.(CFLAGS と LDFLAGSを それぞれ CFLAGS_NATIVE,LDFLAGS_NATIVE に変更)
ptscotch は使わないので ptdummysizes は要らないかも知れない.


dummysizes$(EXE)                :       dummysizes.c                           \
                                        module.h                               \
                                        common.h                               \
                                        arch.h                                 \
                                        graph.h                                \
                                        geom.h                                 \
                                        mesh.h                                 \
                                        mapping.h                              \
                                        order.h                                \
                                        parser.h
                                        $(CCD) $(CFLAGS_NATIVE) -DSCOTCH_VERSION=$(VERSION) -DSCOTCH_RELEASE=$(RELEASE) -DSCOTCH_PATCHLEVEL=$(PATCHLEVEL) $(<) -o $(@) $(LDFLAGS_NATIVE)

ptdummysizes$(EXE)              :       dummysizes.c                           \
                                        module.h                               \
                                        common.h                               \
                                        dgraph.h                               \
                                        dorder.h
                                        $(CCD) $(CFLAGS_NATIVE) -DSCOTCH_VERSION=$(VERSION) -DSCOTCH_RELEASE=$(RELEASE) -DSCOTCH_PATCHLEVEL=$(PATCHLEVEL) $(<) -o $(@) $(LDFLAGS_NATIVE)

boost のビルド

$WM_PROJECT_DIR/etc/config/settings.sh の編集

CGAL はコンパイルに失敗するのでboost のみビルドする.
CGAL を使用するアプリケーションは使えない.(-> v2.2.2 なら無視してもよい?)


# boost and CGAL
# ~~~~~~~~~~~~~~
boost_version=boost_1_55_0 ##boost のバージョンに合わせて変更

CGAL と BOOST の記述を以下を以下のように編集.


#if [ -d "$CGAL_ARCH_PATH" ]
#then
#    if [ -d "$BOOST_ARCH_PATH" ]
#    then
#        _foamAddLib $BOOST_ARCH_PATH/lib
#    else
#        unset BOOST_ARCH_PATH
#    fi
#    _foamAddLib $CGAL_ARCH_PATH/lib
#else
#    unset BOOST_ARCH_PATH CGAL_ARCH_PATH MPFR_ARCH_PATH GMP_ARCH_PATH
#fi

if [ -d "$CGAL_ARCH_PATH" ]
then
    _foamAddLib $CGAL_ARCH_PATH/lib
else
    unset CGAL_ARCH_PATH
fi

_foamAddLib $BOOST_ARCH_PATH/lib

unset boost_version cgal_version

boost のソースをダウンロード・展開して3rd Party 以下にリンクを貼る.


cd $HOME/Downloads
wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.bz2/download
tar jxvf boost_1_55_0.tar.bz2

foam3rdParty
ln -s $HOME/Downloads/boost_1_55_0 boost_1_55_0

makeCGAL をコピーして makeBoost を作成

cp makeCGAL makeBoost

makeBoost を編集


boostPACKAGE=boost_1_55_0

#        ./bootstrap.sh \
#            --prefix=$BOOST_ARCH_PATH \
#            --with-libraries=thread \
#        && ./bjam -j $WM_NCOMPPROCS install \

        ./bootstrap.sh \
            --prefix=$BOOST_ARCH_PATH \
        && ./b2 -j $WM_NCOMPPROCS install \
            toolset=intel \
            cflags="-mmic -I$ZLIB_ARCH_PATH/include" \
            cxxflags="-mmic -I$ZLIB_ARCH_PATH/include -std=c++0x" \
            linkflags="-mmic -L$ZLIB_ARCH_PATH/lib -lz" \
            link=shared \
            runtime-link=shared \
            threading=multi \
            variant=release \
            --disable-icu \
            --without-iostreams \
            --without-python \

CGAL は必要ない(ビルドできない)ので# Build CGAL 以下を削除(or コメントアウト).

boost_1_55_0/tools/build/v2/user-config.jam に以下を追加

using mpi ;

boost のビルド

./makeBoost

ライブラリのビルド

$WM_PROJECT_DIR/Allwmake の編集

以下の行をコメントアウトしてOpenFOAM のライブラリを先にコンパイルする.アプリケーションは後でビルドする.

#applications/Allwmake $*

$WM_DIR/rules/linux64Icc 内ファイルの編集

general の編集
コプロ用のアーカイバ/リンカを指定


#CPP        = /lib/cpp -traditional-cpp $(GFLAGS)   ## この行をコメントアウトし
て以下を追加 

AR = x86_64-k1om-linux-ar
RANLIB = x86_64-k1om-linux-ranlib
CPP = x86_64-k1om-linux-cpp -traditional-cpp $(GFLAGS)
LD = x86_64-k1om-linux-ld

wmake をホスト向けにビルドする(cFLAGS/c++FLAGSの分離)
c の編集


cFLAGS_NATIVE   = $(GFLAGS) $(cWARN) $(cOPT) $(cDBUG) $(LIB_HEADER_DIRS) -fPIC
cGLAGS          = -mmic $(cFLAGS_NATIVE)

c++ の編集


c++FLAGS_NATIVE = $(GFLAGS) $(c++WARN) $(c++OPT) $(c++DBUG) $(ptFLAGS) $(LIB_HEADER_DIRS) -fPIC
c++FLAGS        = -mmic $(c++FLAGS_NATIVE) -I$(ZLIB_ARCH_PATH)/include -I$(FLEX_ARCH_PATH)/include

LINKLIBSO   = $(CC) $(c++FLAGS) -shared -Xlinker --add-needed -Xlinker --no-as-needed -L$(ZLIB_ARCH_PATH)/lib -lz -lz -L$(MPI_LIB) -lmpi

c++Opt の編集
-mmic オプションをつけるときは xHost を外す.

c++OPT      = -O2 -no-prec-di

wmake のビルド準備

$WM_DIR/src/Makefile の編集
cFLAGS, c++FLAGS を cFLAGS_NATIVE, c++FLAGS_NATIVE に変更

ライブラリのビルド

事前に余計なオブジェクトを掃除しておく.


foam
wcleanAll
 
./Allwmake

ここで WM_NCOMPPROCS を指定するとコンパイルが速くなる.

アプリケーションのビルド

Allwmake 中の applications/Allwmake $* のコメントを外す.

$WM_DIR/rules/linux64Icc/c++ の編集


LINKEXE = $(CC) $(c++FLAGS) -Xlinker --add-needed -Xlinker --no-as-needed -L$(MPI_ARCH_PATH)/libmic -lmpi -L$(ZLIB_ARCH_PATH)/lib -lz -L$(BOOST_ARCH_PATH)/lib -lboost_system -lboost_thread -L$(FOAM_LIBBIN)/$(FOAM_MPI) -lPstream -L$(FOAM_EXT_LIBBIN) -lscotch -lscotcherr -lscotcherrexit

アプリケーションのビルド

 ./Allwmake

を実行.

必要なOpenFOAMのライブラリが見つからない場合は
$WM_DIR/rules/linux64Icc/c++ を以下のように編集して OpenFOAM と ThirdParty の platfoams 以下のライブラリを手動でリンクしていく.


LINKEXE = $(CC) $(c++FLAGS) -Xlinker --add-needed -Xlinker --no-as-needed -L$(MPI_ARCH_PATH)/libmic -lmpi -L$(ZLIB_ARCH_PATH)/lib -lz -L$(BOOST_ARCH_PATH)/lib -lboost_system -lboost_thread  -L$(FOAM_LIBBIN)/$(FOAM_MPI) -lPstream -L$(FOAM_EXT_LIBBIN) -lscotch -lscotcherr -lscotcherrexit -L$(FOAM_LIBBIN) -lFVFunctionObjects -lIOFunctionObjects -lLESdeltas -lLESfilters -lODE -lOpenFOAM -lSLGThermo -lSloanRenumber -lautoMesh -lbarotropicCompressibilityModel -lblockMesh -lchemistryModel -lcloudFunctionObjects -lcoalCombustion -lcombustionModels -lcompressibleLESModels -lcompressibleRASModels -lcompressibleTurbulenceModel -lconversion -ldecompose -ldecompositionMethods -ldistributed -ldistributionModels -ldsmc -ldynamicFvMesh -ldynamicMesh -ledgeMesh -lengine -lextrudeModel -lfieldFunctionObjects -lfileFormats -lfiniteVolume -lfluidThermophysicalModels -lfoamCalcFunctions -lforces -lfvMotionSolvers -lfvOptions -lgenericPatchFields -lincompressibleLESModels -lincompressibleRASModels -lincompressibleTransportModels -lincompressibleTurbulenceModel -linterfaceProperties -ljobControl -llagrangian -llagrangianIntermediate -llagrangianSpray -llaminarFlameSpeedModels -lliquidMixtureProperties -lliquidProperties -lmeshTools -lmolecularMeasurements -lmolecule -lpairPatchAgglomeration -lpotential -lpyrolysisModels -lradiationModels -lrandomProcesses -lreactionThermophysicalModels -lreconstruct -lregionCoupled -lregionCoupling -lregionModels -lrenumberMethods -lsampling -lscotchDecomp -lsolidChemistryModel -lsolidMixtureProperties -lsolidParticle -lsolidProperties -lsolidSpecie -lsolidThermo -lspecie -lsurfMesh -lsurfaceFilmModels -lsystemCall -lthermalBaffleModels -lthermophysicalFunctions -ltopoChangerFvMesh -ltriSurface -lturbulenceDerivedFvPatchFields -ltwoPhaseMixture -ltwoPhaseProperties -lutilityFunctionObjects 

長いので改行して表示すると以下のようになる.

LINKEXE = $(CC) $(c++FLAGS) -Xlinker --add-needed -Xlinker --no-as-needed -L$(MPI_ARCH_PATH)/libmic -lmpi -L$(ZLIB_ARCH_PATH)/lib -lz -L$(BOOST_ARCH_PATH)/lib -lboost_system -lboost_thread -L$(FOAM_LIBBIN)/$(FOAM_MPI) -lPstream -L$(FOAM_EXT_LIBBIN) -lscotch -lscotcherr -lscotcherrexit -L$(FOAM_LIBBIN) -lFVFunctionObjects -lIOFunctionObjects -lLESdeltas -lLESfilters -lODE -lOpenFOAM -lSLGThermo -lSloanRenumber -lautoMesh -lbarotropicCompressibilityModel -lblockMesh -lchemistryModel -lcloudFunctionObjects -lcoalCombustion -lcombustionModels -lcompressibleLESModels -lcompressibleRASModels -lcompressibleTurbulenceModel -lconversion -ldecompose -ldecompositionMethods -ldistributed -ldistributionModels -ldsmc -ldynamicFvMesh -ldynamicMesh -ledgeMesh -lengine -lextrudeModel -lfieldFunctionObjects -lfileFormats -lfiniteVolume -lfluidThermophysicalModels -lfoamCalcFunctions -lforces -lfvMotionSolvers -lfvOptions -lgenericPatchFields -lincompressibleLESModels -lincompressibleRASModels -lincompressibleTransportModels -lincompressibleTurbulenceModel -linterfaceProperties -ljobControl -llagrangian -llagrangianIntermediate -llagrangianSpray -llaminarFlameSpeedModels -lliquidMixtureProperties -lliquidProperties -lmeshTools -lmolecularMeasurements -lmolecule -lpairPatchAgglomeration -lpotential -lpyrolysisModels -lradiationModels -lrandomProcesses -lreactionThermophysicalModels -lreconstruct -lregionCoupled -lregionCoupling -lregionModels -lrenumberMethods -lsampling -lscotchDecomp -lsolidChemistryModel -lsolidMixtureProperties -lsolidParticle -lsolidProperties -lsolidSpecie -lsolidThermo -lspecie -lsurfMesh -lsurfaceFilmModels -lsystemCall -lthermalBaffleModels -lthermophysicalFunctions -ltopoChangerFvMesh -ltriSurface -lturbulenceDerivedFvPatchFields -ltwoPhaseMixture -ltwoPhaseProperties -lutilityFunctionObjects

最低限自分の利用するアプリケーション(blockMesh, icoFoam など)がコンパイルできていれば良い.
修正が難しそうなものは後回しにして情報が入り次第対応していく.

$HOME/.bashrc の設定2

MICコプロ上でプリやポスト処理をするととても時間がかかるので,ホスト向けにインストールされた OpenFOAM と Xeon Phi 向けにインストールされた OpenFOAM を選択して使えるようにしておく.
ここでは,ホスト向け OpenFOAM が /opt/NativeOpenFOAM 以下にインストールされているとする.


# User specific aliases and functions

## Intel compiler setting ##
export PATH=/usr/linux-k1om-4.7/bin:$PATH

## OpenFOAM setting ##
export I_MPI_ROOT=/opt/intel/impi/4.1.3.045

alias of230Mic='export LD_LIBRARY_PATH=$I_MPI_ROOT/libmic:/opt/intel/composerxe/lib/mic:$LD_LIBRARY_PATH; source /opt/OpenFOAM/OpenFOAM-2.3.0/etc/bashrc; source $I_MPI_ROOT/mic/bin/mpivars.sh'
alias of230Native='export LD_LIBRARY_PATH=/opt/intel/impi/4.1.3/lib64:/opt/intel/composerxe/lib/intel64:$LD_LIBRARY_PATH; source /opt/NativeOpenFOAM/OpenFOAM-2.3.0/etc/bashrc'

ホストにログインして of230Native を実行すればホスト上で OpenFOAM が利用できる.
MIC にログインした場合は of230Mic を実行する.

Home > OpenFOAM v2.3.0 on Xeon Phi

Search
Feeds
Meta

Return to page top