Intel TBB(Threading Building Blocks)とMicrosoft PPL(Parallel Pattern Library)は、両ライブラリともに同じような並列アルゴリズムや同期プリミティブを提供している。TBB バージョン2.2以降、一部機能についてはPPLとのAPI互換がとられている。(TBB 4.0 と MSVC10付属のPPL を比較対象とする。)
名前空間
TBBでは名前空間 tbb にて、PPLでは名前空間 Concurrency にてアルゴリズム等を定義している。ソースコード互換性のために、TBBはヘッダファイル tbb/compat/ppl.h を提供しており、同ヘッダをincludeすると互換APIが名前空間 Concurrency にも導入される。
#include <vector> #include "tbb/compat/ppl.h" std::vector<int> data = /*...*/; // 全ての要素値を2倍する Concurrency::parallel_for_each( data.begin(), data.end(), [](int& x){ x *= 2; } );
互換API
TBBで定義されるPPL互換APIの一覧は次の通り。
識別子 | 概要 |
---|---|
parallel_for(first,last,f) | 並列forループ アルゴリズム |
parallel_for(first,last,step,f) | 並列forループ アルゴリズム(step指定版) |
parallel_for_each | 並列foreach アルゴリズム |
parallel_invoke | 並列関数呼び出し アルゴリズム |
task_group | タスクグループ クラス |
task_group_status | タスクグループ状態 列挙型 |
structured_task_group | 構造化タスクグループ クラス |
task_handle | タスクハンドル クラステンプレート |
make_task | task_handle作成 関数テンプレート |
is_current_task_group_canceling | タスクグループのキャンセル処理中判定 関数 |
improper_lock | 不正ロック操作 例外*1 |
invalid_multiple_scheduling | 無効スケジューリング 例外*2 |
missing_wait | wait呼び出し欠落 例外*3 |
critical_section | CriticalSection クラス |
reader_writer_lock | Reader-Writerロック クラス |
parallel_forアルゴリズムは、表中のSignatureを持つ2つの関数テンプレートのみPPLとAPI互換性がある。Rangeベースで範囲指定する parallel_for(range,body) オーバーロードはTBBにしか存在しない。
critical_sectionとreader_writer_lockはPPL互換のために定義されており、TBBが提供する他のMutexとはインタフェースが若干異なる。
- TBBのcritical_sectionは機能的には tbb:mutex のサブセットであり、PPLのcritical_sectionと互換性がある。
- TBBのreader_writer_lockは、PPLのreader_writer_lockと互換性がある。TBBのReaderWriterMutexコンセプトには適合せず、tbb::spin_rw_mutexやtbb::queuing_rw_mutex等とは異なるインタフェースとなっている。
関連URL
- (PDF) Intel(R) Threading Building Blocks Reference Manual, Rev.1.28, 9.3 PPL CompatibilityとAppendix B PPL Compatibility