平衡点
2008/07/19
_ 宇宙研 SX-6 での計算環境構築
SPMODEL が使えるようになるまでのまとめ. 鬼門は NetCDF ライブラリの構築. やっぱり cross compile は上手くいかない...
NetCDF
Version 3.6.2 以降のライブラリ構築には今の所失敗している. 多分リンカ・ローダを適切に設定すれば良いんだろうけど...(多分. 違うかな?)
ライブラリの構築はセルフコンパイルで行なう. install したのは netcdf の ver.3.6.1. 3.6.0-p1 についてはNEC SX architectures, including the Earth Simulatorが参考になるだろう. 以下, [sx6] はフロントエンド, [node00] はインタラクティブノードのこと.
ソースとパッチの取得
フロントエンドで作業する.
先ずソースを取得する. 日本なんでミラーサイトの方が近い.
[sx6]$ mkdir -p ~/comp/netcdf [sx6]$ cd ~/comp/netcdf [sx6]$ wget http://www.gfd-dennou.org/arch/ucar/netcdf/netcdf-3.6.1.tar.gz
次にパッチの取得. SX-6 用のパッチは <URL:http://www.unidata.ucar.edu/software/netcdf/patches/nec-sx-361-patches.html:title> にある. これらを取得する.
[sx6]$ wget http://www.unidata.ucar.edu/software/netcdf/patches/blksz-361-patch [sx6]$ wget http://www.unidata.ucar.edu/software/netcdf/patches/f90-361-patch [sx6]$ wget http://www.unidata.ucar.edu/software/netcdf/patches/nec_sx_vector_ncx-361-patch [sx6]$ wget http://www.unidata.ucar.edu/software/netcdf/patches/fileinf-361-patch
ソースの展開とパッチ当て.
フロントエンドで作業する(node00 へログインしたら, patch コマンドの挙動が違ったので, パッチが当てられなかった. man も見られなかったので, フロントエンドで作業した).
[sx6]$ tar xvzf netcdf-3.6.1.tar.gz [sx6]$ cd netcdf-3.6.1/src [sx6]$ patch -p0 < ../../blksz-361-patch [sx6]$ patch -p0 < ../../f90-361-patch [sx6]$ patch -p0 < ../../nec_sx_vector_ncx-361-patch [sx6]$ patch -p0 < ../../fileinf-361-patch
configure
インタラクティブノードで作業する.
先ず環境変数を設定する.
[node00]$ export FC='f90 -dW' [node00]$ export F90='f90 -dW' [node00]$ export CC=c++ [node00]$ export CXX=c++ [node00]$ export TEMP_LARGE=$HOME/work
TEMP_LARGE に指定した $HOME/work は宇宙研 SX-6 で提供されている巨大ストレージ.
次に configure スクリプトを実行する. --prefix で install 先を指定する. 今回は $HOME/dennou 以下に install する事に.
[node00]$ cd ~/comp/netcdf/netcdf-3.6.1/src [node00]$ ./configure --prefix=$HOME/dennou
これで compile すれば良い...わけではない. LINKER の修正が必要. macros.make で
# source: diff @@ -55,9 +55,9 @@ F90LDFLAGS = $(LDFLAGS) LINK.c = $(CC) -o $@ $(CFLAGS) $(LDFLAGS) LINK.cxx = $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) -LINK.F = $(FC) -o $@ $(FFLAGS) $(FLDFLAGS) -LINK.f = $(FC) -o $@ $(FFLAGS) $(FLDFLAGS) -LINK.F90 = $(F90) -o $@ $(F90FLAGS) $(F90LDFLAGS) +LINK.F = $(CXX) -o $@ $(FFLAGS) $(FLDFLAGS) -f90lib +LINK.f = $(CXX) -o $@ $(FFLAGS) $(FLDFLAGS) -f90lib +LINK.F90 = $(CXX) -o $@ $(F90FLAGS) $(F90LDFLAGS) -f90lib
としておく.
build, install
インタラクティブノードで.
[node00]$ make
install には微妙に修正が必要. rules.make にて
# source: diff @@ -115,19 +115,19 @@ # $(INSTALL)ation: # $(INCDIR)/$(HEADER): $(INCDIR) $(HEADER) FORCE - $(INSTALL) $(HEADER) $@ + $(INSTALL) $(INCDIR) $(HEADER) $(INCDIR)/$(HEADER1): $(INCDIR) $(HEADER1) FORCE - $(INSTALL) $(HEADER1) $@ + $(INSTALL) $(INCDIR) $(HEADER1) $(INCDIR)/$(HEADER2): $(INCDIR) $(HEADER2) FORCE - $(INSTALL) $(HEADER2) $@ + $(INSTALL) $(INCDIR) $(HEADER2) $(INCDIR)/$(HEADER3): $(INCDIR) $(HEADER3) FORCE - $(INSTALL) $(HEADER3) $@ + $(INSTALL) $(INCDIR) $(HEADER3) # $(LIBDIR)/$(LIBRARY): $(LIBDIR) $(LIBRARY) FORCE - $(INSTALL) $(LIBRARY) $@ + $(INSTALL) $(LIBDIR) $(LIBRARY) # $(BINDIR)/$(PROGRAM): $(BINDIR) $(PROGRAM) FORCE - $(INSTALL) $(PROGRAM) $@ + $(INSTALL) $(BINDIR) $(PROGRAM) # $(BINDIR) \ $(INCDIR) \ @@ -142,9 +142,9 @@ -test -d $@ || mkdir $@ # $(MANDIR)/man1/$(MANUAL): $(MANDIR)/man1 $(MANUAL) - $(INSTALL) $(MANUAL) $@ + $(INSTALL) $(MANDIR)/man1 $(MANUAL) $(MANDIR)/man3/$(MANUAL): $(MANDIR)/man3 $(MANUAL) - $(INSTALL) $(MANUAL) $@ + $(INSTALL) $(MANDIR)/man3 $(MANUAL) $(MANDIR)/man3f/$(MANUAL): $(MANDIR)/man3 $(MANDIR)/man3/$(MANUAL) \ $(MANDIR)/man3f rm -f $@
とする. その後で
[node00]$ make install
ちなみに make test 「型の不一致」で転ぶ. 3.6.0-p1 の頃のパッチを覗きながら, 適宜修正すると make test は通るけれど, 結局力技で型定義等を弄っているので, 気にしないことにする.
gt4f90io のインストール
フロントエンドで作業する.
[sx6]$ mkdir -p ~/comp/gt4f90io
[sx6]$ cd ~/comp/gt4f90io
[sx6]$ wget http://www.gfd-dennou.org/library/gtool4/gt4f90io/gt4f90io_current.tgz
[sx6]$ tar xvzf gt4f90io_current.tgz
[sx6]$ cd gt4f90io-20080605
[sx6]$ FC=sxf90 AR=sxar ARFLAGS=ru MAKE=make RANLIB=touch \
NCDUMP=$HOME/denou/bin/ncdump \
SYSFFLAGS="-w -dW -sx6 -Wf'-pvctl loopcnt=65536 nodivloop noloopchg -O'" \
AR=sxar ARFLAGS=rv \
./configure --prefix=$HOME/dennou \
--with-netcdf=$HOME/dennou/lib/libnetcdf.a \
[sx6]$ gmake
[sx6]$ gmake install
ちなみに make test を実行する場合には, test プログラムを逐一 submit する必要がある. けれど, 幾つかのテストは通らない. 例えば dc_date の test で
...
*** Error [AssertEQ] *** Checking DiffTime, Create/toChar test 2 FAILURE
check = 0000-00-25T00:00:00.000000000000000000000000D+
is NOT EQUAL to
answer = 0000-00-25T00:00:00
なんてなったりしている. 弄るなら dc_test なのかな?
ISPACK
フロントエンドでクロスコンパイルする. ソースの取得, 展開は
[sx6]$ mkdir -p ~/comp/ispack [sx6]$ cd comp/ispack [sx6]$ wget http://www.gfd-dennou.org/library/ispack/ispack.tar.gz [sx6]$ tar xvzf ispack.tar.gz [sx6]$ cd ispack-0.71
で終了. fepack.F の一部に, インデントで Tab が使われているのを修正する.
# source: diff
diff -urNad ispack-0.71~/fepack/src/fepack.F ispack-0.71/fepack/src/fepack.F
--- ispack-0.71~/fepack/src/fepack.F 1998-10-10 02:43:04.000000000 +0900
+++ ispack-0.71/fepack/src/fepack.F 2007-10-16 19:43:09.000000000 +0900
@@ -209,7 +209,7 @@
DO I=1,ND
CALL FHUGET(IU,4,IW)
CALL FLCEN4(IW,RD)
- DD(I)=RD
+ DD(I)=RD
END DO
#elif IEEE
DO 10 I=1,ND
その後 Mkiclude を修正.
# source: diff
--- Mkinclude.orig 2008-07-19 06:10:36.000000000 +0900
+++ Mkinclude 2008-07-19 06:13:24.000000000 +0900
@@ -23,24 +23,24 @@
c2pack p2pack p3pack p3pack-mpi snpack-mpi sppack-mpi sopack-mpi \
dkpack
LIBNAME = libisp
-DESTDIR = .
+DESTDIR = $(HOME)/dennou/lib
STATICLIB = $(DESTDIR)/$(LIBNAME).a
SHAREDLIB = $(DESTDIR)/$(LIBNAME).so
PACKFILE = $(DESTDIR)/ispack.f
SHELL = /bin/sh
MAKE = make
-FC = g77
-FFLAGS = -O -fPIC
-MPIFC = mpif77
-MPIFFLAGS = -O
-CC = gcc
-CFLAGS = -shared -Wl,-soname,$(LIBNAME).so
-AR = ar
-ARFLAGS = vru
+FC = sxf90
+FFLAGS = -g -w -sx6 -Wf'-pvctl nodivloop noloopchg -O'
+MPIFC = sxmpif90
+MPIFFLAGS = -g -w -sx6 -Wf'-pvctl nodivloop noloopchg -O'
+CC = sxcc
+CFLAGS = -g
+AR = sxar
+ARFLAGS = vr
RM = rm -f
CP = cp
-CPP = cpp
-CPPFLAGS = -DDIRECT -DIEEE -DASCII -DLEN -DET
+CPP = /usr/bin/cpp
+CPPFLAGS = -DDIRECT -DFORMAT -DIEEE -DASCII -DNEC -DSPLIT
MV = mv -f
-RANLIB = ranlib
+RANLIB = touch
CAT = cat
そして
[sx6]$ make [sx6]$ make static
で終了.
spml
フロントエンドでクロスコンパイルする. ソースの取得, 展開は cvs を scp で転送して行なった.
[sx6]$ RANLIB=touch AR=sxar ARFLAGS=rv FC=sxf90 \
SYSFFLAGS="-w -dW -sx6 -Wf'-pvctl nodivloop noloopchg -O'" \
./configure --prefix=$HOME/dennou \
--with-ispack=$HOME/dennou/lib/libisp.a \
--with-netcdf=$HOME/dennou/lib/libnetcdf.a \
--with-gt4f90io=$HOME/dennou/lib/libgt4f90io.a \
--with-lapack=/SX/usr/lib0/liblapack.a \
--with-mpifc=`which sxmpif90`
[sx6]$ make
[sx6]$ make install
その後で, コンパイル用のスクリプトである spmfrt, mpispmfrt を修正する. クロスコンパイルの際に, 一度オブジェクトを生成した後で実行ファイルを作成するようにする.例えばこんな感じに.
# source: bash linkf="sxc++ -f90lib" # echo $fc $fflags "$@" $libs $ldflags $ldlibs $fc "-c" $fflags "$@" $libs $ldflags $ldlibs base=`basename "$@" .f90` obj=$base.o exe=$base.out $linkf $fflags $obj $libs $ldflags $ldlibs -o $exe rm $obj
\$fflags に最適化オプションがあると, sxc++ での実行ファイル作成時に困るので, 適当に分離しておくと良い. mpispmfrt の場合は \$linkf が sxmpic++ になる.