yohhoyの日記

技術的メモをしていきたい日記

Intel Threading Building BlocksとMicrosoft Parallel Pattern Libraryの互換性

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

*1:ロック済みオブジェクトに対して再びロック操作を行った

*2:task_groupオブジェクトがtask_handleを多重実行しようとした

*3:wait呼び出し前にtask_groupオブジェクトが破棄された