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

新着トピックス

Threading Building Blocksによる並列化

 前述のとおり、スレッド/プロセスを利用する並列化は実装が複雑になりやすく、いっぽうでOpenMPは手軽に利用できるものの、プラグマを利用するため可読性や柔軟性に欠け、またC++では利用しにくいという問題があった。インテルが開発し、現在はオープンソースライセンス(GPL)で公開されているThreading Building Blocks(TBB)は、WindowsやLinux、Mac OS XやFreeBSDといったUNIX系OSで利用できるC++向けの並列プログラミングライブラリで、OpenMPよりも柔軟ながら、スレッド/プロセスを利用するよりは容易に並列プログラムを作成できるのが特徴である。

 次の例は、TBBを用いてforループを並列化させるサンプルコードである。

/* 処理をクラスとして作成 */
class ExampleObj
{
    void operator() (const blocked_rangeint range) const
    {
        for(int i = range.begin(); i != range.end(); i++)
            example_func2(i);  /* 並列実行する処理 */
    }
};

  :
  :

/* 処理を呼び出す部分 */
/* gsizeには分割粒度を指定 */
int gsize = 10;
ExampleObj obj;
parallel_for( blocked_rangeint(0, 100, gsize), obj);

 そのほかTBBには、データを格納するためのスレッドセーフなコンテナやmutexなどの同期機構なども用意されている。

「コードを書かない」並列プログラミング

 スレッド/プロセスを活用したり、OpenMPやTBBを利用する以外にも、特別なコードを書かずに並列化を実装する手段がある。あらかじめアルゴリズムが並列化されて実装されているライブラリを利用したり、自動並列化機能を備えたコンパイラを利用する、というものだ。

並列化済みライブラリの利用

 たとえばインテルの「Math Kernel Library(MKL)」や「Integrated Performance Primitives(IPP)」といったライブラリは、内部処理があらかじめ並列化されているため、これらのライブラリを利用するだけで特に意識することなしに処理の並列化が行える。MKLは数学・科学計算で多用される浮動小数点演算や行列処理、IPPでは動画/音声コーデックや暗号化といった処理が用意されており、これらの分野のアプリケーションを作成するなら検討したいライブラリである。ただし、これらのライブラリでカバーされていない分野では利用できないのが欠点ではある。

コンパイラによる自動並列化の利用

 「インテル コンパイラー」や「インテル Parallel Composer」といったコンパイラ製品には、ソースコード中のループの個所などを自動的に並列化する「自動並列化」機能が用意されている。自動並列化の使用の有無や、並列化を行うスレッショルドなどをコンパイルオプションで指定するだけで利用でき手軽ではあるものの、単純なループしか並列化できず、またプログラムによってはあまり高速化が期待できない点には注意が必要である。

パフォーマンス向上に活用したい並列プログラミング

 このように、C/C++で利用できる並列化技術にはさまざまなものがある。スレッド/プロセスを利用した並列化は複雑だが処理を柔軟に記述することが可能だ。いっぽうOpenMPは手軽ではあるものの、若干融通が利かない部分もある。並列化を行う際は、必要とする状況に応じて、適切な実装・実現方法を選択するようにしたい(図5)。

 並列処理はまだ一般には歴史が浅いため、「難解」「バグを産みやすい」「設計が難しい」といった、ネガティブな印象を持つ人も多いだろう。しかし、ライブラリやデバッガといった周辺ツールの充実により、以前よりも利用しやすくなっているといえる。CPU単体のパフォーマンス向上が鈍化しつつあり、将来的にマルチコアCPUの普及が予想されている現在では、負荷の高い処理を高速に実行するためには並列化の導入が不可欠ともいえるだろう。