2017年11月
      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    

tweet

  • tweets

« ハッシュの効果測定 | トップページ | rdtst実験 »

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

遅い反応ですが、今度は加藤和彦さんですか…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 みっぴーちゃん(妹)、ツンデレすぎ…

« ハッシュの効果測定 | トップページ | rdtst実験 »

将棋プロセサ」カテゴリの記事

コメント

「Winでは時間取得関数の精度は約15ms」

リアルタイムOSでないLinuxでも事情はあまり変わらないのでは…と思いきや、librtをリンクすればclock_gettime()でマイクロ秒オーダが計れる、ということなんでしょうか? 私が知らなかっただけ?

コンピュータ将棋関係者には、WindowsではrdtscでCPUクロックを見ている人も多そうですが、こちらは自分でやってうまくいったことがないのでノーコメントで。

Linuxは特別なことは何もしてませんけど普通にマイクロ秒測れてるみたいです。
Winはうまいやり方があるならどなたか教えていただきたいところですが、普通にコン将作ってるぶんには15msで十分のような気も。

Windwos上では、QueryPerformanceFrequency やら QueryPerformanceCounter というAPIを使えば取れますが…APIの呼び出しが遅いw ので、皆rdtscを使ってると言う…。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/507007/32051367

この記事へのトラックバック一覧です: みっぴーちゃん(妹)は俺の嫁:

« ハッシュの効果測定 | トップページ | rdtst実験 »