このページは並列計算に関する情報を集めた際に自分の理解した範囲を 研究室在籍時代にまとめたものです。
書いている本人はそれほどこの方法論に詳しいわけではないので、 間違っていることを書いている可能性が十分にあります。 お気づきの点がありましたらこちら までお知らせ下さい。
作成: 2000年4月18日
更新: 2001年9月18日
並列化の基礎に関しては広島大の並列計算機入門 を参照。初歩的なことがかなり丁寧に書いてあります。
並列化にはいくつかの手法があります。通常は メモリ全体を複数のCPUで共有する共有メモリ型、それぞれの CPU(もしくは ノード)にメモリが分散している分散メモリ型の2種類があげられますが、 ここでは複数のマシンで複数のプログラムを同時に走らせる環境も一種の 並列環境として取り上げます。それぞれの特徴は次の通り。
普通は1台のマシンに複数CPUがあるマシン(SMP)で利用する。
分散共有メモリ型という複数のマシン上のメモリを共有する方式もあるが、
使える状況は限られているようだ。
並列で走らせるためにメモリ内容をコピーするなどのオーバーヘッドは
ないが、同時にメモリアクセスする際の速度低下や、他のCPUがメモリを
利用している時に内容を書き換えないようにする配慮が必要、という
問題がある。スレッド化だけであれば、OS およびコンパイラがサポート
していれば簡単に行なえることが多い。
実装としては POSIX thread、OpenMP などがある。
一つのプログラムを細分(thread)化し、同時に動かすことが出来る 部分を同時に動かす実装で、このインターフェースを POSIX に準拠したものが POSIX thread。OS に標準で搭載されている 場合(HP-UX 11.x、Tru64 Unix、BeOS etc)や、パッケージで提供 されている場合(Linux、FreeBSD etc.)も多い。またフリーでも PTL というライブラリが存在する。コンパイラにパラレル化 オプションがある場合、何も指示しなくても簡単なスレッド化を 行なってくれるが、大きな効果を得るためには自分で低レベルな 指示文を書く必要がある。thread はネットワークプログラミングでも 利用されている。
SMP(Symmetric MultiProcessor) マシンで共有メモリ並列 プログラミングをするための業界標準で、コンパイラ指示文や ライブラリ、環境変数をなど定義している。実装はメーカーに任されて いるため、それぞれのコンピュータの特性を生かした実装を実現 することが可能になっているが、フリーの Omni OpenMP では pthread やベンダー製の thread ライブラリ上のインター フェースとして動作しているようだ。また並列化の中では OpenMP が最も自動化が進んでいるようであるが、さらに最適な並列化を 目指すためには自分で directive (指示文)を書く必要がある。 OpenMP で共有メモリ並列されているものを MPI でマシン間で さらに並列に走らせることも可能なようである。
複数のネットワークでつながれたマシンを利用して計算する。
それぞれのマシンで計算するための情報は全て通信を通してコピーされる
ため、通信による速度低下がある。分散メモリ型をSMPマシンで実行する
ことも可能であり、この場合は通信による速度低下は小さくなるが、
メモリ空間は共有しないため、多少のオーバーヘッドはある。
大抵の場合は手動でコンパイラに並列化の指示を与える必要があるが、
うまく並列化するとかなりの効率をあげることも可能である。
実装としては MPI、PVM などがある。
分散メモリ環境で並列化を実現するためのメッセージ通信の インターフェースを規定したもの。どうやらこれが分散メモリ並列化の de facto standard になりつつある。MPI-1 では、基本的には 同一アーキテクチャ、同一スペックのマシンでの並列動作が主眼であり、 異なるアーキテクチャ間で並列化することはできない。異なる アーキテクチャ間での通信や I/O 周りの拡張が MPI-2 でなされて いるが、まだ MPI-2 を完全にサポートしたライブラリは存在しない らしい。フリーでは MPICH や LAM などの パッケージがあり、MPI をサポートした並列数値演算用ライブラリも 並列用 lapack などが揃っている。
MPI はインターフェースの規定であるのに対し、PVM は実装パッケージ そのものである。かつては分散メモリ環境は PVM が主流であった ようだが、現在は MPI に押されているようで、web 上で情報を 検索しても MPI に比べて圧倒的に情報は少ない。もともとビンボー人が あまったマシンをかき集めてきて大量の計算をさせようとしたのが 発祥らしく、様々なアーキテクチャを混在させて使うことも可能な ようである。これにより、 Condor と組み合わせて、マシンを渡り歩きながら並列計算を行なうことも 可能なようである。
ネットワーク上で一つの仮想メモリを構築し、あたかも全てのマシンで 一つのメモリを共有しているように見せかけて並列化をおこなうモデル。 パフォーマンスをあげるための実装はかなり困難で、フリーのものは 今のところ見つからない。 実装としては Linda や Super Computer で使われている cc-NUMA(Cache Coherent Non-Uniform Memory Access) などがある。
化学の分野で用いられる電子状態計算用のソフトウェア、 Gaussian はこのライブラリ を使った並列化パッケージも発売されている。Linda のフルセットは とても高いらしい。
複数のマシンで別々のプログラムを同時に走らせる。
同じプログラムをパラメータを変えながら大量に走らせたい時や、
make の作業には非常に有効。どこでどのプログラムが動いているかを
管理することが主な問題となり、プログラムの変更などの手間はほとんど
ない。プロセス間通信がないため、各プログラムのオーバーヘッドは
小さくなる。当然ながら効率は最もよい。
実装としては PC クラスタリングや NQS がある。
当研究室で所有している HP のワークステーション K-370 (HP-UX 10.20, 4CPU) にパラレル環境を導入した記録です。環境によってライブラリのインストール 先が異なるかも知れませんので(というか、HP-UX の一般的なインストール先を 私は知らない)、環境に合わせて読み替えてください。
Pthread Library は HP-UX 10.20 以前はデフォルトの OS には
インストールされないため、Core-OS CD-ROM から手動でインストールする
必要がある。Core-OS CD をマウントし、swinstall コマンドを
使って DCE 関連のソフトをインストールすれば、pthread ライブラリも
インストールされる。HP-UX 11 以降はデフォルトで入るらしい。
FORTRAN 77 でコンパイルする際に
+O3(or greater) +Oparallel -Wl,-L/opt/langtools/lib
のオプションをつけると自動的にスレッド化して、環境変数
MP_NUMBER_OF_THREADS の数(デフォルトはCPUの数)だけ
並列化する。
ちなみに、10.20 以前の pthread は POSIX のドラフトに準拠している
らしく、POSIX thread との互換性はないらしいです。11以降は
確認していませんが、POSIX 準拠のようです。
私の環境では MPICH パッケージはうまくコンパイルできなかったため、 LAM パッケージを導入した。configure に --with-ccflags='-Ae' --without-mpi2cpp --without-impi を指定した以外は付属の INSTALL ファイルの通りでコンパイルおよび インストールできた(C++やIMPIサポートはうまくいかなかった。 おそらく gcc が昔妙な形でインストールしてしまったためらしい)。
Omni OpenMP のパッケージをコンパイルしようとしましたが、pthread の インターフェースが Linux などのものと異なるらしく(というか、 pthread が POSIX 互換でない)、コンパイルに 失敗しました。現在はまだできていません。
当研究室の Compaq ES40 (Tru64 Unix 4.0E, 4CPU) に並列環境を導入した 記録です。
デフォルトでインストールされている。
KAP Fortran を購入すると、OpenMP/Fortran の環境が含まれている。 Compaq のページ に OpenMP のディレクティブを含めた詳細なマニュアルが あるので、これを見ると簡単に並列化できる(ようだ)。
HP-UX と同じ環境にするため、LAM パッケージを導入した。 configure に --without-mpi2cpp --without-impi を指定した以外は付属の INSTALL ファイルの通りでコンパイルおよび インストールできた(C++やIMPIサポートはうまくいかなかった)。 それにしても、make だけで指定したディレクトリにコンパイルしながら インストールしてしまうのはやめてほしいっす。
このページは名大・大峰研の馬場氏、 小城氏の協力を得て作られました。
Back to ike's home page.