今回はかなりマニアックな記事です。しかも激しく長文です。
さて、何台もPCを持っている人でこんなことを考えた方はいますか?
「こいつら全部つないだら、どれくらいの計算能力になるんだろう?」
萌えちゃってブログののりゅーさんのように、自慢の爆速PCが何台もあるという方もいると思います。個々のPCはベンチマークで測れますが、複数のマシンで共同作業させるというベンチマークは残念ながらほぼ皆無です。
しかし、ドラゴンボールの悟空の元気玉みたく「みんな、オラに元気を分けてくれぇ~!」と計算機パワーをかき集めることができればなあ、とPCオタの私なんかはつい考えてしまいます。
それに対する答えになっているかどうかは微妙ですが、複数のWindowsマシンを並列計算機にしてしまうツールがあります。
並列計算にもいろいろな種類がありますが、Windows版MPICH2という、MPI(Message Passing Interface)と呼ばれる並列計算用ツール、とでもいうんでしょうか。
実はこの2週間ほど、これをやるためだけに恐ろしいほどの労力をかけていました。
昔、FreeBSDというフリーのUNIX系のOSでmpichをインストールしました。結構大変でしたが、ネット上にUNIX用のMPICHの設定方法などの情報は豊富だったのと、UNIX系OSはもともとリモートでつなぐというのが当たり前のOSということもあって、割とあっさりできました。
ところがWindowsはコンパイラすら持っていないので、MPICHの導入だけでは済まないなど、やっかいなところがあります。
とりあえずWindows用のMPICHがあるというのは知っていましたが、どこを見てもあまりきちんとした手順が載っていなくて、断片的な情報の収集とトライ&エラーの連続です。
やっとできたので、これは手順を残しておかないと忘れそうだと、このブログに残すことにしました。結構「mpich インストール」とか「mpich windows」なんていうキーワードが検索されているようで、みんな苦労しているみたいですから、参考になれば幸いです。
ここでは成功した方法の手順を書きます。余計なこともしているかもしれませんし、間違いもあるかもしれません。プロの方にご指摘いただければ幸いです。相変わらず誤字・脱字・勘違いのオンパレードかもしれないので注意してください。
まず前提ですが、すべてフリーソフトで行える。EeePCでも使える(つまりWindows XP Homeでも動く)こと、ただしコンパイル環境はちょっとEeePCだけでは辛そうなので、XP搭載のデスクトップ機があることも前提になりますね。
■ 準備
(1)MPICHをインストールする(並列化させる)PCすべてで同じ名前のユーザーを登録する[管理者権限のあるユーザー]、パスワードも必ず設定する。
このユーザー名は半角英数でつくるほうがいいです。今漢字のユーザー名になっていても、「コントロールパネル」-「ユーザーアカウント」-「アカウントを変更する」でユーザーを選ぶと、「ユーザー名を変更する」というのがあるので、ここで半角文字のユーザーに変更できます。パスワードもここで変えれます。
(2)コマンドプロンプトはよく使います。ショートカットをデスクトップにおいたほうがいいですね。
(3)事前に「Microsoft .NET Framework 2.0」と「Microsoft Visual C++ 2005 SP1 Redistributable」をインストールしておきます(すべてのマシンで)。
厄介なのは、「Visual C++ 2005~」をインストールするとき、「Command ほにゃらら syntax error」を出して止まることがあること。これは全角文字のユーザー名を使っていると起こります。「C:\Documents and Settings\[ユーザー名]\」の下に一時ファイルを作ろうとしているのに、このインストーラが全角文字を読めないため、一時ファイルが作れないため。
これを解決するには、「マイコンピュータ」を右クリック、「プロパティ」-「詳細設定」-「環境変数」を開き、「[ユーザー名]のユーザーの環境変数」にある「TEMP」と「TMP」の「値」を「編集」を押して、「C:\tmp2」などに書き換えるとうまくいきます。(事前にC:\tmp2というフォルダを作っておいてから実行)
(4)ここの設定は、メインマシン1台だけでいいです。
MPICHだけをダウンロードしても、実行ファイルが作れなければどうしようもないので、コンパイル環境を作ります。ここでインストールするのは「Visual Studio 2005 Express Edition」。以下のページからフリーで手に入ります。
http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/
ここにあるCDイメージ(.iso)ファイルを落としてきます。とりあえずどれがいるのかわからなかったので、Visual Web Developer、Visual Basic、Visual C#、Visual C++すべて落としてきて、ディスクに焼いてインストールしました。
ディスクがもったいないという方は、「DAEMON Tools」をインストールして、仮想光学ドライブにイメージをマウントしてインストールするという方法もあります。ただ、DAEMON Toolsはアドウェアをインストールされるので、嫌な方はインストール時に「~ sponcer ~(名前を忘れてしまいました)」というのをインストールされないようにチェックをはずすのをわすれないようにしてください。
(5)ようやくここでWindows版MPICH2をダウンロードします。
http://www.mcs.anl.gov/research/projects/mpich2/
ここのページの中央下のほうに「Win IA32 Binary (1.0.8)」とある右側の「download」をクリックしてダウンロードしてください。
ダウンロードすると、ダブルクリックしてインストールするだけです。これは全部のマシンに入れてください。
(7)並列計算実行時だけ、ファイヤーウォールを無効にしてください。すべてのマシンで行ってください。
■ 設定編
(1)まず、MPICH2の環境設定。これはすべてのマシンで実施してください。
「マイコンピュータ」を右クリック、「プロパティ」-「詳細設定」-「環境変数」を開き、「システム環境変数」のリストから「path」を選択し、「編集」を押す。
変数値の最後に「C:\Program Files\MPICH2\bin\」を追加します。
(2)メインパソコン(Visual Studio 2005 Express EditionをインストールしたPC)で、Visual Studio C++を起動。
ツールバー[ツール]>>[オプション]でオプションダイアログを開く
ツリービューの[プロジェクトおよびソリューション]>>[VC++ディレクトリ]を選択
[ディレクトリを表示するプロジェクト]のコンボボックスで[インクルードファイル]を選択リストに、「C:Program Files\MPICH2\include」を追加
[ディレクトリを表示するプロジェクト]のコンボボックスで[ライブラリファイル]を選択リストに、「C:Program Files\MPICH2\lib」を追加。
(3)MPICH2の設定をします。(すべてのマシンで実施)
スタートメニューから「すべてのプログラム」-「MPICH2」-「wmpiconfig.exe」を選択。
赤枠で囲んだ「Domain」のところのBOXをクリックすると、Windowsのネットワークドメインが出てきます。たいていの方はドメインが「MSHOME」という名前になっていると思うので、MSHOMEというのを選択して「Get Hosts」というのをクリックすると、今つながっているマシンが一通り表示されます。
とりあえずここで「Apply All」と押して「OK」と押せばいいようです。
また、「コマンドプロンプト」を開いて、次のように打ち込みます。
mpiexec -register
すると「Domain\user」を聞いてきますが、そのあとに[]付けででてきているドメイン、ユーザー名が正しければそのままEnterキーを押してください。
次にパスワードを聞かれます。そこではWindowsにログインするときのパスワードを入力します。これが2回聞かれて終了。
ちなみに私の家のメインPCのhost名は「P-DUALCORE」、EeePC 1000H-Xは「EEEPC1000HX」となっています。まずこの2台をつないで実行できるかを検証しました。
■ コンパイル
さて、ようやく実行に移ります。
その前に、MPI対応プログラムを用意しなくてはいけませんが、これは自分のPCでコンパイルするしかありません。Visual C++ Express Edisionを使ってサンプルプログラムを作ります。
(1)「スタートメニュー」-「すべてのプログラム」-「Visual C++ Express Edition」-「Microsoft Visual C++ Express Edition」をクリックしてVisual C++を開きます。
(2)「ファイル」-「開く」-「プロジェクト/ソリューション」をクリック
(3)「C:\Program Files\MPICH2\examples\examples.sln」を選択し「開く」。
(4)変換ウィザードが開きますが、「次へ」-「完了」をクリック。
(5)下のような画面になります。左上「ソリューションエクスプローラ」の中の「cpi」の文字の上で右クリックを押して「ビルド」を選択。
すると、「C:\Program Files\MPICH2\example\Debug」フォルダの中に「cpi.exe」というのができます。
(6)これを各マシンの同じ位置のフォルダ(ここではC:\tmp とします)に入れておきます。
やっと計算実行です。
■ 計算実行
(1)どのマシンでもいいので、コマンドプロンプトを開きます。
(2)はじめに、MPICH2がちゃんと機能しているかをチェックします。コマンドプロンプトに
mpiexec -localonly c:\tmp\cpi.exe
「Enter the number of intervals: (0 quits)」と出てくれば成功です。
そこでとりあえず「100000000」(0を8個)と打ち込んでください。EeePC 1000H-Xの場合、15秒ほどかかります。
ちなみにこのcpi.exe、円周率を計算するプログラムです。
このときいれる数字の意味はよくわかりませんが、でかい数字ほど計算負荷が大きくなるもののようです。ちょうど0が8個ほどの数字でそれなりのベンチマークが取れるくらいになります(10秒前後)。
ちなみに結果には、正しい円周率との誤差も出てきます。数字が大きいほど誤差が小さくなる・・・はずですが、あまり大きな値だとかえって誤差が拡大します。これは数値計算上の問題でしょうが、円周率を計算するのがここの趣旨ではないので、この際目をつぶります。
さて、各マシンでのチェックが終わるといよいよ並列計算です。
(3)どのマシンでもいいので、コマンドプロンプトを開きます。ここでは「p-dualcore」と「eeepc1000hx」の2台のマシンを使います。
コマンドプロンプトで、
mpiexec -hosts 2 p-dualcore eeepc1000hx c:\tmp\cpi.exe
と打ち込みます。同じように数字を聞かれるので、「100000000」と打ち込みます。
■ 結果
計算実行(2)、(3)の結果を載せておきます。
上半分がメインマシン(Pentium DualCore 1.6GHz)で実行した結果、下半分がこのメインマシンとEeePC 1000H-Xとで並列計算させた結果です。
まずいえるのは、並列計算した結果のほうが遅い(単独では7.4秒、並列では9.6秒くらい)ということです。
これは速度がぜんぜん違う計算機を組み合わせたからです。簡単に言うと、平均化されています。
計算の負担が半々で受け渡されるため、実は速い方のメインマシンは9.6秒間のうち、大部分が遊んでいました。EeePC 1000H-Xの計算を待っている状態です。
計算負荷の比率を変えられれば、もう少し効率がいいかもしれません。そういうことができるかはわかりませんが。
ちなみにEeePC 1000H-X単独での結果は15秒くらいでしたので、当然並列化した結果のほうが早いです。
あと、出てきた円周率の結果が、上と下とで違うことがわかりますでしょうか。
ちなみに、並列計算ではこの結果が毎回変わります。(単独では結果は変わりません)
並列計算では複数のマシンで処理するため、実は結果が毎回変わってしまうという問題を抱えています。専門ソフトではこのへんをうまく工夫して結果が変わらないようにしているようです。
これだけ小規模の計算では問題になりませんが、ネットワーク速度も計算速度にかかわってきます。大規模計算用PCクラスタでは、無線LANなんてもってのほか、ギガビットイーサーより数段速いネットワークが使われています。
まあ、これだけいろいろやって、やっとできたのは結果の安定しない円周率の計算プログラムを動かすという結論ですが、今回の手順で並列計算用プログラムを作る環境ができたことになります。工夫次第ではすごいソフトを作る環境が手に入ったわけです。
私はもうちょっとましなベンチマークがないか探して見ます。いくつか見つけたのですが、Visual C++でのコンパイル方法がわからなかったり、悪戦苦闘です。
あと、上の手順をもってしてもEeePC 4G-Xだけがつながらないという、なんとも奇妙な現象が起こっています(単独では動きますが)。こちらは原因不明です。
それにしても、Visual BasicやVisual C++は、最新ではない、機能限定ではあるものの無料配布されているなんて初めて知りました。意外と太っ腹ですね、Microsoft。
※とりあえず、参考サイト載せます(あまり使わなかったものも含む)http://ums.futene.net/wiki/Paralell/4D5049434832206F6E2057696E646F7773204C6F63616C.html
http://www2.itc.nagoya-u.ac.jp/pub/pdf/pdf/vol03_03/194_225kouza.pdf
http://syassy.cocolog-nifty.com/gomitame/2005/03/mpich2_for_wind.html
http://www.mcs.anl.gov/research/projects/mpich2/
http://www.sfk-nga.co.jp/HPC/document/ex01.html ←こちらはLinux系の方むき
最近のコメント