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

はじめに

しばらく前から開発環境をVisual Studio 2013(VS2013))に変更しました。既にVisual Studio2015も出ていますが、Intel C++が対応してくれるまで、もう暫くVS2013のままで行きます。
さて、Microsoft製のMPI(MS-MPI)も前回の記事以降versionが2つも更新されまして、version 6(v6)となりました。今回から、ダウンロード先での表示もHPCパックの付属品という表記から独立したMS-MPI v6という表記に変ったようです。インストールは前回までとほぼ同様なのでスムーズに導入できました。
このメモ時点での環境。すでにVisual Studioはインストール済みの環境を想定しています。
  1. OS:Windows 7 pro. 64bit
  2. C++コンパイラ:Visual Studio 2013 community
追記:2016/01/08
Visual Studio 2015とMS-MPI v7でも同様の方法で利用できました。

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

追記:2016/10/31
パス登録の方法を「VC++ディレクトリ」を変更しない方法へと修正しました。 「VC++ディレクトリ」を変更してしまうとIntelコンパイラを利用する場合にパスがうまく切り替わらない問題の為。

MS-MPIの取得

MS-MPIはMicrosoftのダウンロードセンターから取得できます。この記事を書いている現時点でのリンクは
https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx
の中あたりにリンクがあります。ただし、Microsoftのリンクアドレスは頻繁に変わるので、最新のものを取得するようにしてみてください。 また、前回までは64bitか32bitかの選択項目があった気がしますが、今回はありませんね。 ここで、msmpisdk.msiとMSMpiSetup.exeの二つともインストールする必要があります。 前者はincludeやlibのファイル、後者は計算実行時のmpiexecがインストールされます。

MS-MPIのインストール

さて、msmpisdk.msiをダウンロードしたら、クリックしてそのままインストールしましょう。 ただし、以前のバージョンのMS-MPIをインストールしてある場合は、手動で案インストールしておけと警告が出ます。従いましょう。 あとはインストーラーの設定に従って進んでください。今回はインストールディレクトリの変更はしないものとして話を進めます。 前回のメモのversion(v4)までとは、デフォルトのインストールディレクトリが変わりました。

includeやlibのインストール場所は
C:\Program Files (x86)\Microsoft SDKs\MPI\

mpiexecのインストール場所は
C:\Program Files\Microsoft MPI\

になりましたね。

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

インストールができたら、Visual Studioにインストールディレクトリのパスを登録します。

(追記:2016/10/31の新しい設定方法)

まず目的のプロジェクトファイルを開き、メニューから「プロジェクト」→「プロパティ」を開きます。 すると別窓でプロパティーページが開きます。その左側のツリーの中から「構成プロパティ」を選んで以下を設定します。

  1. 「C/C++」→「全般」→追加のインクルードディレクトリに $(MSMPI_INC) を追加
  2. 「リンカー」→追加のライブラリディレクトリに $(MSMPI_LIB64) を追加(x64の場合)
  3. 「リンカー」→追加のライブラリディレクトリに $(MSMPI_LIB32) を追加(x86の場合)
さらに、プロパティーページの左側のツリーの中から「構成プロパティ」→「リンカ」→「入力」を選び、右の設定項目の中で以下のlibファイルを"追加"します。おそらくデフォルトで色々と書いてある項目なので、それらを消さずに、末尾にセミコロン区切りで追加してください。
  1. 追加の依存ライブラリ:msmpi.lib
実行可能ファイルはパスを通さず、後述のように、「構成プロパティ」→「デバッグ」のところで$(MSMPI_BIN)を使ってmpiexec.exeの場所を直接指定します。 ここで、環境変数$(MSMPI_INC), $(MSMPI_LIB64), $(MSMPI_LIB32), $(MSMPI_BIN)の中身はそれぞれMSMPIのインストールに合わせて設定されていると思います。

※以下の「VC++ ディレクトリ」を変更する方法は非推奨です。Intelコンパイラの使用時に、パスが切り替わらない問題が起こるためです。よって、上述の方法でパスを設定することを推奨します。

VS2013とVS2012では、「VC++ ディレクトリ」によるパスの登録方法はほぼ一緒です。 まず目的のプロジェクトファイルを開き、メニューから「プロジェクト」→「プロパティ」を開きます。 すると別窓でプロパティーページが開きます。その左側のツリーの中から「構成プロパティ」→「VC++ ディレクトリ」を選びます。

次のようにMS-MPIのディレクトリを追加していきます。 以前のversionからかなり変わっているので注意しましょう。 開発環境が64bitOSであっても、x86用の32bitアプリケーションソフトを作ることが可能です。目的に合わせてライブラリの設定値は変えてください。 細かい操作方法は省きます。

  1. 実行可能ディレクトリ:C:\Program Files\Microsoft MPI\Bin
  2. インクルードディレクトリ:C:\Program Files (x86)\Microsoft SDKs\MPI\Include
  3. ライブラディレクトリ(x64の場合):C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64
  4. ライブラディレクトリ(WIN32(x86)の場合):C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x86
さらに、プロパティーページの左側のツリーの中から「構成プロパティ」→「リンカ」→「入力」を選び、右の設定項目の中で以下のlibファイルを"追加"します。おそらくデフォルトで色々と書いてある項目なので、それらを消さずに、末尾にセミコロン区切りで追加してください。
  1. 追加の依存ライブラリ:msmpi.lib

編集してしまった「VC++ ディレクトリ」の各設定をデフォルトに戻す方法も書いておきます。 各項目の行の右端の▽ボタンから開くドロップダウンリストから、<親またはプロジェクトの既定値から継承>を選びます(<編集>を選ぶと次のウィンドウが開くのでダメです)。 その状態でウィンドウ右下の「適用」ボタンを押せば、デフォルト項目が入力されます。 Intelコンパイラを使っている場合は、VC++との切り替え時にデフォルト設定からしかこのパスを自動編集しないようなので、 デフォルトに戻しておくことをお勧めします。

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

今後もVisual Studio用のdebuggerは公開されないのでしょうか。 ここでは暫定的に、Visual Studio上からF5キーでexeを実行できるようにします。 プロパティーページの左側のツリーの中から「構成プロパティ」→「デバッグ」を選び、右の設定項目の中で以下の設定をします。
  1. 起動するデバッガー:ローカル Windows デバッガー
  2. コマンド:$(MSMPI_BIN)mpiexec.exe   (追記:2016/10/31ここで$(MSMPI_BIN)を使ってパスを指定
  3. コマンド引数:-n プロセス数 $(TargetPath)
  4. 環境:OMP_NUM_THREADS=スレッド数 (OpenMPでhybrid並列にする場合)
ここで、"プロセス数"には実行したい並列数(CPU数)を数字で入れましょう。F5実行した時に"mpiexec"が最初に起動し、その上でプロセス数分の実行ファイルが並列実行されます。 また、MS-MPIをインストールした直後では環境変数のパスが通っていない可能性があるため、うまくいかないときは一度OSを再起動しましょう。

コンパイル&実行

ディレクトリの設定ができたら、ソースコードに"mpi.h"をインクルードさせましょう。 これで、MPI関係のAPIもコンパイルが通ります。 無事にコンパイルが通ればおめでとうございます。