HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。

新着トピックス

並列処理プログラミングをサポートする環境が整いつつある

 とはいっても、並列処理にもデメリットはある。まず大きな問題は、実装やデバッグが面倒という点であろう。プログラムを並列化するには後述するように複数のスレッドやプロセスを利用するのだが、複数のスレッドやプロセスが正しく協調して動作するよう、スレッド/プロセス間で同期や通信を行わせる必要がある。また、既存のアルゴリズムの多くは並列化が考慮されていないため、アルゴリズム自体を並列化に適したものに改良する必要があることが多い。

 さらに、並列化することで逆に処理が遅くなる可能性もある。一般的には実行したい処理のすべてが並列化できるわけではなく、また、並列化にはオーバーヘッドも生じるからだ。

 これについては「アムダールの法則」が有名である。たとえば、プログラムの中で実行時間のうち5分の1の時間を占めている処理を並列化できたとしよう。この場合、並列化によってその処理が2倍の速度で実行できたとしても、全体としては処理時間は10%しか短縮できない。一方、実行時間の5分の4を占める処理を2倍の速度で実行できるようになれば、処理時間は40%も短縮できる。

 ここでは並列化のオーバーヘッドを考慮していないが、もし並列化を行うことで10%余計な時間が必要になったとすると、前者は並列化を行ったとしても最終的な処理時間は変わらない。つまり、並列化を行う際には時間のかかっている処理を適切に並列化できるよう、十分な分析が必要なのである。

 このような背景から、並列処理の実装やデバッグをできるだけ簡略化できるよう、並列処理を簡単に記述できる言語規格や開発環境、開発ツールなどが近年登場してきている。並列化をサポートする言語規格としては、C/C++やFortranで利用できる「OpenMP」がその代表だ。また、自動並列化などの機能を搭載したコンパイラやデバッグツール、パフォーマンス測定ツールなどからなる開発スイート「インテル Parallel Studio」といった製品もリリースされている。

 それ以外にも、「Erlang」など並列化をサポートしたプログラミング言語が最近注目を浴びているほか、マイクロソフトがC#と連携して利用できる並列プログラミング言語「Axum」を公開するなど、並列プログラミングを行う環境は徐々に整備されつつある。

コラム 並列化と問題の分割

 プログラムを並列化する際には、実行する処理をどのように複数のスレッド/プロセスに割り当てるか、というのが問題になる。これを、「問題の分割」と呼ぶ。

 問題の分割方法としては、大きく分けて2通りがある。1つは、同一の処理を複数のスレッド/プロセスに割り当てる、というもので、もう1つは異なる処理を複数のスレッド/プロセスに割り当てる、というものだ。

c647b1c0f5d76941df2d00913412a5d8.png
図3 問題の分割方法

 前者は処理したいデータを簡単に分割できる場合に有効である。また、後者はいわゆる「パイプライン処理」的な処理に適したもので、処理を複数の段階(パイプライン)に分け、それぞれのパイプラインを並列に動かすものである。こちらは、連続的にデータを処理する場合などに適している。

 たとえば画像処理などでは前者の処理が使われることが多く、また動画ファイルのエンコード/デコード処理などでは後者が利用される例が多い。