平衡点


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++ になる.


連絡先など
最近の日記
  • 2024/10/09
    • 1. Mastodon でのメール通知, というか Exim4 と Apparmor
  • 2024/06/19
    • 1. WSL2 での gpg-agent, ssh-agent
  • 2024/06/18
    • 1. WSL で Windows 側のフォントを利用する
  • 2024/06/17
    • 1. WSLとWindowsの時刻同期
  • 2024/06/12
    • 1. wsl2 で systemd
    • 2. wslg の設定
一覧
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|02|03|04|08|09|10|11|12|
2013|01|02|03|04|05|06|08|09|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|09|10|
2016|02|03|
2017|01|02|03|05|06|07|09|11|12|
2018|03|06|07|10|11|12|
2019|01|02|03|04|05|07|10|12|
2020|01|02|03|04|05|08|09|10|11|12|
2021|01|02|03|05|06|07|08|09|11|12|
2022|01|02|03|04|05|06|08|10|11|12|
2023|02|03|04|06|08|09|11|12|
2024|01|02|03|04|05|06|10|
Back to Top ▲