UbuntuにOpenMPIをインストールする。の追記

現行の最新版のOpenMPI(ver.2.0.1、2016/9/16)と旧verの違いをメモしておきます。

旧verではサポートしていたC++の実装の部分がver.2.0.0系から削除されています。

ただ、このことは大きな変更点として書かれていないのでOpenMPI中のC++の実装方法を変更している途中かもしれないし、今後のサポートを切るための準備段階かもしれません。

もともとOpenMPIにおけるC++の実装は「C++で書いても動くようにはしたよ!(Cでの実装部分に飛ばすだけ)」くらいのものなのでもしかしたら先行きは明るくないのかも…。

私はとりあえずver.1.10.4にダウングレードすることで場当たり的な対応をしましたが、ちょっと困りますね。

OpenMPIをUbuntu16.04にインストール

こんにちは、ばいろんです。

並列計算用にOpenMPIをインストールしたので、その手順を紹介したいと思います。

環境

  • OS : xUbuntu 16.04
  • コンパイラ : gcc

導入までのステップ

  1. OpenMPIを公式HPからダウンロード
  2. ./configureでOpenMPIのインストール先の構成
  3. OpenMPIをインストール
  4. OpenMPIの実行ファイル、ライブラリー、マニュアルへのPATHを通す

こんな感じです。

 

(2018/9/12追記)

open MPI3系について

MPIの./configureにC++の設定が入っていますが、MPI3系からはC++はサポートされないのでCXX=g++のオプションはエラーを起こすかもしれません。

 

fortranの設定について

自分の環境では最初からfortranが入っていたので気づかなかったのですが、fortranがインストールされていない状態で./configure時にF77=gfortran FC=gfortranの指定をするとそんなものないといわれます。fortranを使用する人はあらかじめインストールを、使用しない人は./configureを実行する際にF77=gfortran FC=gfortranのオプションを消してください


 

  • OpenMPIを公式HPからダウンロード

公式 : Open MPI: Open Source High Performance Computing

ompihp

 

左側のDownload

ompihp2

2016/9/15時点でのverは2.0.1です

上から2番目のopenmpi-2.0.1.tar.gz(13.56MB)のものをダウンロードします。ダウンロード先はデフォルトの/home/ユーザー名/Downloadsへ

ダウンロードしたら展開しましょう。tar.gz形式のファイルは次のコマンドで展開できます。

($ cd /home/ユーザー名/Downloads ディレクトリの移動)
$ tar xzf openmpi-2.0.1.tar.gz

 

  • ./configureでOpenMPIのインストール先の構成とインストール

展開したOpenMPIのフォルダをカレントディレクトリにして./configureの設定を行います。

私の場合は/opt/OpenMPIというディレクトリにOpenMPI関連のものをまとめておきたかったので、あらかじめもともとあった/optディレクトリに新たに/OpenMPIディレクトリを作成しました。

ディレクトリの構成が私と同じ場合は次のコマンドでopenMPIの構成と利用するコンパイラの設定を行うことができます。

 

C,C++,Fortran用のライブラリを全部入れたいとき

($ cd /home/ユーザー名/Downloads/openmpi-2.0.1 ディレクトリの移動)
$ ./configure --prefix=/opt/OpenMPI CC=gcc CXX=g++ F77=gfortran FC=gfortran
$ make
$ sudo make install
(あらかじめgfortranをインストールしておかないと./configureでこけた気がします。)

 

インストール先に関しては/usr/localがよくあるらしいのですが(OpenMPIもデフォルトのインストール先は/usr/localだったはず…。)、このあたりはしきたりだったり流派で異なると思うのでこちらのブログを参考にして決めました。(/usr/local とは何なのか

 

(どこにインストールするのが標準なのかだれかおしえて)

 

  • OpenMPIの実行ファイル、ライブラリー、マニュアルへのPATHを通す

最後にPATHを通す作業を行います。ファイルがちゃんと入っていてもファイルの場所を教えてあげないと実行できないのでとても重要です。(私もPATHや環境変数周りのことは苦手です。)

OpenMPIに必要なのは

  1. 実行ファイルの場所を教える”PATH”
  2. ライブラリの場所を教える”LD_LIBRARY_PATH”
  3. マニュアルの場所を教える”MANPATH”

の3つです。

ターミナルで次のコマンドを使用すると設定できます

PATH=/opt/OpenMPI/bin:$PATH
LD_LIBRARY_PATH=/opt/OpenMPI/lib:$LD_LIBRARY_PATH
MANPATH=/opt/OpenMPI/share/man:$MANPATH
export PATH LD_LIBRARY_PATH MANPATH

確認するときはechoコマンドで( $PATHのところを$LD_LIBRARY_PATHや$MANPATHに変えてそれぞれ出力させてみてください)

$ echo $PATH

設定したPATHが一覧の中に含まれていれば成功です。

ただし、このままだとターミナルを起動するごとにPATHの設定を入力する必要があるので.bashrc(ターミナルの設定ファイル)の最後に下の設定内容をコピペしておきましょう。

PATH=/opt/OpenMPI/bin:$PATH
LD_LIBRARY_PATH=/opt/OpenMPI/lib:$LD_LIBRARY_PATH
MANPATH=/opt/OpenMPI/share/man:$MANPATH
export PATH LD_LIBRARY_PATH MANPATH

(.bashrcは隠しファイルなので隠しファイルを見れるように設定しないと見つかりません。bashrc自体は割と編集する機会が多いので私の環境では隠しファイルが常に見えるように設定しています)

 

  • サンプルコードの実行

サンプルコードは適当に拾ってきた下のソース

//sample.cpp
#include "mpi.h"
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int rank, size;
    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    printf("Hello, World.  I am %d of %d\n", rank, size);

    MPI_Finalize();
    return 0;
}

コンパイルはmpic++、実行はmpirunで行います。mpirunのオプションについている-npで何並列で動かすか制御できるみたい。なんとなく1で

$ mpic++ sample.cpp
$ mpirun -np 1 a.out

とりあえず実行できるみたいなので一安心。

 


 

  • 問題点

サンプルコードを見てお分かりの通りC++といいながらこれはCのソースコードです。実はC++では関数の表記が異なっていて、例えばCでのMPI_Init( )関数はC++ではMPI::Init( )という風になっています。(でも、積極的に書き分けるようなものでもないみたい。C++だよ~と明示したい人やC++なのにC風で書くのが気持ち悪いと思う人ならどんどん使い分けるべきだと思います。)

今ぶち当たっている問題点はMPI_Init( )で書くとコンパイルが通るのですが、MPI::Init( )と書きかえると「そんな名前の型はない!!」と怒られてコンパイルが通らないことですね…。

私はとりあえず動きさえすればいいので表現にはこだわらないのですが、他の人が作った自作ライブラリにMPI::の表現がふんだんに使われているのでにっちもさっちもいかない状態です…。

 

もし、同じ症状の人がいたら教えていただけると嬉しいです。

それでは、今回はここまでにします。(MPIがC++のソースで動かない問題解決編…書けるといいなぁ)

Scroll to top