« Netbookモード付地デジキャプチャー | トップページ | HP Mini 1000ファーストインプレッションなど »

2008年12月15日 (月)

EeePC並列計算機化計画

今回はかなりマニアックな記事です。しかも激しく長文です。

さて、何台も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」を選択。

Mpich21

赤枠で囲んだ「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」の文字の上で右クリックを押して「ビルド」を選択。

Mpich22

すると、「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)の結果を載せておきます。

Mpich23_2

上半分がメインマシン(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系の方むき

« Netbookモード付地デジキャプチャー | トップページ | HP Mini 1000ファーストインプレッションなど »

数値解析系」カテゴリの記事

コメント

研究でMPIをwindows環境で動作させることになり、
四苦八苦しているところにこのブログを発見しました。
涙が出そうでした。
本当にありがとうございます。

ブログ主さんのほうでもいくつかつまっているようでしたので、
windows環境で動作を確認しているベンチマークテストおよび、
参考になりそうなVC++でのコンパイル方法がのっているサイトを
貼らせていただきます。
お役に立てれば幸いです。

http://w3cic.riken.go.jp/HPC/HimenoBMT/index.html
http://webcs.sit.ac.jp/wiki/index.php?MPI

こんにちは、苦学生さん。
無事Windows上でMPICHは動きましたでしょうか。
この記事の最後のほうにも書いていますが一台だけうまくいかないのがあるので、果たしてこの手順で正しかったのかがちょっと自身ありません。
ただ、いろんなページを読んで思ったのが、手順をひとまとめにしたものがない、ということだったので、がんばってまとめようとしました。お役に立てれば幸いです。
リンクの紹介、ありがとうございます。姫野ベンチをまさにコンパイルしようとしているのですが、たったそれだけのことで悪戦苦闘中です。二つ目のリンクは参考になりそうです。読んで勉強してみます。

卒研で並列計算のプログラムを作らなければいけなかったのですごく助かりました。
しかし、1台では動いたのですが2台を並列化して実行したとき、Credentials for ”ホストコンピュータ” rejected connecting to ”ノード”
Aborting: Unable to connect to WIN-1L6SR4IKE4O
といった具合でアクセスできません。
ファイアーウォールを無効にしても同じでした。
OSがWindowsServer2008だと別に何か設定しなければならないのでしょうか?
それともホストをデュアルブートにしているのが問題なのでしょうか?

こんにちは、SINさん。

Windows Serverを使ったことがないのでなんともいえませんが、Windowsのユーザー管理はわかりにくいですね。

ここでも書いていますが、すべてのマシンで同一の半角英数文字のユーザー名を作り直し(Administrator権限付)てようやく並列計算できるようになりました。

ちょっと前のことなので、記憶が怪しいですが、それぞれのマシンで共有フォルダをつくり、ユーザー名、パスワードを聞かれることなく共有できるかどうかを確認しました。

やってみて思ったのは、身も蓋もないですが、Linuxの方がかなり楽に並列計算環境を作れます。一旦動いてしまうとたしかにWindowsは楽ですが。

私も大学での研究は計算機シミュレーションでした。情報系の学科ではなかったのですが(原子力系です)、研究室が計算機メインのところだったため、気がつけば未だに解析屋(CAE屋)をやってます。

CAEの人材はまだまだ不足気味。ぜひ卒論を頑張って、社会に羽ばたいてください。

動きました。ブログ主さんのアドバイスどおりしてみたら無事実行できました。ありがとうございます。
今実際にプログラム作っています。難しいですが・・・。
また何かわからないことがあったら質問することになるかも知れませんがそのときはご教授よろしくお願いします。

こんにちは、SINさん。

おめでとうございます、動いて何よりですね。

残念ながら並列計算プログラムを作ったことがないので、あまり役に立ちませんが、なにかありましたらいつでもいらしてください。

この記事、実は作成に2週間かかったのですが、わりと読まれることがない記事だったので、役にたてただけでも嬉しいです。頑張ってくださいね。

私の場合、”Aborting: unable to connect to ”で苦難しました。
解決方法は、"smpd -status"を全PCで実行することでした。

非常に貴重な情報が載ったサイトですので、情報を追加しておきます。

参照記事より抜粋: ttp://vkn13.blogspot.jp/

4. If you now run "smpd -status", you might encounter a message saying "Aborting: unable to connect to ". In this case, repeat steps 3 and 4 again.

こんにちは、naoさん。

わざわざありがとうございます。本当にこの手の情報を載せてるサイトって少ないんですよね。私も悪戦苦闘しました。

最近はXeon Phiなども登場し、ますます並列計算が盛んになりつつある状況ですね。

↑ 書き間違えをしました。
管理者権限のコマンドプロンプトから、"smpd -install"の実行です

本当にMPI周りの情報は散乱していて学びにくいですね。
このページにとても助けられました。ありがとうございます。

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: EeePC並列計算機化計画:

« Netbookモード付地デジキャプチャー | トップページ | HP Mini 1000ファーストインプレッションなど »

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ