この記事は、インテル® デベロッパー・ゾーンに公開されている『Intel® Threading Building Blocks Documentation』の「task_arena NUMA support」(https://software.intel.com/en-us/node/841376) の日本語参考訳です。
概要
NUMA トポロジーを尊重するインターフェイス。
ヘッダー
#define TBB_PREVIEW_NUMA_SUPPORT 1 #include "tbb/task_arena.h"
注
この機能を使用するには、インテル® TBB プレビューバイナリーとリンクする必要があります。
説明
このプレビュー機能により、ワークを処理する task_arena に参加するスレッドを、指定する NUMA ノードにバインドできます。NUMA トポロジーに関する情報は、namespace tbb::info API を使用してトラバースできます。
メンバー
namespace tbb { class task_arena { public: struct constraints { numa_node_id numa_node; int max_concurrency; constraints(numa_node_id numa_node_ = task_arena::automatic, int max_concurrency_ = task_arena::automatic); }; task_arena(constraints constraints_, unsigned reserved_for_masters = 1); void initialize(constraints constraints_, unsigned reserved_for_masters = 1); }; }
次の表は、これらのインターフェイスをのメンバーに関する追加情報を提供します。
メンバー | 説明 |
---|---|
struct task_arena::constraints |
task_arena 内のスレッドに適用される制限を表します。
|
task_arena(constraints constraints_, unsigned reserved_for_masters = 1) |
指定された制限で task_arena を作成します。最大同時実行数の制限の一部は、reserved_for_masters を使用してアプリケーション・スレッド向けに予約できます。予約量は最大同時実行数の制限を超えることはできません。
注意max_concurrency および reserved_for_masters が明示的に 1 以上に設定されている場合、インテル® TBB のワーカースレッドはアリーナに参加しません。その結果、これらのアリーナではキューに入れられたタスクの実行は保証されません。task_arena::enqueue() および task::enqueue() は、ワーカースレッドを持たないアリーナで使用してはなりません。 ここで、constraints.numa_node が指定されていると、アリーナに入るすべてのスレッドは、対応する NUMA ノードに自動的にバインドされます。 |
void initialize(constraints constraints_, unsigned reserved_for_masters = 1) |
内部領域表現の初期化を実行します。引数が指定されている場合、以前のアリーナ・パラメーターをオーバーライドします。すでに初期化されているアリーナに対して呼び出された場合、メソッドは効果がありません。
注initialize を呼び出した後は、task_arena パラメーターは固定され変更することはできません。 |
例
この例は、task_arena NUMA サポート拡張機能を示します。構築されたそれぞれの task_arena は、対応するノードに固定 (ピニング) されます。プラットフォームが NUMA 機能を持たない場合、この例は 1 つの task_arena だけ作成し、task_arena に入るスレッドはハードウェア・リソースにバインドされません。
#define TBB_PREVIEW_NUMA_SUPPORT 1 #include "tbb/task_group.h" #include "tbb/task_arena.h" #include <vector> int main() { std::vector<tbb::numa_node_id> numa_nodes = tbb::info::numa_nodes(); std::vector<tbb::task_arena> arenas(numa_nodes.size()); std::vector<tbb::task_group> task_groups(numa_nodes.size()); for (int i = 0; i < numa_nodes.size(); i++) { arenas[i].initialize(tbb::task_arena::constraints(numa_nodes[i])); } for (int i = 0; i < numa_nodes.size(); i++) { arenas[i].execute([&task_groups, i] { task_groups[i].run([] { /* 指定する NUMA ノードに固定されたスレッドで実行 */ }); }); } for (int i = 0; i < numa_nodes.size(); i++) { arenas[i].execute([&task_groups, i] { task_groups[i].wait(); }); } return 0; }
上位トピック: プレビュー機能
https://software.intel.com/node/9cdc17ab-6c36-4422-b85d-ff5fb1be8587
- info 名前空間
https://software.intel.com/node/aa5dec48-703d-43a0-8075-ddfb7e6c2ada
関連情報
task_arena クラス (英語)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。