読者です 読者をやめる 読者になる 読者になる

Boost 1.53 を Boost.MPI 込みでインストールした手順のまとめ

C/C++ Boost MPI GCC

主旨

 前回 (さくら VPS 上に gcc4.8 をインストールする方法 - kawa0810の日記 ) の GCC 4.8 をインストール後に Boost 1.53 を Boost.MPI 込みでインストールした際の自分用まとめ記事です.

インストールに使用したもの

  1. OpenMPI 1.6.4:Open MPI: Open Source High Performance Computing
  2. Boost 1.53.0:Boost C++ Libraries

さらに,Boost のインストールには以下のパッケージが必要
# 今回は yum でインストールする

  • python-devel
  • zlib-devel
  • bzip2-devel

また,デフォルト (/usr/local/) にインストールした場合は環境を壊す可能性があるとのことなので*1,/modules を作成しインストールする .
# OpenMPI も同じディレクトリにインストールする

OpenMPI のインストール

# cd ; mkdir openmpi; cd openmpi
# wget http://www.open-mpi.org/software/ompi/v1.6/downloads/openmpi-1.6.4.tar.gz
# tar xvzf openmpi-1.6.4.tar.gz 
# cd openmpi-1.6.4; mkdir build; cd build
# ../configure --prefix=/modules
# make -s -j 3
# make check -s -j 3
# make install  
# ldconfig 
# export PATH=$PATH:/modules/bin //パスを通す

Boost のインストール (Boost.MPI 込み)

//準備
# yum -y install python-devel
# yum -y install zlib-devel
# yum -y install bzip2-devel   
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/modules/lib:/usr/local/lib:/usr/local/lib64
# export LD_RUN_PATH=$LD_RUN_PATH:/modules/lib:/usr/local/lib:/usr/local/lib64

//Boost をダウンロード
# cd ; mkdir boost; cd boost
# wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz/download
# tar xvzf boost_1_53_0.tar.gz 
# cd boost_1_53_0

//user-config.jam の編集 (Boost.MPI とコンパイラの指定)
# emacs ./tools/build/v2/user-config.jam

...
# ------------------
# GCC configuration.
# ------------------

# Configure gcc (default version).
# using gcc ;

# Configure specific gcc version, giving alternative name to use.
# using gcc : 3.2 : g++-3.2 ;
using mpi ; //追加する
using gcc : 4.8.1 : g++-4.8.1 ; //追加する
...

//インストールする
./bootstrap.sh 
./b2 install -j3 --prefix=/modules

問題と解決方法

コンパイルできるかのサンプルコードとして,ココ (MPI による並列計算 - boostjp) のコードを拝借.実際にコンパイルしようとすると以下のエラーメッセージがでる.

$ mpicxx main.cpp -lboost_mpi
/modules/lib/libboost_serialization.so.1.53.0: undefined reference to
`std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'
collect2: ld はステータス 1 で終了しました

原因を調べてみると,GCC のバージョンが 4.6 以上じゃないと駄目ぽい? 今回の mpicxx の GCC のバージョンは以下の通り.

$ mpicxx --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

試しにコンパイラを g++ 4.8.1 にする.

$ g++-4.8.1 main.cpp -lboost_mpi $(mpicxx -showme:link) $(mpicxx -showme:compile) 

問題なくコンパイルと実行ができることを確認.

追記

パスの設定を毎回するのが面倒なので /etc/profile に以下を追記しとく
# /etc/profile に追記することで全ユーザのログイン時にパスが設定される

# Setting PATH
MY_BIN=/modules/bin
MY_LIB=/usr/local/lib64:/usr/local/lib:/modules/lib

# export PATH
export PATH=$PATH:$MY_BIN
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MY_LIB