Visual Studio 2010がリリースされました(パッケージ版は2010年6月18日発売予定)。評価版と、無償のExpressもマイクロソフト社のWebサイトからダウンロードできます。これに伴い改版されたインテルTBB(Threading Building Blocks)3.0で追加された新機能「parallel_pipeline」を紹介します。
インテルTBB 3.0
オープンソースのマルチスレッドライブラリ、インテルTBB(Threading Building Blocks、以下TBB)がversion 3.0となりました。Visual C++ 2005(vc8)、2008(vc9)に加え、2010(vc10)にも対応しています。TBBのインストール・ディレクトリを環境変数TBB30_INSTALL_DIRにセットしておけば、インクルード/ライブラリディレクトリの設定はVS2010 IDEのプロジェクト・プロパティでそれぞれ次のようになります。
- インクルード: $(TBB30_INSTALL_DIR)\include
- ライブラリ: $(TBB30_INSTALL_DIR)\lib\ia32\vc10
さらにTBBのDLLが$(TBB30_INSTALL_DIR)\bin\ia32\vc10にありますから、ここにPATHを通すか、DLLをPATHの通ったディレクトリにコピーすれば使えるようになります(64-bitターゲットの場合はライブラリ/DLLディレクトリの「ia32」を「intel64」に置き換えてください)。
この記事ではCommercial Aligned Release tbb30_018ossを使いました。
パイプラインとは
TBB 3.0で新たに追加された機能のうち、最も僕の気を引いてくれたのがパイプライン(pipeline)です。パイプラインそのものは以前のバージョンでもサポートしていたのですが、3.0ではlambda式と非常に相性のいいインターフェイスを提供してくれたおかげでパイプラインを簡単に記述/表現できるようになりました。
パイプラインとは――例えばスーパーマーケットの鮮魚コーナーに並ぶ「おさしみ盛り合わせ」の製造工程を考えてみましょうか。鮮魚コーナーのバックヤードでは、おそらくはパートタイムのオバちゃんが
- さしみを引いて
- スチロール皿に盛り
- ツマを添えて
- プラスチックのタンポポ(?)をのせる
なんて作業を繰り返していることでしょう。オバちゃんが一人なら一連の作業を順次処理することになります。が、オバちゃんが数人いれば同時並行作業が可能です。このとき各工程が互いに影響を及ぼさず独立したものであるなら、例えばオバちゃんAがさしみを引いている間にオバちゃんBが(Aが引いたさしみを)皿に盛ることができます。各工程に必要な作業空間が限られていても、数人のオバちゃんが横に並んで左隣から受け取ったものを処理して右隣に引き渡す「流れ作業」で仕事をすれば処理能力はオバちゃん一人よりずっと大きくなります。この「流れ作業」がすなわち「パイプライン」です。