計算機関連のメモ
- 自宅から研究室の計算機に、ゲートウェイマシンを介して直接ファイル転送する方法
- SSH公開鍵の作り方、形式変換
- デバッグ方法の覚書
- Fortranの小技
- ソフトウェアの使い方メモ
gnuplot
Intel Visual Fortran - Linuxの覚書
- Emacsの覚書
- Microsoft Wordの覚書
- LaTeXの覚書
- Illustratorの覚書
電子状態計算ソフトウェアの使い方
数式処理ソフトウェアの使い方
自宅から研究室の計算機(192.168.0.105)に、ゲートウェイマシンを介して直接ファイル転送する方法
【TeraTermの設定】
ゲートウェイのコンピュータにTeraTermで接続。
TeraTermの「設定」→「SSH転送」をクリック。SSHポート転送の設定画面で「追加」をクリック。
ローカルのポート 22
リモート側ホスト 192.168.0.105 ポート 22
に設定する。この設定はファイルに保存できる(ファイル名はTERATERM.INIなど)ので、次回以降はそのファイルを指定して読み込めば良い。
※TeraTermでパスワードをメモリ上に保存したくないとき、TERATERM.INIファイル中の
RememberPassword=1
を
RememberPassword=0
に替えればよい。
【WinSCPの設定】
WinSCPを起動 →「新規」をクリック。
ホスト名 localhost ポート番号 22
ユーザ名 hogehoge (192.168.0.105にログインするときのユーザ名)
を設定する。
【ファイル転送】
「WinSCPのログイン画面」で「hogehoge@localhost」を選択、「ログイン」をクリック。
192.168.0.105に接続できるので、通常のようにファイル転送可能。
SSH公開鍵の作り方、形式変換
【SSH公開鍵の作り方】
TeraTermの「設定」→「SSHキー作成(RSA)」をクリック。
キーのパスフレーズ(計算機へのログイン時に入力するパスワード)を入力して、秘密鍵と公開鍵を作成。
【SSH秘密鍵のPuTTY形式への変換方法】
「スタート」→「WinSCP」→「鍵関連ツール」→「PuTTYgen」をクリックして、PuTTYgen (PuTTY key generator)を起動。
PuTTY Key generator の「Conversions」→「Import key」をクリック。
TeraTermで作成した秘密鍵のファイル(多分、id_rsa)を選択して、「開く」。
秘密鍵を作るときに入力したパスフレーズを入力。
「Save private key」をクリックしてPuTTY形式(id_rsa.ppk)の秘密鍵を保存。
この秘密鍵を指定すれば、WinSCPでファイル転送可能となる。
【逆に…PuTTYで作った鍵形式(*.ppk)からRSA/DSA鍵への変換方法】
「スタート」→「WinSCP」→「鍵関連ツール」→「PuTTYgen」をクリックして、PuTTYgen (PuTTY key generator)を起動。
PuTTY Key generator の「Conversions」→「Import key」をクリック。
PuTTYで作成した秘密鍵のファイル(多分、*.ppk)を選択して、「開く」。
秘密鍵を作るときに入力したパスフレーズを入力。
「Conversion」→「Export OpenSSH Key」をクリックしてRSA/DSA形式の秘密鍵を保存。
この秘密鍵を指定すれば、TeraTermでRSA/DSA鍵を使ってアクセス可能となる。
デバッグ方法の覚書
【インテルコンパイラ(ifort)でのデバッグ方法(簡易版)】
デバッグしたいプログラム(test.f)を以下のようなオプションをつけてコンパイル
ifort -CB -traceback -g test.f
(オプションの意味)
-CB … 配列の領域外参照を検出。(PGIコンパイラでは、-C)
-traceback … エラーを起こしたプログラム中の行番号を表示。
-g … デバッグ用の実行ファイルを作る。
出来た実行ファイルをいつもするように実行させる。
./a.out > output.txt
[実行結果の例]
デバッグオプションつけずにコンパイルしたときの計算結果(エラー表示部分)
Segmentaion faultで強制終了したことしか分からない。
----------------------------------------------------------------------------
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 0000000000416A3E Unknown Unknown Unknown
a.out 00000000004161A6 Unknown Unknown Unknown
a.out 0000000000403EE9 Unknown Unknown Unknown
a.out 0000000000402F6A Unknown Unknown Unknown
libc.so.6 000000325B01C3FB Unknown Unknown Unknown
a.out 0000000000402EAA Unknown Unknown Unknown
----------------------------------------------------------------------------
デバッグオプションつけてコンパイルしたときの計算結果(エラー表示部分)
プログラムeqposi.f中の1160行目で、
配列"RAN"がRAN(1:100000)で定義されているにも関わらず、
実行中にRAN(100001)にアクセスがあったため強制終了したことが分かる。
----------------------------------------------------------------------------
forrtl: severe (408): fort: (2): Subscript #1 of the array RAN has value 100001
which is greater than the upper bound of 100000
Image PC Routine Line Source
a.out 0000000000606B53 Unknown Unknown Unknown
a.out 000000000060517E Unknown Unknown Unknown
a.out 00000000005DB66C Unknown Unknown Unknown
a.out 00000000005B9F96 Unknown Unknown Unknown
a.out 00000000005BA1DA Unknown Unknown Unknown
a.out 00000000005B83E6 inivel_ 1160 eqposi.f
a.out 00000000005A920D eqvelo_ 385 eqposi.f
a.out 0000000000406AEB MAIN__ 353 amain-cnt-md-mpi.f
a.out 00000000004030AA Unknown Unknown Unknown
libc.so.6 000000325B01C3FB Unknown Unknown Unknown
a.out 0000000000402FEA Unknown Unknown Unknown
---------------------------------------------------------------------------
【潜在的なエラーを見つけるためのコンパイルオプション(ifort)】
ifort -auto -ftrapuv -check all -warn all -std -fpe0 -traceback test.f
コンパイル時と実行時の両方で、警告レベルから教えてくれる。
[実行結果の例]
-----------------------------------------------------------------------------------------------
forrtl: severe (193): Run-Time Check Failure. The variable 'eqvelo_$VELX' is being used without being defined
Image PC Routine Line Source
a15b.out 0000000000736A93 Unknown Unknown Unknown
a15b.out 00000000007350BE Unknown Unknown Unknown
a15b.out 000000000070B59C Unknown Unknown Unknown
a15b.out 00000000006E9EC6 Unknown Unknown Unknown
a15b.out 00000000006EA15B Unknown Unknown Unknown
a15b.out 00000000006CE4C7 eqvelo_ 472 eqposi.f
a15b.out 000000000040ACF2 MAIN__ 373 amain-cnt-md-mpi.f
a15b.out 00000000004030AA Unknown Unknown Unknown
libc.so.6 000000325B01C3FB Unknown Unknown Unknown
a15b.out 0000000000402FEA Unknown Unknown Unknown
forrtl: error (76): IOT trap signal
/home/ishii/.lsbatch/1231320385.2367: line 8: 13189 Aborted (core dumped) ./a15b.out
-----------------------------------------------------------------------------------------------
ファイルeqposi.f中のサブルーチン"eqvelo"の変数"VELX"が、472行目で、
初期値を与えずに計算しているためのエラーであることが分かる。
【2GB以上のメモリを消費する配列を使う場合の対処法】
- Intelコンパイラの場合 ifort -mcmodel=medium -i-dynamic test.f
- PGIコンパイラの場合 pgf90 -mcmodel=medium -Mlarge_arrays test.f
【整数型、実数型の変数が取れる範囲】
基本整数型(4バイトの整数型)の変数 … -2^31 (-2147483648) ~ +2^31-1 (+2147483647) までしか扱えない。
例えば、N=3, M=800000, L=1000の積を整数型変数Iに格納(I=N*M*L)させようとしても
N*M*Lは、2^31以上の大きさになるので正しい値にならない。大規模計算時には、要注意!
[実行結果の例]
N*M*L = -1894967296 (負になってる!間違った値!)