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

人生迷子

大学院に復帰!現在はBridge of Fashionという団体でファッション業界と他の業界を繋げる活動を定期的に行いつつ、徒然なるままに自分が思ったことをブログにまとめています。

JavaでopenMPIを使い始める時のメモ

【何気に初めての投稿】

登録はしてみたものの何書けばよいかわからん状態でしたが、 最近研究でMPIをいじることになり、 OpenMPIをインストールしようとしたら Java使えるようにするための記事とかが案外なかったりしたので、 「良い機会だしまとめてみよう」と思い至り、書いてみました。

環境はMac OSXです。

【OpenMPIとは】

MPIの実装の一つで並列プログラミングを簡単にかくことができるようになります。 詳しくはこちら

他にMPICHLAM/MPIなどがあります。

OpenMPとは別物なのでご注意を!!(紛らわしい笑)

【MPIとは】

MPIは"Message Passing Interface"の略で分散メモリを使った並列計算処理を行う際に発生するメッセージ通信のためのライブラリ規格を言います。

Wikipedia: MPI

【MPIを書きたい!!でも・・・】

OpenMPIでは標準ではC言語Fortranで書かれたものしか動かないんですね。 今のご時世にFortran・・・,C言語・・・ (ちなみにこの前研究室で僕がC言語で卒論のプログラムを実装したことを話したら「よくC言語なんて書けるね笑」と言われてしまいました笑)

しかし、ちょっとした手間を書ければOpenMPIに備わっているJavaインターフェースを利用してJavaプログラムからOpenMPIを利用することができます! 今回はこの手順を説明したいと思います。

【てか何故OpenMPIなのか】

そもそもJavaでMPIを利用するライブラリとしては他にもMPJmpiJavaなどがあります。これらはデフォルトでJavaから利用できる(名前からJava使える感漂わせてるし)のになんでお前OpenMPIなんじゃと思われるかもしれません。 実は僕自身も最初はMPJを入れていたのですが、研究室の先輩にいわせるとMacでプログラムを書いた後にそれをLinux系の環境で動かそうとするとハマることがあるらしいです。 てか過去に先輩がハマったらしいです・・・。 修論でハマるなんて絶対にやだ!ということで泣く泣くOpenMPIインストールにチャレンジしました。

ちなみに「Macでしかプログラム書かないし、動かさない」って人とかは別にMPJとかで全然いいです。てかそっちの方が楽です。 ぜひMPJで楽しいMPIライフを!

【手順1: OpenMPIのダウンロード】

Mac使ってるとほとんどbrewとかportsとかなんですけど 今回はconfigureの際にオプション設定しなきゃいけないんで、自分でmakeしてインストールします。 (brewとかでもできるよ!って人はぜひ教えてください><)

ダウンロードはこちらから

自分が使ってるjdkと同じバージョンのものをダウンロードしましょう。 (jdk1.8を使ってるならv1.8)

【手順2: 解凍してconfigure】

次にダウンロードした圧縮ファイルを解凍し、コマンドラインからそのフォルダに移動します。 (そのフォルダ内に"README.Java.txt"というものがあります。英語ぺらぺーらの人はそっち読む方が確実です)

フォルダに移動したら以下のコマンドでconfigureを実行します。 ポイントは二つ!

  • "--enable-mpi-java"オプションを付ける。これでJavaインターフェースを利用できる。
  • prefixオプションを指定して自分のインストールしたい場所を指定する。このパスは自分の環境に合わせて変更する。自分の場合は"/Users/{ユーザ名}/Library/openmpi/"としました。
$ ./configure --prefix=/hogehoge/openmpi --enable-mpi-java

【手順3: make & install】

あとはぱぱっとmakeしてインストールしましょう!(といってもこれが実はとても時間かかる汗)

$ make
$ make install

【手順4: PATHを通す】

さてこれでインストールできたーと思ってJavaで"import mpi.*;"なんてしようものなら 「あ?んなもんねえよ!」 とIDEに怒られます。 MPIプログラムを実行する時に使用するmpirunコマンドなども使用できない・・・。 そこで環境変数にopenmpiの実行パスを追加します。 以下を.bashrc、もしくは.zshrcに追加してください。 ついでにMANPATHも追加してmanコマンドでmpiのコマンドが見えるようにしておきます。

export PATH=/hogehoge/openmpi/bin:$PATH
export MANPATH=/hogehoge/openmpi/share/man:$MANPATH

これで設定を読み込むために

$ source .zshrc

を実行すればOK! (bash使いは"source .bashrc")

"man mpirun"などを実行してmpirunコマンドの説明が確認できるか試してみてください。

【手順5: 共有ライブラリパスにmpiライブラリを追加】

以上の手順を踏んで「いざ!MPI実行!」と意気込んで実行すると 「bindings failed to load required library 」と二度目のお叱りを食らいます。(俺は食らった) 日本語でおkといった感じですが、要は「君が使おうとしているライブラリなど俺は知らん!」ってことです。 なのでLD_LIBRARY_PATHにmpiライブラリのパスを追加する必要があります。 先ほどの設定ファイル(.zshrc or .bashrc)に以下を追加します。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/hogehoge/openmpi/lib 

これでまた

source .zshrc

して設定を読み込む。 そうすればJavaで念願のMPIプログラムが実行できます!

【とはいうものの・・・】

長い道のりではあったものネットを探してもJAVA版のOpenMPI APIとかがなかなか無いわけですよ。 いやー世の中世知辛い汗 なので、最初にも言いましたが、ほんとに自分みたいに諸事情がない限りはmpiJavaやMPJを利用することをおすすめします。

【それでもOpenMPIを使いたいあなたへ】

とりあえずはダウンロードしたフォルダの中にexampleが入っているので そのプログラムを動かして遊んでみましょう。

OpenMPIについての詳しい説明はここが良いです。

【お初でした】

というわけで初投稿でした。 見苦しい所やもしかしたら間違っている部分もあるかもしれませんが、 もし間違いがあったり、こうした方がいいよなんて意見があればぜひ教えていただければと思います。

【アウトプット大事】

最近、インターンの面接とか受けてると思うんですが、 ほんとにこの年になるとアウトプット大事ですね。 いくら「自分はこんだけ頑張った」とか「自分はこんなにすごい」って言っても 結局(エンジニアは特に)プロダクトやこのブログみたいなアウトプットがないと 見向きもしてもらえないなーっと実感していました。 なので、今回このエントリーも書いてみたし、これからもコンピュータサイエンスの話に限らず いろいろアウトプットしてみようと思います。

終わり