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です。
今はクラスタを始めたところで、実はちょっとトラブルで苦しんでいるんですが…この話はまた次回に。
« ラブプラスプラス | トップページ | ボンクラーズ、デビュー »
「将棋プロセサ」カテゴリの記事
- ボンクラーズの開発過程について書いた記事が掲載されました(2019.03.07)
- 「浅い評価値を深い評価値に近づける学習法」誕生の背景(2016.10.06)
- 塚田九段の対ボンクラーズ練習棋譜を公開します(2013.09.07)
- Puella α ソース公開(2013.08.28)
- クラスタ並列の解説記事を公開します(2013.08.22)
通りすがりのものですが、Vista 以降は通常ハイブリッドスリープ(スリープしつつ休止状態の準備をする)が有効になっていて、このときは休止状態がメニューに出ません。ハイブリッドスリープでは、電源が落ちなければメモリが保持されるのですぐ復帰できるし、電源が落ちた場合でも休止状態と同様ディスクから読み込んで復帰できます。
どうしても(電力消費などの問題で)休止状態が使いたい場合は、電源オプション→プラン設定の編集→詳細→スリープ→ハイブリッドスリープを許可する、をオフにしてみてください。
投稿: YK | 2009年12月17日 (木) 15時21分
YKさん、情報ありがとうございます。
ハイブリッドスリープというのがあるんですか、知らなかったです。たしかにこれは(普通のスリープの使用法からすると)一理ありますね。
ただ私の場合は本文にあるとおり、休止させてすぐにまた電源を入れてLinuxに切り替える、が目的なので、すぐに休止になってほしいのです。電源オプションでの指定、今度ためしてみます。
投稿: A級 | 2009年12月18日 (金) 09時35分
やってみたらメニューに出て、休止できました。
どうもありがとうございます。
投稿: A級 | 2009年12月18日 (金) 14時24分