#並列化アルゴリズムの基礎
今度スパコンの講習を受けるにあたって必要知識にOpenMPとOpenMPIが含まれていたので、ここに最低限のことをまとめておく。
具体的なプログラムについては、参考にしたサイトに乗っているのでそちらを参考にしていただきたい。
今回はあくまで、並列化の考え方と必要な知識等についてまとめていく。
##並列化とは
そもそも並列化とは、いくつかの処理命令を同時に出すことで処理にかかる合計の時間を減らすことを目的としている。並列化はプロセッサをいくつか積んでいるような並列コンピュータを用いることで実行することができる。
並列コンピュータには、並列アルゴリズム、プログラミング言語、並列処理を助けるコンパイラやオペレータなどが必要である。今回のメイントピックであるOpenMP, OpenMPIはこの中で最後に分類され、並列処理を助けるインターフェースである。その他についてはここでざっくり説明しておく。
並列アルゴリズム
まず、アルゴリズムとは問題を解くため従う一連の指示のことであるが、コンピュータの構造によって2つのアルゴリズムに分類することができる。
- Sequential Algorithme
問題を解くための命令を順番に連続した命令のステップを実行していくようなアルゴリズム
2.pararel Algorithm
1つの問題をいくつかの小問題に分けてそれぞれを個別で解き、その後、個別を解を結合させることで全体の解を得るようなアルゴリズム
実際には並列アルゴリズムを考える際に問題をいくつかに分けるのは難しく、問題によっては並列化できないものや、並列化することで逆に計算時間を増やしてしまうこともある。
並列コンピュータ
コンピュータは、データや指示の流れの違いから、4つのカテゴリーに分類できる。
1.SISD (Single Instruction stream, Single Data stream computers)
一つの制御装置、一つの処理装置、一つのメモリからなるコンピュータ
2.SIMD(Single Instruction stream, Multiple Data stream computers)
一つの制御装置、複数の処理装置、共有メモリもしくは相互接続ネットワークからなるコンピュータ
3.MISD(Multiple Instruction stream, Single Data stream computers)
複数の制御装置、複数の処理装置、一つのメモリからなるコンピュータ
4.MIMD(Multiple Instruction stream, Multiple Data stream computers)
複数の制御装置、複数の処理装置、共有メモリもしくは相互接続ネットワークからなるコンピュータ
並列コンピュータというと、ほとんどの場合SIMD/MIMD型のコンピュータを指すことが多い。
これはその構造によるものであるが、ここでは説明を省略するので、気になった人は参考にしたページを以下に載せておくのでそちらをご覧いただきたい。
プログラミング言語
おそらくどのような言語でも、並列用のプログラムを書くことはできるがスーパーコンピュータで並列化しようと思うとfortranで書くことが大半であり、それ以外ではCやC++などが挙げられる。現在他の言語の開発も進められているようで、私の勉強不足のためこの3つの言語を代表例として挙げているだけである。
###OpenMPとOpenMPI
ここからやっと今回のメインであるOpenMPとOpenMPIについてである。
・OpenMP(Multiple_Processing)
マルチコアCPUの複数コアを利用し、複数スレッドを処理する
各スレッドは並列領域を開始時に生成され、並列処理が終了すると逐次処理に戻る
Fortran, C, C++言語のプログラミングで利用可能
コメントとして指示されている指示分に従って並列化を行う
Fortranでは、
!$omp parallel
!$omp end parallel
で開始、終了する
C, C++では
#programa amp parallel{}
で囲んだ部分が並列領域となる
・OpenMPI(Message_Passing_Interface)
複数の計算機と通信を行い、並列処理を行う
複数の計算ノードを用いた大規模並列が可能
基本的に個人のパソコンのみで並列を行う時はOpenMPを使い
スパコンのように複数の計算ノードを使う時は、メモリの共有を行う必要があるのでOpenMPIも使う
OpenMPと似たものにOpenACCがあり、これも並列化に利用することが可能である
今度時間があれば、二つの相違点について詳しく調べてみようと思う
あまりきれいにまとめられていないので、実際に使って知識を整理できたら記事を書き直したい
余談として
並列化を行う時に、全てのCPUを常にフルで並列化させるべきかという問題があるそうだが、以下のサイトに詳しく実験をした結果が載せられていたので、参考までにどうぞ
参考URL