Visual Studio 2012におけるMS-MPIの利用

検索サイトからいらした方へ

インストール関連の最新記事はリンク先ページです:
最新インストール記事へ移動
デバッグ実行はこちら

はじめに

開発環境をVisual Studio 2012(VS2012))に変更しました。これまで2008を使ってきて2010はパスしたのですが、いいですよね2012。マシンパワーが上がったためなのかアプリケーションの最適化のためかわかりませんが、VS2012はサクサク動き、補完機能も快適です。
さて、ここでは、VS2012にあわせて、Microsoft製のMPI(MS-MPI)のインストールにチャレンジします。MS-MPIはWindows環境でMPIが使えるようにMicrosoft自身が用意したものなので、Visual Studioでの開発には最も楽に導入できると思います。特にVS上でのデバッグ実行がMPI並列でも可能になるので、開発が非常にスムーズになります。
このメモ時点での環境。すでにVisual Studioはインストール済みの環境を想定しています。
  1. OS:Windows 7 pro. 64bit
  2. C++コンパイラ:Visual Studio 2012 pro
  3. MS-MPI:HPC Pack 2012 MS-MPI Redistributable Package - 日本語

MS-MPIの取得

MS-MPIはMicrosoftのダウンロードセンターから取得できます。この記事を書いている現時点でのリンクは
http://www.microsoft.com/ja-jp/download/details.aspx?id=36045
です(2013/12/13修正)。ただし、Microsoftのリンクアドレスは頻繁に変わるので、最新のものを取得するようにしてみてください。 まだダウンロード時には64bit環境(x64)か32bit環境(x86)か、あなたのOS環境に合わせた方のバージョンを選択してください。ここでの選択はビルドするバイナリがx86/x64どちらかということではなく、あくまでOSの環境がどちらかということです。基本的にOSが64bitの場合、x64をインストールすることになりますが、Visual Studioでのコンパイルに必要なライブラリファイルは、64bit用と32bit用の両方がちゃんとインストールされます。

MS-MPIのインストール

さて、mpi_x64.Msiをダウンロードしたら、クリックしてそのままインストールしましょう。 あとはインストーラーの設定に従って進んでください。今回はインストールディレクトリの変更はしないものとして話を進めます。

MS-MPIのパスをVisual Studioに登録

インストールができたら、Visual Studioにインストールディレクトリのパスを登録します。 VS2008の場合と比べて、VS2012では、「VC++ ディレクトリ」によるパスの登録方法が変わりました。 「VC++ ディレクトリ」を設定する方法としては、プロジェクトごとに設定する方法と、ユーザー単位で設定する方法があるようですが、ここではプロジェクトごとに設定することにします。
まず目的のプロジェクトファイルを開き、メニューから「プロジェクト」→「プロパティ」を開きます。 すると別窓でプロパティーページが開きます。その左側のツリーの中から「構成プロパティ」→「VC++ ディレクトリ」を選びます。 次のようにMS-MPIのディレクトリを追加していきます。 開発環境が64bitOSであっても、x86用の32bitアプリケーションソフトを作ることが可能です。目的に合わせてライブラリの設定値は変えてください。 細かい操作方法は省きます。
  1. 実行可能ディレクトリ:C:\Program Files\Microsoft HPC Pack 2012\Bin (2013/06/27変更)
  2. インクルードディレクトリ:C:\Program Files\Microsoft HPC Pack 2012\Inc
  3. ライブラディレクトリ(x64の場合):C:\Program Files\Microsoft HPC Pack 2012\Lib\amd64
  4. ライブラディレクトリ(WIN32(x86)の場合):C:\Program Files\Microsoft HPC Pack 2012\Lib\i386
さらに、プロパティーページの左側のツリーの中から「構成プロパティ」→「リンカ」→「入力」を選び、右の設定項目の中で以下のlibファイルを"追加"します。おそらくデフォルトで色々と書いてある項目なので、それらを消さずに、末尾にセミコロン区切りで追加してください。
  1. 追加の依存ライブラリ:msmpi.lib

Visual Studio上でのMPIプログラム実行のための設定

VS2008(VS2010も?)では「MPIクラスタデバッガ」なるデバッグ実行モードが選べますが、VS2012では現時点で未対応の様です。もしかすると、使えるのかもしれませんがweb資料を漁った限りでは情報が見つかりませんでした。分かり次第追加レポートします。
ここでは暫定的に、Visual Studio上からF5キーでexeを実行できるようにします。 プロパティーページの左側のツリーの中から「構成プロパティ」→「デバッグ」を選び、右の設定項目の中で以下の設定をします。
  1. 起動するデバッガー:ローカル Windows デバッガー
  2. コマンド:C:\Program Files\Microsoft HPC Pack 2012\Bin\mpiexec.exe (2013/06/27変更)
  3. コマンド引数:-n プロセス数 $(TargetPath)
ここで、"プロセス数"には実行したい並列数(CPU数)を数字で入れましょう。F5実行した時に"mpiexec"が最初に起動し、その上でプロセス数分の実行ファイルが並列実行されます。 また、MS-MPIをインストールした直後では環境変数のパスが通っていない可能性があるため、うまくいかないときは一度OSを再起動しましょう。

コンパイル&実行

ディレクトリの設定ができたら、ソースコードに"mpi.h"をインクルードさせましょう。 これで、MPI関係のAPIもコンパイルが通ります。 無事にコンパイルが通ればおめでとうございます。 実行すると、mpiexec.exeとしてプロンプトが立ち上がり、その上で並列数分の実行ファイルが走ります。 ただし、試した限りではprintf等の出力がこのプロンプトに出力されません(VS2008ではMPIクラスタデバッガー無しでもプロンプトへの出力はできたのですが)。仕方ないので、printf等でログがとりたいときは、先のデバッガー設定いおいてコマンド出力を次のようにします。(2013/06/27変更) ちょっと正確なことはわかりませんが、Visual Studio2012 update 3からは複数プロセスから同一プロンプトへの一斉出力が可能になったみたいです。少なくとも私の環境では動き始めました。ただし遅延が起きるみたいなので、printfの後にすぐfflush(stdout)するなどの工夫が必要です。
以下の設定はプロンプトへの出力がうまくいかない人だけ試してみてください。 こうすることで"log.txt"に全プロセスからのstdout出力が記録されます。

余談

Visual Studio 2012の「MPIクラスタデバッガ」が早く出て欲しいですね。 また何かわかったらレポートします。

(追記:2016/07/28)MPI並列でもデバッグ実行できる方法に気付きました。 こちらへどうぞ。