インテル® スレッディング・ビルディング・ブロック (インテル® TBB) 4.3 の新機能

同カテゴリーの次の記事

C++11 とインテル® TBB スレッドの併用

この記事は、インテル® デベロッパー・ゾーンに掲載されている「What’s New? Intel® Threading Building Blocks 4.3」の日本語参考訳です。


最もよく知られている C++ スレッド・ライブラリーの 1 つである、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) の最新バージョン 4.3 がリリースされました。この最新バージョンでは、いくつかの主要な新機能が追加されています。その一部は、インテル® TBB 4.2 のアップデートでも利用可能でした。

最新バージョンでは、次の機能が完全にサポートされています:
flow::indexer_node、task_arena、speculative_spin_rw_mutex。

タスク領域

ワークロードの分離と並行性レベルのより細かい制御を提供する tbb::task_arena クラスが完全にサポートされています。各領域 (および領域内で実行するアルゴリズム) ごとに並行性レベルを制限することができます。領域間でタスクが共有されないため、ワークロードおよびリソースの分離が可能です。

次のサンプルは、同時に 2 つの paralel_for ループを実行します。1 つはスケーラブルで、もう 1 つはスケーラブルではありません。スケーラブルでないループは最大 2 スレッドに制限されるため、ほとんどのスレッドはスケーラブルなループに使用できます。特定のタスクのサブセットを待機するには、task_group を使用します。

tbb::task_scheduler_init def_init; // デフォルトのスレッド数を使用
tbb::task_arena limited(2); // この領域では 2 スレッド以下に制限
tbb::task_group tg;

limited.enqueue([&]{ // 最大 2 スレッドを利用可能
    tg.run([]{ // タスクグループで実行
        tbb::parallel_for(1, N, unscalable_work());
    });
}); 

// 上記のループと同時に別のジョブを実行
// デフォルトのスレッド数を使用可能
tbb::parallel_for(1, M, scalable_work());

// execute() 内のタスクグループを待機させる
// このタスクグループのタスクのみ待機する
arena.execute([&]{ tg.wait(); });

強化された C++ 11 サポート

tbb/compat/thread と tbb::mutex において、C++11 標準のインターフェイスおよびセマンティクスとの互換性が強化されています。引き続き C++03 互換モードでビルドすることもできます。

注: C++11 標準との互換性のため、すべての mutex クラスで copy コンストラクター、move コンストラクター、代入演算子が無効になります。以前の動作にする場合は、TBB_DEPRECATED_MUTEX_COPYING マクロを使用します。

C++11 の move コンストラクター、emplace() メソッド、rvalue 参照により、不要なオブジェクトのコピーを回避できます。

  • C++11 の move コンストラクターと代入演算子が
    concurrent_vector、concurrent_hash_map、concurrent_priority_queue、concurrent_unordered_{set/multiset/map/multimap} に追加されました。
    concurrent_queue と concurrent_bounded_queue では
    move コンストラクターのみ利用できます。
  • C++11 の move を意識した emplace/push/pop メソッドが
    concurrent_vector、concurrent_queue、concurrent_bounded_queue、concurrent_priority_queue に追加されました。

C++11 の初期化子リストを挿入するメソッドが
concurrent_vector::grow_by()、concurrent_hash_map::insert()、concurrent_unordered_{set/multiset/map/multimap}::insert() に追加されました。

メモリー・アロケーター

  • 強化された tbbmalloc により、マルチスレッド・アプリケーションのパフォーマンスとスケーラビリティーが向上します。
  • OS X* で標準メモリー割り当てルーチンの動的置換が追加されました。

ビルドとデバッグ

  • インテル® TBB サンプルの Microsoft* Visual Studio* プロジェクトが VS 2010 用にアップデートされました。
  • オープンソース・パッケージで、プリコンパイル済みバイナリーのデバッグ情報 (行番号) とソースコードが一致するようになりました。
  • OS X*、Solaris*、FreeBSD*、MinGW* でリリースビルドにデバッグ情報が追加されました。
  • ドキュメント、デバッグメッセージ、サンプルが改善されました。

プレビュー機能

  • グラフのリセットに関する追加操作、グラフからの個々のノードの抽出 (TBB_PREVIEW_FLOW_GRAPH_FEATURES)
  • parallel_invoke (TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE) で任意の数の引数をサポート

下位互換性に影響する変更

  • C++11 標準との互換性のため、すべての mutex クラスで copy コンストラクター、move コンストラクター、代入演算子が無効になります。以前の動作を許可する場合は、TBB_DEPRECATED_MUTEX_COPYING マクロを使用します。
  • flow::sequencer_node は、循環するシーケンス番号のメッセージを拒否します。
  • tbbmalloc と tbbmalloc_proxy 間の内部インターフェイスが変更されました。
  • 次の古い機能が非サポートとなりました。
    • 古いデバッグマクロ TBB_DO_ASSERT および TBB_DO_THREADING_TOOLS
    • task クラスの no-op の深さに関連するメソッド
    • tbb::deprecated::concurrent_queue
    • concurrent_vector メソッドの古いバージョン
  • flow::graph でエッジの追加/削除を行う register_successor() と remove_successor() は古いメソッドです。代わりに、make_edge() と remove_edge() を使用してください。

修正された問題

  • アライメントされたオブジェクトの正しくない scalable_msize() 実装が修正されました。
  • フローグラフのバッファーノードは、転送した項目のコピーを破棄するようになりました。
  • task_arena 実装で以下を含むさまざまな問題が修正されました。
    • 実行関数内での矛盾するタスク・スケジューラー状態
    • 正しくない浮動小数点設定および例外伝播
    • execute() を同時に呼び出した場合のストール
  • 異なる領域で task_group_context の同じインスタンスが使用された場合の浮動小数点設定の伝播が修正されました。
  • OS X* でインテル® コンパイラーが pipeline.h でコンパイルエラーになる問題が修正されました。
  • 各コンポーネントの不足ヘッダーが tbb.h に追加されました。

オープンソース・コミュニティーによる貢献の統合

  • Stephan Dollberg 氏による Range インターフェイスが parallel_do、parallel_for_each、
    parallel_sort に追加されました。
  • Kizza George Mbidde 氏による parallel_invoke の variadic テンプレート実装 (「プレビュー機能」を参照) が追加されました。
  • Raf Schietekat 氏による MacBook Pro* Retina* ディスプレイ用地震波サンプルの改良が追加されました。

インテル® TBB 4.3 は、商用版サイトおよびオープンソース版サイト (英語) から入手できます。ダウンロードして新機能を利用してみてください!

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事