漢なら macOS でも MPI + OpenMP プログラミングしたいですね!
C++11 になり std::thread
でスレッドプログラミングが主流になりつつある予感もしますが, まだまだ HPC 系プログラムで OpenMP 使いたいときがありますね.
XCode 付属の Apple gcc(clang) はかたくなに OpenMP のサポートをしないので, 新しく GNU gcc(or clang も 3.8 くらいから OpenMP 対応されていますね)をインストールすることになります.
今回は brew で gcc についてあつかいます.
GNU gcc のインストール
2017 年 4 月 7 日時点の最新は以下の通りです.
macOS : 10.12.4
XCode : 8.3
Apple gcc: Apple LLVM version 8.1.0 (clang-802.0.38)
gcc-6: version 6.3.0 (Homebrew GCC 6.3.0_1)
gcc-5: version 5.4.0 (Homebrew GCC 5.4.0_1)
macOS Sierra(OSX 10.12 SDK)では, より Apple 拡張がヘッダファイルに入ったようで, gcc だとヘッダがパースできなかったりするので, 上より古い gcc が homebrew で入っていたらアップデートしておきましょう(とはいえまだまだ一部 OSX のヘッダは GNU gcc で扱えないものもある)
また, binutils 周りは XCode で入る binutils を使わざえるを得ません.
そのため gcc-5.4 では C/C++ プログラムのリンク時に以下のようなワーニングが出る時があります.
/var/folders/pm/_61jgqgn0qdf1s6_pd1mzztc0000gn/T//ccYb1AdB.s:167:11: note: change section name to "__text"
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
^ ~~~~~~~~~~~~~
gcc 5.5 が出たら治るでしょうか...? なにやらあやしいので, gcc-6 を使うことにします.
普通に homebrew で gcc-6 を入れます
$ brew install gcc@6
OpenMPI のインストール
brew でコンパイラを指定して openmpi をビルドもできるようですが, 今回はソースからコンパイルすることにします.
2.0.2 をコンパイルします. 2.1 の最新版も同様にして動くかもしれません.
CC
と CXX
に gcc6 を指定して configure でいけます. $HOME/local/openmpi
にインストールします.
configure には, --enable-mpi-cxx
(MPI C++ binding を有効)をお好みで添えて.
$ cd /path/to/openmpi-2.0.2
$ CC=gcc-6 CXX=g++-6 ./configure --prefix=$HOME/local/openmpi
$ make && make
$HOME/local/openmpi/bin
を PATH
に, $HOME/local/openmpi/lib
を DYLD_LIBRARY_PATH
に追加しておきます(DYLD_LIBRARY_PATH
は設定しないでも OK かも)
mpicc で gcc-6 が使われていることを確認します.
$ mpicc -v
...
gcc version 6.3.0 (Homebrew GCC 6.3.0_1)
テストコードをコンパイルして実行してみます.
// test.cc
# include <cstdio>
# include <cstdlib>
# include <mpi.h>
# include <omp.h>
int
main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("rank %d, omp_get_max_threads %d\n", rank, omp_get_max_threads());
MPI_Finalize();
return 0;
}
$ mpicxx -fopenmp test.cc
$ mpirun -np 4 ./a.out
rank 1, omp_get_max_threads 4
rank 2, omp_get_max_threads 4
rank 3, omp_get_max_threads 4
rank 0, omp_get_max_threads 4
Cool!
Happy MPI + OpenMP programming!
TODO
aobench MPI 版を作って, MPI + OpenMP の動作確認とベンチマークをやりやすくしたい.
References
MacにMPI+OpenMPハイブリッド並列環境を構築する
http://qiita.com/kaityo256/items/ae9329dae24ea8828ae0