2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

tweet

  • tweets

« 2009年10月 | トップページ | 2009年12月 »

2009年11月

ラブプラスプラス

ベンチマークがなにげに流行っているので、私も何か記録に挑戦してみましょう。ということで、こんな話↓があったのでこれをやってみます。
http://d.hatena.ne.jp/issei_y/20091025/1256445302
'+'をいくつつなげられるか。(それに何の意味があるのか、という突っ込みはなしで)

…でやってみたんですが、どうもほぼ無限にできそうです。c++なら、ですけど。

続きを読む "ラブプラスプラス" »

司令ッ!! 零号機、始動しませんッ!!??(叫)

かぜをひいてダウンしてます。症状からいって例のあの流行ではないみたいですが。実はインフルエンザって今までなった記憶がないんですよね。健康だからか、体質なのか、バカだからなのか…

世間はGPWの季節ですか。私は不参加ですが、みなさんのレポート楽しみにしてます。

さて、6月のVDECフォーラムの後からずっとクラスタ並列を進めてきました。まず仕様を作り、コーディングを始めて…しばらく進めたところで仕様の抜けに気づいてまた仕様に戻って、とかやってましてかなり紆余曲折で苦しんでました。ようやくひととおりのコーディングができたのが10月中旬。といってもできたのは全体の8、9割といったところで、まあなくても動く部分はとりあえずとばして、通して動くのに必要な部分だけはできた、というとこです。

でそれからデバッグ開始。並列探索のテストにいちいちFPGAボードをつなげて立ち上げてると大変なので、ソフトのエミュレータを作ってPC上のソフトだけでテストできるようにしてます。

ここまでは、コンパイルだけは通してましたが、テスト(走らせること)は全くやってません。なのでこの時点では当然バグだらけ。マスターとスレーブがあって、MPIで通信するのですが、最初はまずマスターからリクエストが出る…はずなのが出ない。いくつかバグを見つけて直して、やっとマスターからリクエストが出るようにしました。するとスレーブが受け取ってくれない。でまた直して、受け取りはするようになったけど、今度はスレーブでの探索が始まらない。…といった感じで、ほんとに一歩一歩進めていきます。

とにかく、マスターから最初のリクエストを送る -> スレーブがそれを受け取る -> スレーブで探索を開始する -> 終わるとスレーブが結果を送る -> マスターが結果を受けとる -> マスターが結果を解析・反映する -> マスターが次のリクエストを出す、ところまで到達するのがもう大変。ひとつバグを直して「これで動いてくれるか!?」と毎回淡い期待をするんですが、さっき直したとこのすぐ次でfailしたりして、全然進んでる気がせず、まったく泣きたくなります。

とはいえ今までの経験から「最初の1ラウンドが動くようになれば後は比較的スムーズに進む」ものだとは大体わかっていたので、とにかくここはひたすら耐えてデバッグあるのみ。3週間くらいで何とかその「1ラウンド」が通りました。これで気分的にはかなり楽に。その後もデバッグを続け、つい先日ようやく一局通して対局できるようになりました。やれやれ。

といってもまだまだいろいろ制限付きで動いてるので、先はかなり長いです。ちょっと複雑なことやるとすぐコケるので、ただいまデバッグ中。また並列にする以上、「正しく動く」だけでは意味がなくて、性能を上げてかないといけない。並列の性能チューンというのがまたもう、ハマるのが目に見えてるところへわざわざ地雷踏みにつっこんでいくようなもんなんですが。なぜ地雷を踏むのか?そこに地雷があるからだ!てなもんです。でもまあ私としては、これをやらないと何しろ未来がありませんのでね。ぼちぼちやってくつもりです。

寄せては返す試練の荒波

<windows.h>なんてcygwinにねーよ、と思ってたら…知らなかったんですが、cygwinでも /usr/include/w32api/ てのがあるんですね。でそこに windows.h ほかたくさんありました。お、これなら、というので今度は QueryPerformanceCounter 試してみました。結果
※文字コードはsjisみたいです

コードはここにあったbcc32用のものを若干cygwin+gcc向けに修正しました。

カウンタの 1 tick は 1/3.6M ≒ 0.3us です。ですが関数を1回呼ぶのに 5 tick、1.5us かかってます orz ボナ v3 ならほとんど1ノード評価できるやん… マイクロ秒精度測るのにマイクロ秒オーダ以上かけてどうすんねん。ちなみに今回使ったのは Core2Duo 1.83GHz です。これはまた別の意味で使えなさそう。

rdtst実験

山田さんうさ親さん、情報ありがとうございます。
さっそくcygwinで実験してみました。結果はこちら

…測定はできるようになったけど、nanosleep()がだめ orz

寝るのも精度15msですか。

あと、Pentium M 1.6GHzなんだけど、なぜ1秒で600M tick?

Windowsは謎が多い…てか、なんでこんなことしなきゃなんないんだよ。俺は普通にプログラムを動かしたいだけなんだよ

みっぴーちゃん(妹)は俺の嫁

遅い反応ですが、今度は加藤和彦さんですか…orz ということでまた動画貼っときます。私は加藤さんなら断然ミカバンド派ですね。

最初「タイムマシンにお願い」にしようかと思って検索したんですが、カエラバージョンばっかりで^^; まあそれも悪くはないのですが、あえてこちらにしました。この古さがたまらないでしょ?

さてクラスタ並列を検討してますが、準備体操としてまずMPIを動かしてみよう、というわけでMPICH2をインストールしてみました。いち・にー、さん・し;にー・に、さん・し;と。

普通は「えむぴーあいしーえいちつー」とか読むんでしょうけどこれは言いづらいので、私は「みっぴーちゃん(妹)」と呼んでます。ちなみにお姉さん(MPICH)もいます。

ググってサイトを見つけて、Winバイナリというのがあったのでこれをゲット。ふだんはcygwinで開発してますんで。

[ローカルでの動作]

まずローカルマシンで
mpiexec -localonly 1 hostname
でテスト。XPのノートとVistaのデスクトップ(以下DT)がありまして、XPの方は没問題でしたがVistaは動かず。これはググるとすぐわかり、手で smpd -install とやらなければならないんだそうで。でローカル起動はいちおうクリア。authorizationがどうとか聞いてくるんですが、これは単にリターンでいいみたい。

インストールガイドを読みますが、主にLinux向けで、Winだとかなり事情が違うようです。デーモンもLinuxではmpdなのがWinだとsmpdになり、しかもドキュメントはかなりの部分mpdを前提に書かれてたりするのでけっこう苦労します。行間読む必要あり。

次、プログラムのコンパイル環境。cygwinの場合は普通にgcc/g++でよく、-Iや-Lをつけます。後でわかったのですが、Linuxだと mpicc/mpicxxになり、逆に-Iや-Lは不要。この辺もどうもいまいちわかりづらいです。いやまあいいんですけど。

最初につまづいたのは、標準入力。ものの本によるとMPI規約自体にもI/Oに関してあまり規定はないそうで、実装依存の部分が多いらしいです。stdinを読むプログラムを -localonly 2 で動かすと、どうも入力を正しく読んでくれない。おまけに、何回かやってると、時によって動いたり動かなかったりする場合があることに気づき、更にパニックに。

落ち着いて何度か試していくうち、再現性がないと見えたのは実は端末エミュレータの違いによると判明。cygwinの端末はデフォルトはDOSコマンドプロンプトなんですが、これだとコピペができなかったり、2つ開けるとタスクバーで「コマンドプロンプト 2」となるので、片方開けるのに余分なクリックが必要で面倒だったりします。なので私はrxvtを入れ、1つコマンドプロンプト、1つrxvtでいつも使ってます。で上述の不具合は、コマンドプロンプトだとNGで、rxvtだとOKなことが判明。そうとわかれば原因調べることもないので、以後rxvtでやります。

ちなみにうちで持ってる本はパチェコの本と、「実践MPI-2」。4、5年前にMPIの情報を探してたときに買いました。最初に「実践」の方を買ったんですが、これは入門には不向けで、後でパチェコを買い直しました。MPI-2の機能はほとんど使ってませんが、mpiexecのI/Fだけは参照してます。

ここまででローカルでの動作はいちおうOK。ここで、通信の時間を測ってみました。…と、通信時間ゼロ??おかしいなと思って調べると…

clock_gettime()を使ってるのですが、なぜか数ミリ秒間隔空けてもまったく同じ時間が返ってます。またググると、どうやら何と「Winでは時間取得関数の精度は約15ms」!こっちはマイクロ秒オーダの精度が必要なので、これでは役に立たんorz

というわけでかなりげんなりしたところで次のステージへ進んでいきます。

[クラスタにトライ]

次はXPノートとVista DTをつなげてクラスタでの動作に挑戦。マニュアルを読むと、Firewallを落とせ、Vistaではユーザアカウント制御も切れ、ということなので、怖いのでインターネットからは切り離して実験。持ってる無線LANのルータが4口の(有線)イーサハブにもなるので、ADSLモデムを切ってこのハブを介してノートとDTを接続。IPアドレスはハブの口で決まるので、両マシンのhostsファイルに相手のマシン名とIPアドレスを(一時的に)書いておきます。

まずは
mpiexec -n 1 -host localhost hostname : -n 1 -host <server> hostname
をトライ。と、「smpdのバージョンが違う」と叱られます。調べると、両マシンにMPICH2を入れた時期がひと月くらいずれてるのですが、その間にバージョンアップがあったのか、片方1.1.1で片方1.2。え"ー厳しすぎじゃね?互換性なさ杉だろ?とは思うものの、とにかく両方1.2に揃えて再トライ。

が、まだつながらず。"Aborting: unable to connect" 原因わからず。まだFirewallか何かで生きてるとこあるのかとも一瞬思いましたが、さっきsmpdのバージョンを言ってきたくらいなので、smpdまで届いてはいるはず。smpdに-d「デバッグオプション」というのがあるのでやってみたところ、やはりノートからmpiexecした瞬間にDTのsmpdからメッセージが出るので、セキュリティ関連ではじかれてるのではなさそう。

smpdのメッセージを見るとどうも、サーバ側でチャレンジの数列を送る(ソケットにwrite)のだが、そのwriteがfailで返ってるっぽい?…何かありえなさそう。で結局わからず。

ドキュメントには「わかんなかったらこれこれのログを取ってメールして」と親切に書かれているのですが、まあ多少気が引けるし、それに先の時間精度のことがあるため、どっちみちLinuxでやらないとだめかなー、という気がしていたので、まずLinuxでトライしてみることにしました。

[Linuxインストール]

私はいつも、Winプレインストール済のPCを入手するとまずLinuxを入れてデュアルブートにします。なのでノートの方は既にLinux入ってたんですが、DTの方は自作のため元々Linuxしか入ってなかったところへ後からVistaを入れてその後いじってないため、ディスクにはLinuxが入ってるもののブートはVistaしかできません。でまずは、DTでLinuxを動かすところから。

最初はMBRにgrubだけ入れられないかなーと思ってインストールディスクからいろいろトライしたのですが、ことごとく失敗。であきらめて、Linuxを一からインストールしなおすことに。いつものようにWinを'other'でブートできるように指定してインストールしなおし…たはずなんですが、インストール後ためしにWinをブートしてみると…動かない!grubでotherを選んでもブートできずにすぐgrub画面に戻ってきて、ループしてしまいます。すわVistaのデータ全部おしゃか!?と顔面蒼白に。FPGAのソースとか、本当に大事なデータはいちおうバックアップは取ってあるんですが、いろいろいじった環境とかが全部入ってるので、これがなくなると作りなおすのはかなり大変。これには相当焦りました。

が、気を落ち着けてLinuxを起動し、grubの設定をよく見直すと…Winのディスク番号の指定が間違ってるorz Linuxインストール時はだいたいインストーラがWinを認識してくれて、それを'other'に自動的に設定してくれるので信頼してたんですが、今回は別のLinuxが入っていて、そっちをotherにした模様。で/etc/grub.confを修正すると、今度は無事Win起動できました。いやー焦った焦った^^;;;;;

ところで昔はgrub.conf書き換えた後たしかgrub-installとかやった記憶があるんですが、最近は不要になってるんですね。この辺浦島状態(近頃cygwinばっかであまりLinuxいじってない)
#実はつい「liloが…」とか口走る年寄り

[Linuxクラスタ]

これでLinuxが2台動くようになったので、Linuxクラスタに挑戦です。またFirewallオフで、インターネットは切り離し。SELinuxってのがよくわからんのですが、オフにしようとすると何か面倒そうなwarningが出るのでこれはとりあえずオンで。

今まではドキュメントのWinの方ばかり読んでたんですが、今度はmpdの情報が必要なためまた読み直し。

Linuxではソースからコンパイルです。いつものごとく、configureしてmake。最初makeしたら、なぜかどっかのディレクトリの「READMEが必要だが作り方がわからん」と言って止まります。よくわからんながら、READMEなんてどうせどうでもいいだろ、ということでそこでtouch READMEとかしてからまたmakeするとあっさりコンパイルできました。何なんだろこれ。まいいか。

sshでノープロンプトでログインできるようにしとけ、とあるが、これは前にやったことあるものの何か手こずった記憶があるのでとりあえずパス。workaroundとしてサーバ側で手でmpdを立ち上げるやり方があったのでそちらでトライ。まあ後でsshのやり方調べたらけっこうすぐできそうだったんですが、これはまた後ほど。

そのworkaroundで、サーバ側で
mpd -h <caller> -p NNN
とやるんですが、「127.0.0.1のポートNNNを開けない」と出る。なぜ127.0.0.1???ちょっと考えたんですが、たぶんクライアント(mpiexec側)から来てるんじゃないかな、と見当をつける。hostsファイルで相手のIPアドレスはちゃんと書いてるんですが、自分のアドレスは127.0.0.1にしていた。たぶんこの情報をサーバから要求されて送ってるんじゃないかなと思い、hostsに自分のIPアドレスもちゃんと書いたところ、やっと動きました。
mpiexec -n 1 -host <server> hostname : -n 1 -host <client> hostname
で両方のホスト名が出るように。

これでやっとMPIが動く環境がいちおう整いました。…しかし、ここまででかなり疲れ果てた orz みっぴーちゃん(妹)、ツンデレすぎ…

« 2009年10月 | トップページ | 2009年12月 »