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

Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

C++学習記(4): boost mpi (+openmpi)

ようやく本来の目的であった並列計算に。

最初はOpenMPによるお手軽並列計算を使ってみたのですが、メモリの共有の切り分けがうまくいかず、並列度を上げれば上げるほど遅くなっていく残念な結果に・・・

 

ということで、結局急がば回れ、MPIでちゃんと書くほうが確実。

 

準備

まずはOpneMPIをインストールして、続いてMPIを使いやすくしたboost mpiを利用するためにboostを(再)インストール。

 

情報源としては↓がいい感じです。

kawa0810.hateblo.jp

 

ただ、boost 1.61だとusing mpi ;がうごかないことが何度もあったので注意。こういう時は本家(Getting started - 1.61.0 )を見に行って、それに従うのが吉。

結局、.user-config.jamとproject-config.jamの両方

using mpi : your/own/path/to/opnempi/bainaries ;

の形式の1文を追加して突破しました。

 

CMake

CMakeLists.txtは以下のような感じになりました。ただ、環境によって動かなかったりするのも経験したので、これを下敷きにしていろいろ試行錯誤するしかないみたいです。もっとスマートな書き方とかがあったら教えてください。

cmake_minimum_required(VERSION 2.8)
project(boostmpi_test)

add_definitions("-Wall -std=c++11")
add_definitions("-O3")

set( BOOST_ROOT "/usr/local/boost-1.61.0_gcc-4.9.2_mpi")
FIND_PACKAGE(Boost 1.6 COMPONENTS mpi serialization REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
set( CMAKE_C_COMPILER mpicc )
set( CMAKE_CXX_COMPILER mpicxx )

add_executable(helloBoostMPI helloBoostMPI.cpp)
add_executable(testScatter testScatter.cpp)
add_executable(testBroadcast testBroadcast.cpp)
add_executable(testGather testGather.cpp)

TARGET_LINK_LIBRARIES(helloBoostMPI ${Boost_LIBRARIES} -lboost_mpi -lboost_serialization)
TARGET_LINK_LIBRARIES(testScatter ${Boost_LIBRARIES} -lboost_mpi -lboost_serialization)
TARGET_LINK_LIBRARIES(testBroadcast ${Boost_LIBRARIES} -lboost_mpi -lboost_serialization)
TARGET_LINK_LIBRARIES(testGather ${Boost_LIBRARIES} -lboost_mpi -lboost_serialization) 

 

サンプル

せっかくなので、動作と使い方確認用に作成したソースを公開しておきます。

github.com

 

基本的に

boostjp.github.io

を焼き直しただけなんですが・・・