DALAB情報発信用ブログ:OpenCAE+GPGPU+Peridynamics編

DALABで行っている研究活動の中で、OpenCAEやGPGPUや破壊解析の取り組みについてまとめてゆきます。

並列版Code_Asterの構築:aster/PAR11.3のprofile.sh

2013年05月21日 10時17分30秒 | OpenCAE活用
# profile for Code_Aster version 11.3

if [ -z "$DEFINE_PROFILE_ASTER_VERSION" ]; then
export DEFINE_PROFILE_ASTER_VERSION=done
#--- ifndef DEFINE_PROFILE_ASTER_VERSION ---------------------------------------

PATH=/opt/ParMetis-3.2.0:\
/opt/aster/public/gmsh-2.5.0-Linux:\
/opt/aster/public/med-3.0.6:\
/opt/aster/public/hdf5-1.8.8:\
/usr/lib/gcc/x86_64-linux-gnu/4.6:\
/bin:\
/usr/bin:$ASTER_ROOT/outils:$PATH
export PATH

LD_LIBRARY_PATH=/opt/scotch_5.1.11_esmumps_mpi/lib:\
/opt/mumps-4.10.0_mpi/lib:\
/opt/aster/public/metis-4.0.3/lib:\
/opt/aster/public/med-3.0.6/lib:\
/opt/aster/public/hdf5-1.8.8/lib:\
/usr/lib/x86_64-linux-gnu:\
/usr:\
/usr/lib/gcc/x86_64-linux-gnu/4.6:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

PYTHONPATH=/opt/aster/lib/python2.7/site-packages:\
/usr/lib/python2.7/dist-packages:$PYTHONPATH
export PYTHONPATH

#?OPT_ENV?




#--- endif DEFINE_PROFILE_ASTER_VERSION ----------------------------------------
fi

並列版Code_Asterの構築:mumps-4.10.0_mpiのMakefile.inc

2013年05月21日 06時03分53秒 | OpenCAE活用
#
# This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011
# modified for Code_Aster setup (see fields like ?CC?)
#
#Begin orderings

# NOTE that PORD is distributed within MUMPS by default. If you would like to
# use other orderings, you need to obtain the corresponding package and modify
# the variables below accordingly.
# For example, to have Metis available within MUMPS:
# 1/ download Metis and compile it
# 2/ uncomment (suppress # in first column) lines
# starting with LMETISDIR, LMETIS
# 3/ add -Dmetis in line ORDERINGSF
# ORDERINGSF = -Dpord -Dmetis
# 4/ Compile and install MUMPS
# make clean; make (to clean up previous installation)
#
# Metis/ParMetis and SCOTCH/PT-SCOTCH (ver 5.1 and later) orderings are now available for MUMPS.
#

# SCOTCHDIR = ?HOME_SCOTCH?
SCOTCHDIR = /opt/scotch_5.1.11_esmumps_mpi
ISCOTCH = -I$(SCOTCHDIR)/include
# You have to choose one among the following two lines depending on
# the type of analysis you want to perform. If you want to perform only
# sequential analysis choose the first (remember to add -Dscotch in the ORDERINGSF
# variable below); for both parallel and sequential analysis choose the second
# line (remember to add -Dptscotch in the ORDERINGSF variable below)

# LSCOTCH = -L$(SCOTCHDIR)/lib -lesmumps -lscotch -lscotcherr
LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr


LPORDDIR = $(topdir)/PORD/lib/
IPORD = -I$(topdir)/PORD/include/
LPORD = -L$(LPORDDIR) -lpord

#LMETISDIR = Directory containing Metis library
#LMETISDIR = ?HOME_METIS?/lib
LMETISDIR = /opt/ParMetis-3.2.0
#IMETIS = # Metis doesn't need include files (Fortran interface avail.)

# You have to choose one among the following two lines depending on
# the type of analysis you want to perform. If you want to perform only
# sequential analysis choose the first (remember to add -Dmetis in the ORDERINGSF
# variable below); for both parallel and sequential analysis choose the second
# line (remember to add -Dparmetis in the ORDERINGSF variable below)

# LMETIS = -L$(LMETISDIR) -lmetis
LMETIS = -L$(LMETISDIR) -lparmetis -lmetis

# The following variables will be used in the compilation process.
# Please note that -Dptscotch and -Dparmetis imply -Dscotch and -Dmetis respectively.
ORDERINGSF = -Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis
#ORDERINGSF = -Dscotch -Dpord -Dmetis
ORDERINGSC = $(ORDERINGSF)

LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH)
IORDERINGSF = $(ISCOTCH)
IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH)

#End orderings
########################################################################
################################################################################

PLAT =
LIBEXT = .a
OUTC = -o
OUTF = -o
RM = /bin/rm -f
#CC = ?CC?
#FC = ?F90?
#FL = ?LD?
CC = mpicc
FC = mpif90
FL = mpif90
# WARNING: AR must ends with a blank space!
AR = ar vr
#RANLIB = ranlib
RANLIB = echo
# See point 17 in the FAQ to have more details on the compilation of mpich with gfortran
#SCALAP = /usr/lib/libscalapack-openmpi.a /usr/lib/libblacs-openmpi.a /usr/lib/libblacsF77init-openmpi.a /usr/lib/libblacs-openmpi.a
SCALAP = /opt/scalapack/lib/libscalapack.a /opt/acml5.3.1/gfortran64/lib/libacml.a
INCPAR = -I/usr/include/openmpi $(IPORD)
LIBPAR = $(SCALAP) -L/usr/lib -lmpi -lmpi_f77
#LIBPAR = $(SCALAP) -lutil -ldl -lpthread
#LIBPAR = -lmpi++ -lmpi -ltstdio -ltrillium -largs -lt
INCSEQ = -I$(topdir)/libseq
LIBSEQ = -L$(topdir)/libseq -lmpiseq
#LIBBLAS = -L/usr/lib/xmm/ -lf77blas -latlas
#LIBBLAS = ?MATHLIB?
LIBBLAS = -L/opt/acml5.3.1/gfortran64/lib/ -lacml
LIBOTHERS = -lpthread
#Preprocessor defs for calling Fortran from C (-DAdd_ or -DAdd__ or -DUPPER)
CDEFS = -DAdd_

#Begin Optimized options
#OPTF = -O -Dintel_ -DALLOW_NON_INIT ?F90FLAGS?
#OPTL = -O ?LDFLAGS?
#OPTC = -O ?CFLAGS?
OPTF = -O -Dintel_ -DALLOW_NON_INIT -O2 -ffixed-line-length-0 -x f77-cpp-input -fPIC -fopenmp
OPTL = -O -fopenmp
OPTC = -O -O2 -fno-stack-protector -fPIC -fopenmp
#End Optimized options
#INCS = $(INCSEQ)
#LIBS = $(LIBSEQ)
#LIBSEQNEEDED = libseqneeded
INCS = $(INCPAR)
LIBS = $(LIBPAR)
LIBSEQNEEDED =

DEXCS2012-Salomeの有効活用:並列版Code_Asterの構築手順(3)

2013年05月20日 17時50分23秒 | OpenCAE活用
単独実行版の構築が続きます。段々複雑な手順になりますが、指示にしたがって確実に進めてください。

■ PT-Scotchのコンパイル

PT-Scotchは、解析モデルを領域分割するときやメッシュの情報を構成するときの、グラフオーダリングで用いるツールで、この並列処理版がPT-Scotchになります。ここでは並列処理版のptscotchをコンパイルします。

インストールファイルのディレクトリ~/Install_Filesにある展開したCode_Asterのソースファイル中にあるscotch-5.1.11_esmumpsを、/optにコピーしてmpiコンパイラでコンパイルして並列処理のツールを構築します。

$ cp ~/Install_Files/aster-full-src-11.3.0/SRC/scotch-5.1.11_esmumps-2.tar.gz /opt/
$ cd /opt
$ tar xfvz scotch-5.1.11_esmumps-2.tar.gz
$ mv scotch_5.1.11_esmumps scotch_5.1.11_esmumps_mpi
$ cd scotch_5.1.11_esmumps_mpi/src

ここで修正作業が必要です。ディレクトリの中に構築用設定ファイル Makefile.inc があります。このファイルで、?**?として書き換えが必要な部分が6つあるので。適当なエディタ(viなど)で修正してください。慎重に作業を行うには、Makefile.incのバックアップをMakefile.inc.orgにコピーして作った上で修正すると、後で変更箇所をdiffで確かめることができます。

$ cp Makefile.inc Makefile.inc.org
$ vi Makefile.inc

変更箇所:6つ
CCS = ?CC? → gcc
CCD = ?CC? → gcc -I /usr/include/mpi
CFLAGS = ?CFLAGS? (以下そのまま) → -O3 -lm (以下そのまま)
LEX = ?FLEX? -Pscotchyy -olex.yy.c → flex -Pscotchyy -olex.yy.c
RANLIB = ?RANLIB? → ranlib
YACC = ?YACC? -pscotchyy -b y → bison -pscotchyy -b y

まず最初に、単独実行版scotchをコンパイルしておきます。ただしエラーで終了しますが、必要なファイルは準備されて、並列版Code_Asterでは、次の並列版を利用するのでそのまま進めます。

$ make scotch

次に目的となる並列実行版のptscotchをコンパイルします。

$ make ptscotch

エラーがなく、「cp libptesmumps.a ../../lib / make[1]: ディレクトリ `/opt/scotch_5.1.11_esmumps_mpi/src/esmumps' から出ます」と表示されたら完了です。

■ MUMPSのコンパイル

MUMPSは、並列処理で疎行列連立方程式の直接解法ソルバーで、並列版Code_Asterで用います。作業ではMakefile.incを修正しますが、多数の書き換えが必要なので注意して進めてください。

インストールファイルのディレクトリ~/Install_Filesにある展開したCode_Asterのソースファイル中にあるmumps-4.10.0を、/optにコピーしてmpiコンパイラでコンパイルして並列処理のツールを構築します。なおasterのソースに含まれるmumpsのバージョンに注意してください。

$ cp ~/Install_Files/aster-full-src-11.3.0/SRC/mumps-4.10.0-1.tar.gz /opt/
$ cd /opt
$ tar xfvz mumps-4.10.0-1.tar.gz
$ mv mumps-4.10.0 mumps-4.10.0_mpi
$ cd mumps-4.10.0_mpi/

ここで修正作業が必要です。ディレクトリの中に構築用設定ファイル Makefile.inc があります。このファイルでは多数の書き換えが必要なので、このブログの別の記事「並列版Code_Asterの構築:mumps-4.10.0_mpiのMakefile.inc」にまとめたmumps-4.10.0_mpi用のMakefile.incの内容を、エディタで置き換えてください。なおacmlのバージョンは頻繁に更新されるので注意してください。慎重に作業を行うには、Makefile.incのバックアップをMakefile.inc.orgにコピーして作った上で修正すると、後で変更箇所をdiffで確かめることができます。

$ cp Makefile.inc Makefile.inc.org
$ vi Makefile.inc

以上の準備ができたら、makeでコンパイルを実行します。

$ make all

途中で警告が出てもコンパイルは進みますので、暫く待ちます。最後に「mpif90 -o zsimpletest (途中省略) -lpthread / make[1]: ディレクトリ `/opt/mumps-4.10.0_mpi/examples' から出ます」と表示されたら完了です。

DEXCS2012-Salomeの有効活用:並列版Code_Asterの構築手順(2)

2013年05月20日 05時32分15秒 | OpenCAE活用
まずは単独実行でも並列実行でも利用する基本数値計算ライブラリの準備をしておきます。

■ ACMLのコンパイル

単独板Code_AsterのコンパイルにACMLを数値計算ライブラリとして用いるために、コンパイルしておきます。なおACMLと言うのは、AMD Core Math Libraryと言う意味です。利用するバージョンに合わせてファイル名などに注意します。

$ cd ~/Install_Files/
$ mkdir ./acml
$ cp acml-5-3-1-gfortran-64bit.tgz ./acml
$ cd ./acml
$ tar xfvz acml-5-3-1-gfortran-64bit.tgz
$ ./install-acml-5-3-1-gfortran-64bit.sh -accept -installdir=/opt/acml5.3.1

「ACML installation complete」と表示されたら成功です。

$ echo /opt/acml5.3.1/gfortran64/lib | sudo tee -a /etc/ld.so.conf.d/amd_math.conf
$ sudo ldconfig

以上でライブラリとして利用できるようにします。sudoに対して作業者のパスワードを入力します。

これで準備ができましたので、並列版のベースとなる単独版Code_Asterのコンパイルを進めます。

■ 単独版Code_Asterのコンパイル

まずは、単独版Code_Asterを/optにコンパイルします。計算の高速化のために、数値計算ライブラリは先にコンパイルしたACMLを用います。この設定のために、sedコマンドで、setuup.cfgを書き換えます。Code_AsterとACMLのバージョンに注意します。

$ cd ~/Install_Files
$ tar xfvz aster-full-src-11.3.0-3.noarch.tar.gz
$ cd aster-full-src-11.3.0/
$ sed -i "s:PREFER_COMPILER\ =\ 'GNU':PREFER_COMPILER\ =\'GNU_without_MATH'\nMATHLIB=\ '-L/opt/acml5.3.1/gfortran64/lib -lacml':g" setup.cfg

実際のコンパイルは次にコマンドで実行します。

$ python setup.py install

コンパイルが進み、継続を確認するのでyで進めます。さらに確認や構築が進みますが、相等に時間がかかります。エラー表示がなく「Installation of : Code_Aster + 12 of its prerequisites」が表示されたらひとまず完了です。なおインストール先は/opt/asterになり、この中にSTA11.3ができており、これが開発版11.3の単独実行ソルバーになります。

インストール先/opt/asterが準備できたので、並列計算用のホストファイルを作成します。まずhostnameコマンドでインストールするコンピュータ名を確認します。ここではdexcs2012でした。次に、「アプリケーション」→「システムツール」→「システムモニター」→「リソース」で稼働しているCPUのコア数を確認します。並列処理を目指しているので複数必要です。ここでは4個でした。もし1の場合は仮想マシンの設定を確認修正してください。以下のコマンドのcpu=の後の数字は使用するプロセッサー数を入力します。

$ echo dexcs2012 cpu=4 >> /opt/aster/etc/codeaster/mpi_hostfile

それでは、並列版Code_Asterのコンパイルを目指して、様々なツールを準備します。以下の手順にしたがって進めます。

■ ScaLAPACKのコンパイル

並列処理する行列数値計算ライブラリのScaLAPACKをコンパイルします。インストーラーを展開したときのバージョンに注意して進めます。具体的には、ScaLAPACK(Scalable Linear Algebra PACKage)は、分散メモリ型のコンピュータ向けに開発された高性能なルーチン群です。ScaLAPACKは、連立1次方程式、線形最小二乗問題、固有値問題、特異値問題を解くことができます。また、行列の分解や条件数の計算も行うことができます。

$ cd ~/Install_Files
$ tar xfvz scalapack_installer.tgz
$ cd scalapack_installer_1.0.2

先にインストールしたacmlのバージョンに注意して、セットアップコマンドを実行します。

$ ./setup.py --lapacklib=/opt/acml5.3.1/gfortran64/lib/libacml.a --mpicc=mpicc --mpif90=mpif90 --mpiincdir=/usr/lib/openmpi/include --prefix=/opt/scalapack

コンパイルが進み最後の段階で、「BLACS: error running BLACS test routines xCbtest 」というエラーが最後に表示されますが、/opt/scalapack/lib/libscalapack.aのファイルが作成されていれば、コンパイルは成功しているので、以下のコマンドで確認します。

$ ls /opt/scalapack/lib

■ ParMETISのコンパイル

並列処理用データ分割ツール ParMetis をインストールします。Metisは構造解析のモデルを領域分割するツールで、この並列処理版がParMETISです。コンパイルは、以下のコマンドを実行してください。

$ cp ~/Install_Files/ParMetis-3.2.0.tar.gz /opt
$ cd /opt
$ tar xfvz ParMetis-3.2.0.tar.gz
$ cd ParMetis-3.2.0

ここで修正作業が必要です。ディレクトリの中に構築用設定ファイル Makefile.in があります。これに XTRALIBS = -lmpi を追加設定の場所に記入します。適当なエディタ(viなど)で行ってください。慎重に作業を行うには、Makefile.inのバックアップをMakefile.in.orgにコピーして作った上で修正すると、後で変更箇所をdiffで確かめることができます。

$ cp Makefile.in Makefile.in.org
$ vi Makefile.in

出来たらmakeコマンドでコンパイルします。

$ make

暫く待ちます。エラーが出ずに下記のメッセージが出たら完成です。
chmod 744 ../Graphs/pometis3.2.0 / make[1]: ディレクトリ `/opt/ParMetis-3.2.0/Programs' から出ます

DEXCS2012-Salomeの有効活用:並列版Code_Asterの構築手順(1)

2013年05月19日 17時20分55秒 | OpenCAE活用
ここでは、並列版Code_Asterの活用を目指してソースコンパイルに挑戦します。なおここで示した構築手順は、Code_Asterの活用について情報提供を頂いているMKさんの以下の資料を参考にしています。

構築手順まとめ:https://sites.google.com/site/codeastersalomemeca/home/code_asterno-heiretuka

構築するシステムは、平成25年5月19日現在の最新版である安定版10.8と開発版11.3を対象として、それぞれのCode_Asterソースコードを用いて、単独実行と並列実行の2種類のソルバーシステムを構築することを目指します。以下の手順では、最初に開発版11.3の単独実行を構築した後で並列実行を構築します。続いて安定版10.8についても同様に2段階で進めます。全体としては、以下の4種類のシステムを構築します。
  開発版11.3 : 単独実行 STA11.3(stable)  並列実行 PAR11.3
  安定版10.8 : 単独実行 STA10.8(stable)  並列実行 PAR10.8

検証に用いたベースのシステムは DEXCS2012-Salome-D1-B1-64(平成25年5月末公開予定) なのですが、基本的にOSとしてはUbuntu 12.04(64) になります。なお以下の手順は 64bitのDEXCS2012-Salomeを前提としています。大容量メモリの活用を考えて、64bit版でのみ構築を検証します。

■ 準備

まずはDEXCSをインストールしますが、並列高速処理を目指すので、複数CPUコアや大容量メモリが前提です。それなりのハードウエアが必要ですが、仮想マシンでの構築においては、ゲストOSに対して、CPUコアは2以上4程度、メモリは4GB程度以上、HDDは50GB程度は確保する必要があります。なお、以下の手順では仮想マシンを用いて検証していますが、並列実行で高速化を目指すならば直截にHDDにインストールする方法が良いですね。

構築が完了したらネットワークを接続して、システムアップデートを行っておきます。DEXCS2012-Salomeでは「アプリケーション」→「システムツール」→「システム設定」→「詳細の概要」→「システムの更新」で進め、再チェックしてアップデートを完了させておきます。なお構築手順を検証したシステムは、ユーザーはdexcsとしています。

■ インストール先など

この作業は dexcs ユーザーとして行っています。これはそれぞれの設定で読み替えてください。
ダウンロードしたファイルの保存:~/Install_Files (ユーザーdexcsのホームディレクトリ内/home/dexcs/にInstall_Filesdexcsを作成)
$ mkdir ~/Install_Files

システムをインストールする場所:/opt (この中に構築したソルバーシステムが作られます。初めはgoogle,salomeなどがあります)

■ 必要なファイル5個のダウンロード

Code_Aster : aster-full-src-11.3.0-3.noarch.tar.gz → http://www.code-aster.org/V2/spip.php?article272 (最新版は11.3ですが、パッチレベルは更新される場合もあります)
ACML : acml-5-3-1-gfortran-64bit.tgz → http://developer.amd.com/tools-and-sdks/cpu-development/amd-core-math-library-acml/acml-downloads-resources/#download(最新版5-3-1を用います)
ParMETIS : ParMetis-3.2.0.tar.gz → http://glaros.dtc.umn.edu/gkhome/metis/parmetis/download (最新版がありますが、実績のある3.2.0を旧版の中から探してダウンロードします。)
ScaLAPACK :  scalapack_installer.tgz → http://www.netlib.org/scalapack/ (MenuよりScaLAPACK Installer [for Linux]を選択して、リンク先にある1.0.1をダウンロードします。)
PETSc : petsc-3.3-p7.tar.gz → http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/(沢山あるファイル一覧から開発版で指定のバージョンをダウンロードします。)

■ 色々な準備作業

まずここでは、DEXCS2012-SalomeにあるChromeを用いてダウンロードしており、ホームディレクトリの~/Downloadsに以上の5つのファイルがあるので、これを~/Install_Filesに移動mvしておきます。
$ mv ~/Downloads/* ~/Install_Files

次に、インストール先の/optの所有者を変更します。本来/optはrootが所有ですが、導入や利用を考えて一般ユーザーdexcs(ここでの設定)にしておきます。要は作業者dexcsが読み書きできるようにします。sudoコマンドを実行するときは最初に、作業者のパスワードを入力します。
$ sudo chown dexcs /opt/

■ 追加パッケージのインストール

構築に必要なパッケージを sudo apt-get install でインストールします。途中で「続行しますか?」と何か聞かれたら、指示に従ってyで進めます。以下のコマンドラインで、全てを一度に導入できます。
sudo apt-get install gfortran g++ python-dev python-qt4 python-numpy liblapack-dev libblas-dev tcl tk zlib1g-dev bison flex checkinstall openmpi-bin openmpi-dev

gfortran g++ → コンパイラの追加
python-dev python-qt4 python-numpy → Pythonの機能追加
liblapack-dev libblas-dev → lapack,blasに対応する数値処理ライブラリの追加
tcl tk → スクリプト言語tclとGUIツールキットtk
zlib1g-dev → 圧縮ファイル対応ライブラリの追加
bison flex → コンパイルツールの追加
checkinstall → コンパイル支援ツールの追加
openmpi-bin openmpi-dev → 並列処理用MPIの実装

エラー無く最後までインストールが進んだら、追加パッケージの準備は完了です。最後には「build-essential (11.5ubuntu2.1) を設定しています」と表示されています。