LoginSignup
1
6

More than 5 years have passed since last update.

macOS Sierra で GNU gcc + MPI + OpenMP を使う.

Posted at

漢なら 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 の最新版も同様にして動くかもしれません.

CCCXX に 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/binPATH に, $HOME/local/openmpi/libDYLD_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

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6