[ gtool4 トップページ / gt4f90io チュートリアル / SIGEN.htm]

NEC SX-6 FORTRAN90/SX での gt4f90io インストール

以下は, NEC SX-6 FORTRAN90/SX (クロスコンパイル環境) において gt4f90io ライブラリをビルド, インストールした際のメモ書きです.


  1. netCDF ライブラリの準備
  2. ダウンロード・展開
  3. ビルド
  4. インストール
  5. gt4frt へのパスの設定
  6. NEC SX-6 FORTRAN90/SX を使う際の備考
  7. 付録

netCDF ライブラリの準備

まず netCDF ライブラリを準備する必要があります.

しかし, netCDF をクロスコンパイル環境で作成するのはなかなか 困難なため, 保守室にお願いして用意してもらった方が格段に楽です.

試行錯誤の内容はとりあえず クロスコンパイル環境で netCDF をビルドする際の問題 にまとめておきます.

sxar でアーカイブされた libnetcdf.a の取得

計算サーバ用コンパイラでアーカイブされた libnetcdf.a がフロントエンド サーバに無く, 計算サーバに置かれている場合は, 手元のフロントエンドサーバに コピーしておきます. 以下にその例を述べます.

ここでは, 計算サーバの /usr/local/netcdf ディレクトリにライブラリ一式 が格納されているとします. 取得用のシェルスクリプト get_netcdf.sh を書きます.

#!/usr/local/bin/bash
cd /home/username/
cp -r /usr/local/netcdf ./

デバッグ用のジョブクラスなど, 短時間計算用のジョブで手元に持ってきます.

$ qsub -q vector_sd get_netcdf.sh

これでホームディレクトリに netcdf ディレクトリがコピーされるはずです.

取得した netcdf を適切な場所に移動してください.

ダウンロード・展開

gtool4 プロジェクト より gt4f90io の tar.gz パッケージをダウンロードします.

ダウンロードしたパッケージを zcat と tar で展開し, 作成された ディレクトリに移動します.

$ zcat gt4f90io-20060611.tar.gz | tar -xvf -
$ cd gt4f90io-20060611

ビルド

環境変数 FC を指定し, configure スクリプトを起動します. (csh の場合は別途環境変数を指定してください). --with-netcdf には先に作成した netCDF ライブラリを指定してください. --host には sx6-nec-superux12.1 を指定してください.

$ FC=sxf90 MAKE=make AR=sxar RANLIB=touch \
  NCDUMP=/usr/local/netcdf/bin/ncdump \
  ./configure --prefix=/home/usename/lib/gt4f90io \
  --with-netcdf=/home/username/lib/netcdf-3.6.1/lib/libnetcdf.a \
  --host=sx6-nec-superux12.1

configure スクリプトによるチェックが完了したら, ビルドを行います.

$ make

インストール

ビルドが完了したらインストール行います.

$ make install

gt4frt によって正しくコンパイルとリンクが行われるか, 以下のコマンドで 確認します.

$ make test-installed

ライブラリはクロスコンパイルされているため, 実行は別途行うべく 下記のようなメッセージが表示されます.

Cross compile mode will be used.
First, change directory to ./test .
Secondly, submit ...
     dc_string_test ... histtest ...,

Thirdly, change directory to ./ .
Last "make test-installed-c"

下記のような実行シェルを作成し, デバッグ用のジョブクラスへ 投入します. (SYSLEN や F_FF0 に関しては, 実行シェルで指定する環境変数 を参照してください).

#!/usr/local/bin/bash
F_SYSLEN=32767   ; export F_SYSLEN
F_FF0=stderr.log ; export F_FF0
F_FF6=stdout.log ; export F_FF6
cd /home/username/gt4f90io-20060611/test
./dc_string_test >& xdifs.log

dc_args_test に関しては以下のような実行シェルを記述し, 投入してください.

#!/usr/local/bin/bash
F_SYSLEN=32767   ; export F_SYSLEN
F_FF0=stderr.log ; export F_FF0
F_FF6=stdout.log ; export F_FF6
cd /home/username/gt4f90io-20060611/test
./dc_args_test arg1 arg2 arg3 --namelist=test.nml -s >& xdifs.log

上記の "Secondly, submit ..." にリストされるものを 一通り投入し, エラーが発生しないことを確認した後, 元の ディレクトリに移動後, 以下のコマンドを実行してテストを完了します.

$ make test-installed-c

gt4frt へのパスの設定

~/.bashrc など, シェルの初期化ファイルに gt4frt へのパスを 設定します. 以下はその例です.

$ vi ~/.bashrc

  PATH=$PATH:/home/username/lib/gt4f90io/bin/gt4frt ; export PATH

これで gt4f90io ライブラリのビルドとインストールは完了です.

NEC SX-6 FORTRAN90/SX を使う際の備考

OpenMP 対応の際の注意

sxf90 によるコンパイル時に -Popenmp オプションをつけることで OpenMP に対応することが可能となる. ただし, OpenMP 対応時には netCDF ファイル作成時に注意が必要となる.

netCDF ファイル生成時のエラー

OpenMP 対応時は, netCDFファイルを作成する際に以下のようなエラーを 生じる. (OpenMP に対応しない場合はこのエラーは生じない).

.****  90 致命的なプロセス例外が発生した PROG=an_file.anfileopen 
ELN=196(40012b8e0) TASKID=1
SIGILL: 不正命令
                Called from anvarcreated ELN=55(400107874)
                Called from gtvarcreated ELN=87(4000f60a8)
対処法
空ファイルで構わないので, 出力すべきファイルを先に作成する. これにより netCDF のファイルを作成可能になる. (先に作成して ある空ファイルは上書きされる).
解説

エラーが生ずる部分は, ファイルがあろうが無かろうが, まず「ファイルが 存在するか?」, 「そのファイルの書き込み, 読み込み属性は?」を調べるために, netCDF ライブラリの nf_open によってファイルを開こうとする部分である.

望まれる動作は, ファイルが存在しない場合, nf_open 関数の戻り値として 0 以外が返り, プログラムはそのまま進行する, というものである. どうやら OpenMP に対応していると, nf_open によって存在しないファイルに 触れた瞬間にセグメンテーションエラーに近い (?) ことが生ずるようである.

付録

クロスコンパイル環境で netCDF をビルドする際の問題

これらの経験から, クロスコンパイル環境でがんばって netCDF ライブラリを 構築するのはかなり面倒なため, 保守室にお願いしてセルフコンパイル環境で ライブラリを作ってもらう方が格段に容易且つ確実であるようだ.

もしもクロスコンパイル環境で netCDF ライブラリの作成に成功している 事例があれば是非参考にしたいのだが...

実行シェルで指定する環境変数

F_SYSLEN

標準出力の一行の長さを指定する. (デフォルトは 255 ぐらいだったはず).

標準出力にメッセージを出力する際, この環境変数に設定される 長さを超えて出力するとプログラムが強制終了してしまう. なお, 標準エラー出力はこのような長さを設定できないらしい. もしも標準エラー出力に長いメッセージを表示する場合には 下記の F_FF0 を用いると良い.

F_FF0

装置番号 0 の出力ファイルを指定する.

装置番号 0, すなわち Fortran では標準エラー出力に相当する出力 先を F_FF0 に指定されるファイルに設定する. 特に gt4f90io では dc_trace モジュール によるデバッグメッセージの出力先のデフォルトは標準エラー出力に なっているため, この値を設定して別途ファイルに出力することを お勧めする. 上記に記述されるように, 標準エラー出力へ出力可能な 文字列の長さは調べた限りでは設定不能である.

なお, dc_trace モジュールによるデバッグメッセージの出力先装置番号 は, SetDebug サブルーチンの引数に数値を与えることで変更可能である. (上記リンクからのマニュアル参照)

F_FF6

装置番号 6 の出力ファイルを設定する.

上記とほぼ同様で, 装置番号 6, すなわち Fortran では標準出力 に相当する出力先を F_FF6 に指定されるファイルに設定する.

これはほかの装置番号でも同様で, F_FF の後ろに数値を付けた 環境変数は, その数値の装置番号の出力先を設定することとなる.


gtool4 Development Group / GFD Dennou Staff dcstaff@gfd-dennou.org
Last Updated: 2006/07/19, Since: 2006/06/11