Show page source of オープンソース化された並列化テンプレートクラスライブラリ「Intel_Threading_Building_Blocks」入門_p1 #49411

[[PageNavi(NavigationList)]]

== オープンソース化された並列化テンプレートクラスライブラリ「Intel Threading Building Blocks」入門 ==


 C++で並列アプリケーションを実装するためのテンプレートライブラリとして、インテルがリリースしている「Intel Threading Building Blocks」(TBB)がある。TBBはインテル コンパイラーやインテル Parallel Studioといったインテルのコンパイラ製品に付属しているほか、オープンソース版も公開されている。本記事ではこのTBBの概要と、基本的な使い方を解説する。

'''[http://sourceforge.jp/magazine/09/05/25/1031209 【特集】マルチスレッド/並列プログラミングの必携ツール「インテル Parallel Studio」徹底活用]'''[http://sourceforge.jp/magazine/09/05/15/0930226 第1回:ソフトウェア高速化の鍵は「並列化」:いま注目される並列化技術を知る][http://sourceforge.jp/magazine/09/05/15/0938220 第2回:マルチコア時代の新開発ツール「インテル Parallel Studio」][http://sourceforge.jp/magazine/09/05/18/1135239 第3回:サンプルコードで知るParallel Studioの並列化機能][http://sourceforge.jp/magazine/09/05/22/0358216 第4回:並列アプリケーションを作ってみよう][http://sourceforge.jp/magazine/09/05/25/0921234 第5回:インテル Parallel Studioを活用したソフトウェアの並列化:AACエンコーダを高速化する]'''[//sourceforge.jp/magazine/09/08/21/1128207 第6回:オープンソース化された並列化テンプレートクラスライブラリ「Intel Threading Building Blocks」入門]''' C/C++で並列アプリケーションを実装する手法として、並列化したい処理をOSのAPIを用いてマルチスレッド化する、もしくは並列プログラミングの規格である「OpenMP」を利用する、といったものが知られている。これらについては[http://sourceforge.jp/magazine/09/05/15/0930226 以前の記事]でも紹介しているが、マルチスレッドを利用した実装は柔軟性がある一方で手間が掛かり、OpenMPは比較的手軽だが柔軟性に欠けるなど、それぞれに長所と短所がある。

 また、C++でアプリケーションを実装する場合、スレッドやOpenMPを利用した実装には別の困難さも生じてくる。1つはC++でのスレッドの扱いにくさ、もう1つは利用する関数やクラスが「スレッドセーフ」かどうか分かりにくい、という点だ。

 これらの問題を解決し、C++での見通しの良い並列処理実装を可能にするのが本記事で紹介する「Intel Threading Building Blocks」(以下、TBB)である。

=== Intel Threading Building Blocksが持つ機能 ===
 TBBはC++で並列処理を記述するためのテンプレートクラスライブラリだ。インテルが開発し、かつては商用のライブラリとして販売されていたが、2007年にオープンソース化され、現在はGPL 2の下で公開されている。また、非オープンソースなプロダクトに利用できる商用版も引き続き提供されており、インテル コンパイラー製品やインテル Parallel Studio製品に同梱されているほか、単体でも購入が可能だ。現在の最新バージョンは2.2で、オープンソース版については[http://www.threadingbuildingblocks.org/ threadingbuildingblocks.org]からWindows/Linux/Mac OS X/Solaris向けのヘッダーファイルおよびバイナリを入手できる。

 TBBが提供する機能を簡単にまとめると、次のようになる。

 * データ群に対する反復処理を並列実装するためのテンプレートクラスやテンプレート関数
 * ストリーム処理/パイプライン処理を並列実装するためのテンプレートクラスやテンプレート関数
 * タスクベースの並列処理を実装するためのタスクスケジューラクラス
 * スレッドセーフなqueue/vector/mapクラス
 * スケーラブルなメモリアロケータ
 * mutexなどの排他処理機構

 並列処理を実装する場合、データや処理をどのように分割し、どのように実行するかがポイントとなる('''図1''')。たとえば多数のデータに対し同一の処理を行うような場合、データを分割して複数のスレッドに割り当て、同一の処理を並列実行させる方式が考えられる。また、ストリーム状の入力データを次々と処理していくような場合は、処理をパイプラインのように分割し、それぞれの行程を別スレッドで動作させることが考えられる。複数のコンポーネントが独立かつ非同期に処理を行うようなパターンでは、それぞれのコンポーネントごとにスレッドを割り当てるのが自然だ。TBBではこのような並列処理パターンそれぞれに対応するアルゴリズムやクラスが実装されており、アルゴリズムを選択し、ロジックとデータを用意するだけで簡単に並列処理を実装できる。

[[Thumb(147f1bb386a202d7b5721aaba1fd7ed1.png, caption=図1 Intel Threading Building Blocksで想定されている並列処理)]]

 また、並列化を行う場合には関数やクラスが「スレッドセーフ」かどうか、常に気を払わなければならない。並列化を行った個所でスレッドセーフでない関数を実行してしまうと、タイミングによってはデータの破壊や意図しない変更といった問題が発生するからだ。現在多くのC標準関数についてはスレッドセーフとなっているものの、C++でよく利用されるSTL(Standard Tempkate Library)についてはスレッドセーフであることは保証されていない。そのためTBBには、STLのqueueおよびvector、mapに相当するスレッドセーフなコンテナが用意されている。ただし、これらのスレッドセーフなコンテナはSTLのコンテナと比べると処理が遅い傾向があるため、必要な個所のみに利用するべきである。

 そのほか、アトミックな操作を行えるオブジェクトを作成するためのテンプレートクラスや、排他的な処理を行うためのmutex、スレッド化されスケーラブルなメモリアロケータなど、並列処理を実装する上で有用なコンポーネントなども含まれている。

'''[//sourceforge.jp/magazine/09/08/21/1128207 オープンソース化された並列化テンプレートクラスライブラリ「Intel Threading Building Blocks」入門]''''''[http://sourceforge.jp/magazine/09/08/21/1128207 Page 1: Intel Threading Building Blocksが持つ機能]'''[http://sourceforge.jp/magazine/09/08/21/1128207/2 Page 2: TBBのメリット、TBBを用いた並列アプリケーションの設計と実装][http://sourceforge.jp/magazine/09/08/21/1128207/3 Page 3: 要素数が分かっているデータ群に対する反復処理の並列実装(forループの並列化)][http://sourceforge.jp/magazine/09/08/21/1128207/4 Page 4: 要素数が分からないデータ群に対する反復処理の並列実装(whileループの並列化)][http://sourceforge.jp/magazine/09/08/21/1128207/5 Page 5: パイプライン処理の並列化][http://sourceforge.jp/magazine/09/08/21/1128207/6 Page 6: パイプライン処理の並列化・ソースコード詳細解説][http://sourceforge.jp/magazine/09/08/21/1128207/7 Page 7: 高い抽象度でアルゴリズムを実装できるTBB

]

[[PageNavi(NavigationList)]]