2009年1月12日月曜日

BLAS+LAPACK

VMwareのFedora10にBlas+Lapackを導入してみるテスト。
BlasとLapackってのが何かというと、線形代数の計算用のライブラリで、行列の対角化とかをサクサクやってくれる賢い子。数値計算には欠かせない。Fortranで書かれているのでFortran使いにはなんとも使いやすい。(Cからも比較的簡単に使える)ソースはF77だけどF90からもなんも変更なしに使える。

ここを参考に:http://www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

ソースからビルドしなあかんような噂を聞いていたのできつそうやなぁとか思いつつまずはNetlibからソースを落としてくる。展開しててけとーなところにフォルダを置いて、まずはmake用のmake.incをいじる。フォルダ内にmake.inc.exampleがあるので
cp make.inc.example make.inc
としてmake.incを作ってやる。intel Fortran Compire用はこんな感じに


####################################################################
# LAPACK make include file. #
# LAPACK, Version 3.1.1 #
# February 2007 #
####################################################################
#
# See the INSTALL/ directory for more examples.
#
SHELL = /bin/sh
#
# The machine (platform) identifier to append to the library names
#
PLAT = _LINUX
#
# Modify the FORTRAN and OPTS definitions to refer to the
# compiler and desired compiler options for your machine. NOOPT
# refers to the compiler options desired when NO OPTIMIZATION is
# selected. Define LOADER and LOADOPTS to refer to the loader and
# desired load options for your machine.
#
FORTRAN = ifort
OPTS = -O3
DRVOPTS = $(OPTS)
NOOPT = -OO
LOADER = ifort
LOADOPTS = -L /opt/intel/Compiler/11.0/074/lib/ia32
#
# Timer for the SECOND and DSECND routines
#
# Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME
TIMER = EXT_ETIME
# For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_
# TIMER = EXT_ETIME_
# For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME
# TIMER = INT_ETIME
# If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...)
# SECOND and DSECND will use a call to the INTERNAL FUNCTION CPU_TIME
# TIMER = INT_CPU_TIME
# If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0
# TIMER = NONE
#
# The archiver and the flag(s) to use when building archive (library)
# If you system has no ranlib, set RANLIB = echo.
#
ARCH = ar
ARCHFLAGS= cr
RANLIB = ranlib
#
# The location of the libraries to which you will link. (The
# machine-specific, optimized BLAS library should be used whenever
# possible.)
#
BLASLIB = ../../blas$(PLAT).a
LAPACKLIB = lapack$(PLAT).a
TMGLIB = tmglib$(PLAT).a
EIGSRCLIB = eigsrc$(PLAT).a
LINSRCLIB = linsrc$(PLAT).a

っていじるのは

FORTRAN = ifort
OPTS = -O3
DRVOPTS = $(OPTS)
NOOPT = -OO
LOADER = ifort
LOADOPTS = -L /opt/intel/Compiler/11.0/074/lib/ia32

だけですが。OPTSやNOOPTは最適化のオプションなのでOがゼロではなくオーなあたりがちょっと罠な気がする。
で、
make blaslib
make lapacklib
make tmglib
と3回いろんなブツをコンパイルする。結構大量にコンパイルするのでCore2Duo上位機種の実力とやらをみせてもらおうか、って感じだ。まぁなんとかこれで必要なblas_LINUX.a,lapack_LINUX.a,tmg_LINUX.aができたので、あとはこれをlibってなフォルダにコピーして名前変えてシンボリックリンクとやらを貼るかーってところで、Fedoraならyumでblas,lapackをインストールできることを知る。いままでの苦労は…orz
というわけで、CentOSやFedoraなら

yum install blas lapack

で一発です。まぁソースからビルドする方法は管理者権限がない場合には必要なので知っといて損はないか…。
yumでインストールすると、/usr/lib下にlibblas.so.* とか liblapack.so.*ができる。
コンパイル時にリンクさせるのにフルパスはめんどくさいので

ln -s ~/usr/lib/libblas.so.3 ~/usr/lib/libblas.so
ln -s ~/usr/lib/liblapack.so.3 ~/usr/lib/liblapack.so

とすると、GNUのライブラリの規則ってもんが働いて、コンパイル時に
ifort -llapack -lblas test.f90
と2つのオプション -llapack と -lblasをつけるだけでいいぽい。ちなみに/usr/lib/以外のところにライブラリを作った場合には
-L ~/lib
のように-Lオプションでライブラリの場所をしめさないといけないらしい。

さてこれでlapack使ってるNRGのコードが家のPCで動くぜ~ってmakeしてみるとコンパイル+リンクはうまくいって実行ファイルができるのに動かした瞬間「強制終了」ってコンソールに出る。gdbのお告げによるとSIGKILLキター→強制終了らしい。SIGKILLはプロセス強制終了のときに出すシグナル…。どうやらメモリを大量に喰うプログラムなためOOM Killerに叩かれた模様。まぁ倍精度で4400*4400の配列を10個とか用意したら1G超えてきついわな、これOKな大学の計算機ってすげーんだなぁ。配列サイズを小さくしたら無事実行された。これで家の環境だけでプログラム作る→テスト→バグ取りが完結するようになったので作業効率は上がるだろう。とりあえずDDDっていうgdbと連携するGUI付きデバッガもyumで入れてみた。今まで見たく気合いと勘だけでバグとるのもどうかと思ったので次はデバッガの使い方を…。

2009年1月11日日曜日

Fedora10+ifort

VMware上Fedora10にインテルのフォートランコンパイラをインストールするテスト。
参考資料:http://www.obihiro.ac.jp/~suzukim/masuda/ifc101_install.html

インテルはFortranコンパイラも非商用の目的(研究とか)に使うのはタダでダウンロードさせてくれる。条件に"accept"で、メールアドレスを登録すると、ライセンスキーが送られてくる。
VineLinuxの場合は、ほんとお手軽にsuでルートでログインして、./install.shってするだけでできたんだが、Fedoraはこうはいかない。Fedoraの場合はセキュリティ対策の一環としてSELinuxというものを導入しているらしく、root権限だけではコンパイラのインストールとかができないらしい。インストールするためには、SELinuxをPermissiveモードとやらにする必要があるらしい。モードの切り替えは/etc/sysconfig/selinuxファイルのSELINUX=enforcingをSELINUX=permissiveにするか、setenforceコマンドで一時的に切り替えるぽい。

あとなぜか、libstdc++.so.5 ライブラリがないよという問題が発生。こーゆーC++のライブラリってFedoraは標準じゃないのか??必要なライブラリを調べるために
yum provides libstdc++.so.5
とするとどうやら compat-libstdc++-33-3.2.3-64.i386 ってのがいるっぽかったので
yum install compat-libstdc++-33-3.2.3-64.i386 としてインストールすると解決。

インテルのコンパイラはFedora9までが標準っぽく、それよりあたらしいFedora10ではアーキテクチャーが判別できないとかglibcのバージョンがわかんねぇとかのメッセージがでたが、スルーしてインストールしても無事っぽい。
で、インストールした現行バージョン(ファイル名:l_cprof_p_11.0.074_ia32)の場合
.bashrcの最後に
. /opt/intel/Compiler/11.0/074/bin/ia32/ifortvars_ia32.sh
とすることで、ログインするたびにパスが通ってコマンドifortでコンパイラを使えるようになる。

とりあえずFedora10にもGeanyとか入れてFortran用の環境を作ってみる。なぜかコマンドラインからGeany起動した場合はifortでのコンパイルがうまくいくんだがショートカットから起動すると無理。謎、たぶんパス関係?まぁいいや、ifortが手に入ったのであとはlapack+blasをなんとか積みたいところ。

2009年1月8日木曜日

Geany(FortranのIDEにもなるらしい)

なんだか初期の選択をミスったせいで、ずーっとFortranをつかっているわけだ。古代な言語とはいえ物理の数値計算には使い勝手がかなりよいしとにかく速いのでC++とかに乗り換える理由もさしてなくそのままずーっと使っている。
唯一不満なのが、IDEがあんまりないこと。情報の実習のTAやってて「Eclipseすげー」だったのでFortran用のCDT探したが、リリースされてるPhotranはうまく動かなかった…。Silverforestが出してるPlato3も一応IDEなんだが見た目やコンパイラ自体の仕様が?なのでどうも…。
今日偶然に「おぉこりゃ満足できるレベルかも」なフリーのIDEを見つけた。Geanyという。フリーなIDEはそりゃたくさんあるんだが、マイナー言語Fortranをサポートしてくれてるのはなかなかない。Geanyはコードの色分け、サブルーチンとかファンクションとかグローバル変数とかのシンボルの表示、変数名の補間、コードの折りたたみが一通りそろっている。シンボルブラウザと折りたたみできるのがうれしい。(IDEならとーぜん持ってる機能なんだろが、Fortranでこれがあるのなかなかなかったりする…)動作画面はこんな感じ


見た目もなかなかよく、アイコンも「ジーニー」って名前だけあって魔法のランプなのでなかなか可愛かったりする。ちゃんとプロジェクトとして管理する機能もあるし。コンパイラとしてはFortranはgfortranがデフォルトのようだが、ビルド→インクルードと引数の設定 をいじればg95でも実行できた。でもgfortranつかったほうが、エラー出た時にその位置を知らせてくれるのでいいかも。ブックマークの機能がないのがちと残念だけど、使いやすい。たっかいVisual Fortran買わなくてもフリーでなんとかなりそうやん。

2009年1月6日火曜日

いまさらながら学振面接体験記

ついに来た。
日本学術振興会特別研究員、採用内定。やたーっ!!
3度目の正直ってやつだ。学振はこの3年何度も鬱状態に叩き込んでくれたからなぁ。
面接までもつれ込んでなかなかにしんどかった。面接もコメントが「とにかく凄い自信だ…www」だったから正直どーなんって感じで不安だったし。(直後はすごいぐだぐだ考えてたくせに、25日に結果公表されてることを全く知らなくて、正月に教授からメール来て知った。年末はそれ以外に頭悩ますことがいっぱいあったからなぁ)

とにかく、発表練習見てくれたり、しんどいときに相談のってもらったりなにかと付き合ってくれたりした皆さんに感謝です。

DC2で面接てのはボーダーラインで、面接受けてとるのは少数派らしいので今後受ける人用に一応体験記を書いておこうかと。(書類については、面接ってこたぁ微妙だったのかってことで自信ないので書きません。)

時期:今年は11月末だった。午前と午後で合格率に差がでるとか、午後なら一番じゃないとヤヴァイとかいう噂があるけどデマだと思う。とりあえず自分は午後のしかも一番じゃなかった。順番が前後の人にリサーチしてみた結果、午後組は地方から来ている人多数っぽい。たぶん領域ごとに日が決まっていて、その中で地方からで来るのに時間かかりそうな人を午後にしてるんだと思う。同じ研究室でも領域違うと日が違ったし。

ポスター:とりあえずボードのサイズが要綱に書いてあるだろうけど、横長が絶対おすすめ。マグネットは透明で長細いのを用意してくれてるので余白はそこまで気にしなくてもいいんじゃないかなぁ。字は思ってるよりでかいほうがいいと思う。イラストレーターで作って、小塚ゴシックで、現場で貼ったときに、50pでもちょっと小さめかなぁとか思った。内容は理論の式とかぐだぐだ書いてもよっぽど専門近くないと分かってもらえなさそうなので、この半年でどんだけ業績作ったかを強調して見るテスト。

面接官:大人数。10人ぐらい居てはった気がする。たぶんうち数名は学振の事務の人。実は、審査官がだれかという情報はウェブに上がっている。(私はそれに気がついたのあとからで、あちゃーって感じだった。ちゃんと確認しなきゃ…)領域の中でも、何個かに分類されてそれぞれに審査官がつくので、領域あたり6人とか結構な人数になる模様。で、その細目が違うと、専門も全然違うので、自分にしてみりゃ聞きなれてて日常語な単語も向こうにしてみれば意味フということも十分考えられるので気をつけたほうがいいと思う。(知らなかったのでその辺考慮せんとはしょりまくってしまった…。)

面接:なんせ発表時間4分で原稿見れないので、セリフはかなりしっかり覚えないとやばい。時間内に説明終えると、ブザーは鳴らないみたいです。質疑応答は一番専門が近い先生2人ぐらいが質問してきはります。雰囲気とかはその先生のキャラ次第…。まぁorzなこと言われても通ってることもあります。たぶん、答えにつまったり、おどおどせんと、虚勢でもいいから「自分はこう思う」てな答えを自信ありげに返すのがいいとおもわれる?

その他:結構みんなはやくから集まっているみたいだ。結構直前に行ったら、すわる場所なかった。

終わってみたらそんなもんなんだけど、渦中にいるときは、ものすごく緊張するわ鬱はいるわしんどいよねぇ。だいぶ先だけど今年11月、このしんどいのに立ち向かう皆さんに幸ありますよう。とにかくなんらかの経験値はつくと思います。

2009年1月4日日曜日

Lyx再戦

論文がいやだぁぁぁぁ。でも明日の仕事始めである程度進めてたよんてのを示さんと上からの御怒りがきそうなんでいまから焦って校正するか。
Texは仕上がりがコマンドからは想像もつかないのが問題。なのでLyxを懲りずに試す。
Lyxこないだ試したのがうまく動いてなかったのは、babelってのの設定とインストーラーの選択をまちがったからぽい。ここ→http://www.int.otaru-uc.ac.jp/lyx-howto/install/win
に書いてあるようにWindowsへの導入をおこなうと、まぁサンプルは普通に動いた。LyX-160-4-15-AltInstaller-Small.exeてのをインストールしないといけなかったのだな。

なぜか、サンプルがある場所(/example/ja)と違うところにファイル置いてdvioutでみようとするとうまくいかないのが謎すぎる。パスとかの問題?
Lyxは式とかが出力される状態で出てくるのはありがたいんだが、引用文献の番号の書き方とか細かい部分をプリアンプルでちょっといじるってのが難しそうな気がする。ソースに直で書けないし。まぁいろいろやり方はあるんだろうけど。なのでしばらくは下書きをLyx、ソース吐かせて仕上げをWinshellな感じでいいかなぁと。

どうやら明日大学行くと、とある重要書類が届いているみたいだ。うぁぁなんか胃が痛い

2009年1月3日土曜日

メモリの種類とか(いまさら)

昨日は久し振りに研究室の同期と会った。iPhone持ってたので見せてもらう。iPhoneスゲー。最近ブログ更新してねーよねって聞いたらむしろTwitter派らしい。Twitterなぁ、導入したらすごい気が散りそうでなんか手を出せないわ。気晴らしになんかいいのないか聞いたら、Travianがおすすめらしい。興味もったんで調べてみたがなかなかに複雑かつ難しそうじゃ…。
ネット上のゲームなりSNS的サービスなりってどうもあんまり知らん相手とコミュニケーションとることを求められることが多い気がして苦手だなぁ。人脈広げたりさらっと知り合い作るにはいいツールなんだろうけど、携帯メールと一緒で相手の表情読めない分、文章から心理状態を把握せにゃならん気がして無駄な深読みしまくって凄い疲れそう。

さてぼちぼち本業に復帰するか
たぶんこれから実装する計算方法はモーレツにメモリを喰うのでメモリの使われ方ってのを今更ながらに調べる。
メモリは大まかに分けて、コードセグメント、データセグメント、スタックセグメントの3種類のエリアに分けて使われるらしい。アドレス指定とかに使うレジスタもそれぞれに応じてCS,DS,SSが用意されてるとな?
コードセグメントはプログラムコードが機械語に翻訳された本体を収める部分。

データセグメントはデータ、.bssとヒープの3つに大別される。データ、.bssは静的な変数とグローバルな変数が納められる。データには初期化されてるのが、.bssには初期化なしのが振り分けられる。ヒープは動的に割りつけられる変数なり配列なりインスタンスなりに使われる。

スタックセグメントは手続き中の局所的な変数や配列、関数の引数の引き渡しなんかで使われる。

だいたいのところは上に書いたようになってるらしいが、具体的にどんな変数がどの領域に確保されるかというのは言語やコンパイラやその他もろもろによって変わってくる。
Fortranの場合だと
module中の大域的な変数、save属性付きの変数→.bss
allocatable属性な配列→ヒープ
普通にサイズが宣言されている自動配列→スタック
手続き中の変数(mainでも同様)→スタック
てのがデフォみたいだ。

フラットメモリモデルとかいう一般的な方法だとメモリの0x00000000番から順にコードセグメント、データセグメント、そしてメモリ0xffffffff番(32bitなOSでは1プロセスで使えるメモリの最大値らしい)から番号が小さいほうにむけてスタックセグメントが配置される。動的割り付けが行われるとヒープがアドレスの番号の大きいほうに伸びていき、関数の呼び出しなんかをしまくるとスタックが番号の小さいほうに伸びていく。で、動的割り付けでばかでかいのをやっちゃったり再帰手続きでばかでかい配列をつかったりするとヒープとスタックが衝突することがあるらしい。ふつー、スタックのサイズには制限がかかっていて、2~8Mになっている。Linuxだとlimitっていうコマンドで調べることができるらしい。スタックのサイズ制限はunlimit stacksizeで外せるのでそうするとこういう事態が起こってしまう可能性があるらしい。OSの側でそういうの監視してないんかよって気もするが、glibcはスタックがヒープ領域を破壊するのに無頓着らしい…。

そしてFortranの処理系ではヒープ領域へのアクセスがなんか怪しい。Fortranでの配列の動的割り付けはallocateで行われるんだが、たとえば allocate(A(2,2))と2×2の配列を割り付けたあとで、A(1,3)とか「あーそこ配列の定義外やろ…」ってとこに普通にアクセスできるし代入とかもできてしまう。コンパイルもされるし実行も普通にされるし(当然結果は変になるが)、gdbもスルーすることがある。動的な配列割り付けを使うとこのやりがちなバグを見つけるのが難しくなる。

アクセス速度自体もヒープは他に比べて遅いらしいので、数値計算なら配列は大きめに見積もってmoduleで静的に宣言しとくのが正解ってことか?

2009年1月1日木曜日

元旦

あけましておめでとうございます。

うちの家では仕事の関係上、元旦は5時起きだったりする。たぶん一年で最も早く起きる日が元旦…。5時って眠すぎる&寒すぎるだろ常識的に考えて。
なんか軽い時差ボケになりそうだ。

朝、仕事片付けて、初詣に行く。おみくじを2か所で引いて二個とも吉だったのでよかった。元旦に行く近所の神社は毎年結構まとを得たコメントが書いてある気がしておみくじひく時なんだか緊張する。なんとなく神社仏閣にいくとおみくじを引きたくなる。星占いとかとちがって自分が選択している感じがなんか面白いんだろう。今年の占い関連は何見ても自分が該当する部分は「幸運だが注意が必要」みたいなことが書いてある気がする。今年は注意深く生活しよう。

正月の仕事が終わると一気に暇になって結局学会用のデータ処理とか本業関連の作業している。元旦からそれ以外することないんか自分、なんか趣味見つけんとなぁ。

さて明日はバーゲンだ。ええもん見つかるといいなぁ