MPIはプロセス並列のライブラリとして並列計算業界でデファクトスタンダードになっています。特に理論シミュレーション業界では、数百ノードに及ぶ並列化されたスパコンでfortran+MPIで書かれたコードがスタンダードになっています。
僕は大学院までfortranとMPIでプラズマの粒子シミュレーションをやっていました。いろいろ経緯があってほぼ独学でMPIを習得したということもあって、個人的に思い入れもあるので、まとめてみようと思います。
本シリーズ記事について
- 対象とする人
- fortranの基本文法がわかる人
- 並列計算を初めてやる人
- 目標
- fortranでMPIコードが読み書きできる
目次(予定)
- 並列処理とは ←今ココ
- プロセス並列の基本
- 集団通信
- 1対1通信
- オブジェクト指向コードの並列化
MPIとは
並列計算手法には、メモリを共有するスレッド並列と、メモリを共有しないがノード(≒端末)をまたいで並列化できるプロセス並列があります。前者の代表例はopenMPで、後者が本記事のテーマであるMPIです。
スレッド並列には並列化分割数に上限があり、かつ1ノード内で完結する処理しかできません。それに対して、MPIによるプロセス並列ではその上限を大きく超えた数(例えば1000コア以上)で、かつ複数ノードにまたがる規模で並列計算を行うことができます。
スパコンでは大量のブレードサーバを並列化させて計算するので、大規模な理論シミュレーションではMPIはほぼ必須となっています。例えば、代表的なスパコンである京では、スペック上は最大で82944ノード*8コア=663,552個ものプロセスを並列に処理することができます(そのような処理が現実に実行できるかはわかりませんが)。
#MPIを使う下準備
一般的なスパコンの実装
学生でスパコンを使う理論シミュレーションを行う研究室にいる人なら、スパコンに用意されているはずなので、詳しくはそれぞれのマニュアルを見てください。
スパコンは共用利用となっているので、SSH接続を受け付けるログインノードと、計算を実行する計算ノードに分かれています。ログインノードのキューにジョブを投入し、順番にジョブが計算ノードに渡されて実行されるというシステムになっています。
自前で環境を構築する
スパコンにアクセスできない普通の人でも、オープンソースの実装があるのでインストールできます。
実装には、有名なものにOpenMPIとMPICHがあります。端末が1つしかなくても1ノード内で並列化したり、仮想端末と通信させるなどもできます。
本シリーズ記事での動作確認はWSL(Windows Subsystem for Linux)上にaptで構築した環境を使っています。openMPIの場合、次の4つを入れれば環境はできます。
apt install openmpi openmpi-dev libopenmpi libopenmpi-bin
ノード間で通信を行うには、sshや、nfsやsshfsなどのファイル共有の設定をしなければなりません。
おまけ:nfsやsshfsはFUSEという機能を用いる必要がありますが、残念なことにWSLのような仮想環境ではFUSEを使えないためにノードを並列化させることができません。orz