2024年7月
  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年11月 | トップページ | 2010年1月 »

2009年12月

Die Unendliche Geschichte


ここんとこひたすらずっとクラスタ並列のデバッグをやっております。前回記事ではいちおう動いたと書きましたが、このときは localonly, スレーブ 1コア, ルートでのみ分割、という制限つきでした。ここから以下の順で進めてます:

 ・ルートの1手下で分割
 ・ルートの2手下で分割
 ・(ローカルで)スレーブ2コア使用
 ・ネットワーク越しのクラスタで実行

一歩進むごとに、とにかくバグの嵐。ちぎっては投げ(治し)ちぎっては投げ、という感じ。はてしなく続くように思われ、一時はかなりめげてました。

 ♪ネバーエンディングバグ取~り~~

誰だっけこれ。ええと、ほらあの、あの人 ( <- 完璧ア○ツハイマー)

スレーブ 1コアだとそれでもまだましなんですよ。deterministicなので。2コアになると、バグを再現させるだけで一苦労だったりします。

ちなみに、デバッガは使っていません。というか、使えません。以前に「DOSプロンプトはNG、rxvtだとOK」という話をしましたが、gdbを通すとrxvtでもNGになってしまいました。なので、デバッグのツールは唯一、ログ出力(printf相当)のみ、という戦いを強いられてます orz

現状は、ルートの2手下で分割、スレーブ2コアで、regression(問題集数十問)がやっと通ったところ。クラスタはこれからです。論理バグという面では、まだバグはゼロではないでしょうが、さすがにかなり収束してきたと言えそうです。でもこれから血と汗と涙の性能チューンが待っている^^;;; 今までほぼコーディング4か月、デバッグ2か月ですか。チューンも2か月くらいですかね。しかしもう既にかなりHP消費してるんですがw

1コアから2コアにすると、問題集の解答速度で約1.32倍の速度向上。(npsではなく、同じ深さで問題を解くのにかかった時間の短縮率。)ちょっとまだ物足りないですが、まあ始めたばっかなので今はよしとしますか。これからおいおい上げていきたいものです。

デバッグの細かい話は書いてもしょうがないでしょうから省きますが、MPI関連とかPC関連とかで、やってるうちにわかんなかったことやつまづいたことで調べた結果わかったことをまとめてメモしておきます。こういうの書いとくと、ほぼ必ず誰かが明らかにトラブル解決目的で検索して来るんですよね。なのでまあ多少なりとも人様のお役に立つかなと。以下順不同かつばらばらですが。

[Linuxでの時間取得]

以前 に「Winのclock_gettimeは精度悪い。QueryPerformanceCounterは時間かかりすぎて使えない」と書きましたが、Linuxでも測ってみたら、精度はOKですが時間の方はやはり 1us 以上かかっていました。たかが時間なのに、何でこんなにかかるの?…しかたないので、時計見る回数を減らす方向でコード修正。

[Linuxでのnanosleep]

こちらは 10us くらいの精度出てまして、OK。やはりWinはNGで、Linuxを使うほかありません。なお指定した時間+90usくらい寝ます。プロセスの寝起きに90usかかる、ということなんでしょうねきっと。

[Vistaでサスペンドする方法]

Vistaではデフォルトではシャットダウンのメニューにサスペンドの選択肢が出てきません。ググると、DOSプロンプト@管理者として、で
powercfg /hibernate on
とせよ、とあったのでやってみたのですが、やはりメニューに出ない。更にググると、メニューに出す方法はわからなかったですが、コマンドでサスペンドさせる方法があったので、これを使ってます。
c:\Windows\System32\rundll32.exe powrprof.dll,SetSuspentState
(ほとんど呪文)

[WinとLinuxの切り替え]

ふだん文房具としてはWinを使ってますが、将棋の並列化はLinuxが必要。いちいちリブートするのはめんどいのでこれを少しでも楽にしたい。マイクロ秒オーダを扱うのでVMの類はたぶんだめだろう。ということで何かいいやり方を探していたんですが、以下を発見。

Winを(シャットダウンでなく)サスペンドさせ、また電源を入れ、GRUBに来たところでLinuxを選んで起動する。Linuxを使い終わったらリブートして、またGRUBに来たらWinを選択。するとサスペンドから復活してくれる。Winではウェブやメールでログインでパスワード入れるところが多いので、これだとかなり楽になりました。

知ってる人からすれば「そんなの当たり前じゃん」とか言われそうですが^^; いや、私知らなかったんですよ。というか、WinシャットダウンしないでLinux立ち上げると何かまずそう、と思いこんでて。今回必要に迫られて試してみたところ、できました、という話です。

[Ubuntuでssh]

今までは3年ほど前のムックの Fedora 6 が入ってたんですが、ここらで入れかえましょうということで、また某ムックを買ってきて Ubuntu9.04 をインストール。今までいろんなLinuxを使ってきましたが、debian系は実は私は初トライです。

まずつまづいたのが、sshができないこと。最初はFirewall回りかなと思い、システム管理~ファイアウォールの設定、を見てみたが、デフォルトは停止になってるよう。ためしに有効にして、sshを許可してみたけど状況変わらず。で少し調べると、sshdがないためと判明 orz Ubuntuではsshはクライアントのみでサーバは入ってないそうです。

でググると、
sudo apt-get install openssh-server
とすればよいのだ、とあるのでやってみたが、「そんなライブラリ知らねーよ」みたいなメッセージが出ます。で更にググると
/etc/apt/sources.list でコメントされている行を有効にして
sudo apt-get update
せよ。その後さっきの"sudo ... install"をやれ、とのことで、これをやったら無事sshdが入りました。これは便利ですね。sshdの起動までやってくれました。
結局ファイアウォールの設定は関係あったのかなかったのかわかってません。

[sshでノープロンプトでログイン]

前回避けてたやつですが、やってみました。実はけっこう簡単。クライアントで
ssh-keygen -t rsa
として、 ~/.ssh/id_rsa.pub ができる。これをsftp等でサーバ側に送り、
~/.ssh/authorized_keys にコピー。これでOKです。3台以上あるなら、自分以外のid_rsa.pubを全部catしたものをauth...にする。

なおMPICH2では、双方向(サーバ<->クライアント)これをやっておかないと不具合があるようです。

[WinとLinux間のデータやりとり:Ubuntu編]

Ubuntuではシステム管理~Storage Device Managerから/dev/sda4をマウント、とか簡単にできるんですね。私は知識がかなり古いんですが、昔よりだいぶ楽になってます。1回やると/etc/fstab に書いてくれるので、2回め以降はコマンドで
sudo mount /media/sda4 などとやるとOK(defaultsにしないなら)。
昔の印象ではntfsマウントは問題多かった気がするのですが、今はntfsでも問題ないみたいですね。でも私は今までの癖で、必ずFAT32のパーティションを1つ作っといて、WinとLinux間のデータ交換用に使ってます。

ところが、Linuxからはreadしかできず、書けなくなっていて、これはまだ原因不明。ntfsの方は「サスペンド中だから」とかいうメッセージが出たのでそういうものなのかと思いますが、vfatが書けないのはなぜだろう。まああまりここに時間かけてもいられないので、USBメモリはとりあえず動いてるのでLin->Winの移動には今のとこそれを使ってます。

[ネットワークディレイ]

クラスタ越しはまだやってないんですが、ネットワークディレイだけ測ってみました。
簡単はMPI_Send/Recvのやりとりで往復時間を測ると、100Mイーサのハブ1台を介した2台のPCの接続で、往復約1ms。MPICH2にmpiringtestというツールがついてくるんですが、これもどうやらほぼ同じことをやるようで、これもやはり約1ms。ネットワークディレイのほかに、MPI自体の処理やプロセスが起きる時間も含まれてるんでしょうが。ちなみにpingすると約0.5msです。

今はクラスタを始めたところで、実はちょっとトラブルで苦しんでいるんですが…この話はまた次回に。

« 2009年11月 | トップページ | 2010年1月 »