2009年1月28日水曜日

ifortでのベクトル化

今後、なにかと計算規模をスケールアップさせたいんだが、何が問題って計算時間である。今ので一個あたり16時間~20時間かかっていて、扱う状態の数を2倍にすれば、行列要素は4倍になるので単純に考えて4日ぐらいかかるのか。4~5日ですめばいいけど、基本的にあちこち入れ子になったループが存在しまくっているので実際にはもっと時間かかるんじゃねーかと。さすがに処理の高速化をぼちぼち図らないといけないか。

処理を早くするには並列化が基本みたいだ。どんな作業も一人ですべてやるよか何人かで手分けしたほうが早く終わるにきまってる。でも手分けするときに作業内容とかを説明したり、終わったあとに作業内容を統合する必要が出てくる。PCでも同じことで、スケジューリングやらバリア同期をしなあかんのでよっぽど並列処理に向いている部分がないと、並列化させたところでさほど恩恵があるわけではないらしい。(アムダールの法則ってやつか)並列計算に向いてるのは検索、大規模行列の線形代数な演算とからしい。

並列化で最も手っ取り早いというかなんとかつかえそうなのが、ベクトル化とマルチスレッドやろうと思ったので調べてみる。
最近ifortでコンパイルしてるとしょっちゅうdo ループがベクトル化されました っていうメッセージが出てくる。ベクトル化ってスパコンしか関係ない話じゃねーのと思ってたのでなんか不思議に思ってたが、IA-32なCPUでは疑似ベクトル化ができるらしい。
ベクトル化ってのがそもそもなんやねんって話だが、要はレジスタを塊で使って一気に大量の数値を演算しようっていうことみたいだ。


do i=1,10
x(i)=a(i)+b(i)
end do

みたいに演算の順番を変えようがまったく影響ないループだと、aの1~10、bの1~10を一次元配列に格納してその配列の和を計算するのと同等なので、レジスタの集合を配列のように使えば10回計算しなあかんところを一回で済む。10回程度だと大してなんも変わらないけど一万回が一回に化けるとだいぶ違う。地球シミュレータとかSXシリーズとかのスパコンはそれ専用のベクトルレジスタを大量に積んでてそれゆえ行列演算が異様に早いっぽい。(とはいえベクトル型のスパコンを作ってるのはいまやNECのみらしいが)こういう並列化の仕方は、SIMD(Single Instruction Multi Data)というらしい。

実はIA-32なアレにはこのSIMDな処理ができる部分が存在するらしい。CPUのレジスタというと32ビットの汎用レジスタeaxなどなどが使われてるイメージだが、実は128ビットのレジスタxmm0~xmm7というのが存在するそうな。128ビットなので倍精度実数なら2個格納できる。浮動小数点演算は通常、名前も浮動小数点計算ユニットであるFPUとかゆーst(0)~st(7)レジスタを持つところで行うらしいが、xmmレジスタをつかうこともできる。xmmレジスタをまとめて使ってベクトル化したような処理をおこなうための拡張命令がSSE/SSE2/SSE3(SSEはStreaming SIMD Extensionsらしい)
SSEはもともとインテルがつくったのでインテルのコンパイラはこれを使えるのが多い。ifortで出てくるベクトル化しましたってのは実はこのSSE2やらSSE3やらをつかってxmmレジスタで疑似ベクトル化してるということみたいだ。実際、-Sオプションで、アセンブラコードを吐かせてみると、movsd だの %xmm0だのそれつかってるぽい形跡がちらほら。ちなみにmovsdはmovのSSE2バージョンぽい。やはりインテルのコンパイラは頭ええんだな。ところで、DOループ中にprint,read,writeがあるとこのベクトル化ができなかったりする。ベクトル化の詳細レポートがほしい時には-vec_report3とするとよし。

2009年1月26日月曜日

長年の疑問

前々から思うことなんだが、なんで日本の大学は留学生超優待なんだろう。
こないだも円高とかリーマンショックで留学生の生活が大変、救いの手をって新聞記事になってたけど、救わなあかんのは留学生だけちゃうやろうと。いっとくが国費で来てる人々はかなりいろいろ手当もらってて余裕アリだぞ。

まぁこういうこと外で言うとなにかと叩かれるし、自分が困ってるわけでもないのに嫌な奴と思われそうなのでなにもいえないけどな。

自分たちによこせとか彼らにやるなってわけじゃなくて、なんだかリソースの配分にあまりにも偏りがあると、国内の学生のやる気を削ぐよ、それって結果的に損なんじゃないのってことが言いたいのだ。

国内の学生への補助は手薄だと思う。奨学金はほとんどが返済義務アリだし。企業や国が出す、返済義務なしの奨学金はほとんどが留学生対象。そりゃDに進学する日本人が少ないわけだわ。博士課程の日本人率が少ないって問題だと思うんだが。進学する人数が少ないからって留学生補充というのは本末転倒だろ、たいてい皆本国に帰っちゃうし。卒業後に日本の企業や研究機関に定着する率とか考えても、日本人の学生への補助も増やして進学しやすくするのは、投資に見合うリターンが国にあるかと。優秀な子でも、金かかるし、早いこと稼ぎたいですって皆就職してしまう。ある程度の数が基礎研究に居ないと、何十年後かに困ると思うぞ。

私費留学生で大層苦学してる人もいるのでその人たちには助成が必要なのはわかる。だが留学生=まじめ・苦労人、助けてあげなきゃ一辺倒ではないと思う。なにがほんとうんざりするって、大学外の少し年長な方々は「日本の若い学生はさぼってばっかりで留学生のほうがまじめなんでしょ」(ソースはうちの親族)てな発言をされる。それ実情見てから言えよ、まじでやる気そがれるわ。政府高官の方々同じような意見やからのいまの政策なんやろな。頼むから日本人の困ってる子も助けたってくれよ。

たしかに留学生のなかにゃスゲぇ優秀で成果バンバンあげてしかも性格もイイてな超人もいるが、そういう人ばっかでは無いんだよな。なんか長年、あの研究室にいると嫌な部分もいろいろ見てしまって「国際」ていう言葉にアレルギー持ちになる。日本の大学にいるはずなのに聞こえてくるのがよくわからん言語のほうが多いってのは本当に憂鬱。大学院行って外国嫌いになりました。だめじゃん。個人単位ではいい人なんはわかるが、あの環境にいるとフィルターが頭の中にできちゃって狭量になってる自分がいて嫌だ。

2009年1月25日日曜日

寒すぎ

久しぶりに日記的な文章
とにかく寒すぎる。風邪をひいた。
基本的に寒いの嫌いで、寒い時期は体調がよろしくない。こーなんちゅうかヤバくはないけどうっとおしい不調に悩まされることが多い。しもやけとかなんとなく風邪とか。血行不良とか冷え症がすべての原因なんだろうなぁ。起きてる時間大半座って作業してんだからしょうがないけど。
そろそろ学会の準備を始めないとあかんかなと。データ処理に追われる。はよ終わらんかなぁー、遊びてー、データ処理は単調作業ですぐ飽きるので嫌いだ。プログラム作って計算結果出た時点で満足してしまってさて次のことしたいなぁってなる。でもデータ処理をせんと「研究成果」として扱われる発表とか論文とかのネタにならんわけで。うぅジレンマ。シェルスクリプトで大半なんとかしようと思ったけど、細かいチューニングとかExcel使う部分やグラフ・図の作成はどーしても手作業が必要。

定例の3月の以外に2月にも身内な学会とはいえ一応国際な学会がある。2月の会場が自分とこの大学でほんとよかった。出張はめんどい。
3月の場所が東京なのでホテルを確保した。東京でホテルを安く上げようとケチるとロクなことがないので、今回はわりといい目のを予約した。地方やと一泊7000円でだいぶ快適に過ごせるのに…。やっぱ学会は地方がいいです。そして、こないだ使った丸の内メトロポリタンがちょー快適で「あぁやっぱええホテルってええわぁ…」と味をしめてしまったのもある。さすがにメトロポリタンクラスのは無理やけど、3泊せにゃならんので健康と睡眠には代えがたい。睡眠と水分をしっかりとらんとダメな体質ぽい。

あぁとりあえずさっさとグラフつくらんと。Excleいじるだけってつまんねー。データ処理よかOpenMPで計算の並列化うまいことできるか試してみたいんやけどなー。せっかく自由にいじれるクアッドコアが手元にきたんだから並列化を試さん手はないと思うのだ。

2009年1月24日土曜日

Fortran備忘録:ファイル名とかいろいろ

数値計算でよくある「繰り返し計算の各回での結果を、第何回目であるかの数字をつけたファイル名にして出力する」とか「あるパラメータでの計算結果をパラメータの数値をファイル名に入れて出力させる」とかのFortranでのやり方まとめ。Fortranは文字列と数値間のキャストの組み込み関数がないのでメンドイ。

1.まず、ファイル名は文字列変数で指定することができる。
2.文字列変数の結合は//で可能
なのでたとえば
character(30) ::param,filename
ていうふうに文字列変数を用意しておいて


open(8,file=param//filename)

なんてのも可能。

3.integer,real,double型の変数を文字列変数に変換やその逆をする場合には内部ファイルを使うとよい。
内部ファイルというのは、入出力先をプログラム中の変数にしたものである。
たとえば

program main
implicit none
integer :: i,j
character(10) :: a,b
i=3
a="5"
!b に i の値を文字列として代入
write(b,*) i
!aの値を数値としてjに代入
read(a,*) j

print*,b
print*,j

end program main

とすれば、3 5てな出力が出てくる。

4.ただ出力を見てもわかるように、bでは3の前にいらん空白が入っているし、これをそのままファイル名で使うと、10文字分の領域を確保しているせいで後ろにも空白が入ってきてなんとも間抜けたファイル名ができる。そんなときには文字列の組み込み関数のTRIMとADJUSTLを組み合わせるといい感じ?TRIMは右側の空白を取り除く、ADJUSTLは文字列を左詰めにする関数。

open(10,file="a"//TRIM(ADJUSTL(dis))//"total")

的な。

5.ファイルに埋め込みたいのが整数ならこれでいいんだが、実数型だと1.000000.txtみたいにいらん長さのファイル名になってしまう。
対策例1
・文字列の部分配列を取り出してくる
文字列は配列のように、1文字目から3文字目みたいに切り出してくることができる。
たとえば
a="abcdefg"
なら
a(1:3)
は"abc"である。
実数を文字列に変換した場合には最初に符号とかを入れる関係で頭に2文字ほど確保されているらしく、a=1.00000000から1.0だけを取り出すという風に切り出す場合にはa(1:5)という風に指定すればいいみたいだ。

対策例2
・何文字目までが有効桁かを探る→切り出し

valはcharacter(30)
nonzero,iはinteger

nonzero=0
do i=1,30
if ( val(i:i) > "0") then
nonzero=i
end if
end do
open(15,file="pot"//TRIM(ADJUSTL(val(1:nonzero))))

2009年1月20日火曜日

CUDAをコマンドラインから使えるようにしよう

VisualStudioが意味フなのでWindowsでもコマンドラインから使えるようにしたいなぁと。どうせ本番はLinux機の可能性100パーですし。
ちなみにOSはWindowsXPです。
コマンドラインから使えるようにするには環境変数をいろいろいじらんとあかんみたいだ。
先人の知恵がつまった参考文献3つで言っていることが違うぜ、どうしよう
http://tech.ckme.co.jp/cuda_inst.shtml
http://exth.net/~ohshima/wordpress/2007/10/30/5/
http://chihara.naist.jp/people/STAFF/imura/computer/OpenGL/cuda1/disp_content

環境変数INCLUDEなるものが見当たらないので、まず真ん中の人がやっているのと同様に、システムのPATHをいじることにする。
とりあえずPATHに


C:\Program Files\Microsoft Visual Studio 8\VC\bin;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\NVIDA Corporation\NVIDA CUDA SDK\common\lib


を足してみる。
で、昨日ためして動いたbandWidthTest.cuをコンパイルして実行すべく


nvcc -o test.exe bandWidthTest.cu -I"C:\Program Files\Microsoft Visual Studio 8\VC\include" -I"C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc" -L"C:\Program Files\Microsoft Visual Studio 8\VC\lib" -L"C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib" -lcutil32


てなバッチファイルを作って投下。
test.exe無事生成
が、cutil32.dll見つからないというエラーメッセージ出て動かず

そこで最後の文献を参考にして
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib\cutil32.dllをC:\Windows\system32へコピーすると動いた…いいのかこれで?
たぶんファイル構造をつらつら見るに、
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\bin\win32\Release
にPATH通しといても同様に動くはず。このwin32\Releaseやwin32\DebugはVisualStudioのコンパイラ経由でDebugなりReleaseなりするときに必要なDLLとかを全部ほりこんであるぽいのでPATH通しとくのがいいんじゃないかなぁ。やっとこ

なんにしろ無事うごいたっぽいのでCUDAが出始めのころに試して記録を残してくれた先人たちに感謝感謝。

2009年1月19日月曜日

CUDAを試す

どうやらCFSは順調に動いたようで磁場下での1粒子励起スペクトルが綺麗に出た。今までの方法と段違いにきれいな結果だ。ひじょーに満足。作るの苦労した分、上手くいくとめちゃうれしいわぁ~。これで夏の国際会議のネタが確保できる見通しもついた。

ほっとしたので、自宅機で噂のCUDAを試す環境を作ってみる。CUDAって何て読むんだろ。きゅーだ?くだ?
研究室でも最新版Teslaを試そうぜっていう話がでてたんだが、取引先の業者さんがまだ性能評価終わってないらしい。Teslaは結構熱がでるとかでファンをどうするとかGPUコンピューティングするなら帯域がどーとかそれなりに相性とか考えなあかんぽいとか。評価終わるの待ってて予算執行がぎりぎりになるんもあれだし、導入はたぶん来年度かねぇ。それまで自宅のにはせっかくCUDAが動かせるGeForce9800GTが入っているので試しにいじってみようかと。GPUつかったら画面が出力できないとかOTLなことになるんじゃないのとかいろいろ無駄におそれたがべつにそんなことはないらしい。
http://tech.ckme.co.jp/cuda_inst.shtml
に詳しくインストールの仕方が書いてあるのでとりあえず試す。
ドライバは対応してるのがもともと入っているのでいじらない(グラボのドライバってなんかいじってえらい目にあった知人の話聞いて以来怖い)
NVIDAのページhttp://www.nvidia.com/object/cuda_get.htmlからcuda toolkit cuda sdkのバージョン2.0をダウンロード。バージョン2.0を動かすためにはWindowsではVisual Studio 2005C++が必要らしいのでそれもMicrosoftのページからダウンロード。最新版は2008らしいがCUDAの2.0は2005じゃないといかんらしい。あとDirectXつかうサンプルもあるらしく、DirectX SDKも入れといたほうがいいらしいが、入れ忘れた。まぁとりあえず放置。

CUDAについてはtoolkit → sdkの順でインストールすべしとのこと。インストールはデフォルト通りにしといた。後でみたらいろいろパスが増えとる。参考資料によると、CUIでコンパイル、ビルドするにはパスをいろいろいじる必要があるらしいが、今日のところはとりあえず動くかどうかをチェックしたいのでまたとりあえず放置。
デフォルト通りにすると
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\projects\simpleTemplates
下にsimpleTempletes.slnなるものあり。
とりあえずこれが動くかどうかでCUDAが無事インストールされたかどうかがわかる模様。
これをクリックするとVisual Studioが立ち上がる
ビルド→ソリューションのビルド
なんか一応正常終了したっぽい
Visual Studio使ってないもんでよくわからんのだが、たぶん緑の矢印が「実行」てのは共通だろうとあたりを付けてとりあえずそれを押す(これデバッグらしいが)

とりあえず動いたっていう解釈でいいのか…?謎いわ。やっぱLinuxのほうがgccで直コンパイル+ビルドできて見通しつけやすそう。sampleにMonteCarloあんのが気になる
結果がWebにあがってたbandWidthTestも試す

出てる項目大体いっしょぽいなぁ。ビルド時に警告でたけど動いてるってことか、よーわからん。CUDAなかなか手ごわそうじゃ。

2009年1月18日日曜日

CFSバージョン起動

最近このブログ内容が偏ってると周囲の知人からは不評を頂いてたりする。しゃーねーやん、日々そーゆーんしか扱ってないんだもん。ここんとこ毎日家と研究室を点と線やし。google analyticsをみると、Fortran関連の検索で来ている人が多い模様。Fortran関係者の役に少しでもたってるとよいのぅ。Fortranのちょっと知っとくと便利情報とかエラーメッセージの解読方法とかあんまりWebで載ってないもんなぁ。わかったらまたぼちぼち書いていこう。

さてそんな無機質な日々の甲斐あって、なんだか数値計算の新バージョンがなんだかそれっぽい答えを返し始めた。ぬかよろこびでないことを祈る。数値計算ってテストケースがうまくいったーと思ったら本番投入したらわけわからんエラー出ることよくあるし。

新バージョンてのは12月の頭ぐらいから「学振結果待ちうぇぇ辛い…」な気分をごまかすべく作り始めたComplete Fock Space略してCFSをつかったNRGの計算コードでなんつうかまたマニアックな代物である。まぁそうでもなきゃこれに手だしてないからある意味学振に感謝かな。NRG自体が非常にアレゲというか人口少ない(一不純物ソルバーとしては史上最強のはずなんだが)計算手法でその中でもまたマニアックな手法らしく、似ているDM-NRGについては結構取り上げられてるけどCFSはあんまりというかほとんど見ない。DM-NRGは状態を二重にカウントしてて誤差でるってな噂あるんだけどなぁ。NRGでは計算機で計算可能にするためにステップごとにあまり大事じゃなさそうな状態を捨てていく、つまり繰りこんでいく。これが頭イイなやり方の反面いろいろ問題を起こす。CFSはこの捨てちゃった分も拾ってきて計算できるので精度がものすげー向上する&磁場が入っても大丈夫らしい。磁場はいったときにSTMのスペクトルがどうなるかを計算しようとおもったらこいつが一番だろうというわけでちまちま作ってたわけだ。大量のデータ扱わなあかんしめっちゃ実装するのめんどくさかった。モデル計算のくせにメモリ数G使うとか。とにかくなんとか動くもんができてやったーてな気分。なんかもうちょっと高速化できそうな方法も思いついたんで次はそれだな。

2009年1月17日土曜日

RedmineをFedoraで動かす

サーバー立てても文章置いとくだけじゃあれなので、なんかサービスを入れようと。とりあえず研究室で役立ちそうなものということで、Redmineをいれたいなぁと。実機でやってミスってはまずいので家のFedora10 on VMware で試す。LinuxにはInstantRailsがないのでメンドイ。大学行くまでに忘れそうなんでメモ

まずruby on railsが動く環境にしないといけないので、それの設定。
ruby周辺のインストール


yum install ruby
yum install ruby-devel
yum install icb
yum install rdoc


RubyGemsをhttp://rubyforge.org/frs/?group_id=126からもらってくる。適当な場所で展開して

ruby setup.rb
gem install rails


Ruby on rails は最近のはデータベースにsqlite3を使うらしいので

gem install sqlite3-ruby


Redmineをhttp://rubyforge.org/frs/?group_id=1850
でもらってきて、展開。展開したフォルダ中の/config/database.yml.examle をdatabase.ymlとしてコピー。
インストールの手引きにあるように、database.ymlのproductionの部分を

production:
adapter: sqlite3
dbfile: db/redmine.db
timeout: 5000

として

$ rake db:migrate RAILS_ENV=production
$ rake load_default_data RAILS_ENV=production
$ script/server -e production

でWEBrickが起動、localhost:3000で待ち受け状態になる。デフォルトランゲージの選択でjaにしていても、最初のadminでログインするとすべて英語…。管理のところの言語設定だけでなく、マイアカウントのところの言語設定も日本語にしてやる必要あり。

せっかくApache起動しているのにもう一個Webrick起動してポートも別に開放するのがなんか微妙?なのでApacheと連携させるってのを一度試してみんとなぁ。

2009年1月16日金曜日

あたらしいものは面白い

今週はなんだか忙しかった。
というのも新しい計算機(Quad、i7は高くて買えず。)がきてその設定やらなんやらの作業が入ったから。クラスターではなく大きな筐体なので計算機室におけずに自分の机の横にでかいのが陣取ることになった。ディスプレーも買ったのでディスプレーに前後から挟まれる格好になっている。電磁波とか大丈夫なんやろか…。やっぱワイド液晶万歳。国産のちと高い目にしただけあってわりかしきれいで満足。いままで使ってたD●LLの付属品は比較すると涙目すぎる。

OSはCentOS5にしてもらった。業者の人が一通り設定してくれた。Linuxよくわからんからありがてぇ。念願の管理者権限げと。CentOSは扱ったことがないのでビビりながら使いだす。マウスの右ボタンで端末をディレクトリの中から呼べるのが地味に便利だ。しかし、FTPクライアントもっとええのないのか?デフォルトのgFTPはWindowsで使ってるWinSCPに比べて超使いにくい。WinSCPのいいところは転送時に新しいものだけを上書きとかミラーリングとかのオプションがある+いつも使ってるエディタでリモートのファイルを編集できるところ。なんでLinuxにこれに匹敵するもんがないのか謎い。FileZillaがましっぽいけど、編集を直にはできないっぽいなぁ…。ファイルブラウザも付属のがビミョーに使いにくいしなんかええのないかなぁ。とまぁ不満はちょっとあれど、コンパイラとか満載やし、X-Windowやし、いろんなもんのインストールがrpmとかで楽勝なLinuxは研究用としてはWindowsより使いやすいかも。大学のサイバーメディアセンターがなぜLinuxからWindowsに切り替えるのかまったく理解不能。とりあえずWineもつかってみたいな。

Mathematicaの設定もすんだ。公費で買っている分、使い方を研究室の人間に知らせなければいけない。何度も聞かれるのが面倒なので、サーバーたててWebページで公開しとくことにした。Webページつくるん結構面白いけどいろいろよくわからん…。週末はこれと、いま作ってる計算コードいじって終わりそやなぁ。GPUコンピューティング(CUDA)にも手を出そうかって話も出つつあるしどうなるんやら。おもろいけどなんか妙に忙しくなりつつある。

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

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

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