タスクアリーナの parallel_phase インターフェイス#
注
この機能を有効にには、TBB_PREVIEW_PARALLEL_PHASE マクロを 1 に設定します。
説明#
この機能は、次の API を使用して tbb::task_arena 仕様を拡張します。
task_arenaにleave_policy列挙クラスを追加します。task_arenaコンストラクターとtask_arena::initializeメソッドの最後のパラメーターとしてleave_policyを追加します。これにより、利用可能なワークが不足しているためワーカースレッドが task_arena を離れる前に、スケジューラーに優先ポリシーを通知できます。task_arenaクラスとthis_task_arena名前空間に、新しいstart_parallel_phaseおよびend_parallel_phaseインターフェイスを追加します。これらのインターフェイスは、アリーナへの並列ワークの送信の開始と、終了をマークするスケジューラーへのヒントとして機能し、異なるワーカースレッドの保持ポリシーを可能にします。リソース取得初期化 (RAII) クラス
scoped_parallel_phaseをtask_arenaに追加します。
完全なサポート機能となる動機付け、セマンティクス、および条件については、parallel_phase の対応するコメント要求ドキュメントを参照してください。
API#
ヘッダー#
#define TBB_PREVIEW_PARALLEL_PHASE 1
#include <oneapi/tbb/task_arena.h>概要#
namespace oneapi {
namespace tbb {
class task_arena {
public:
enum class leave_policy : /* 未指定のタイプ */ {
automatic = /* 未指定 */,
fast = /* 未指定 */,
};
task_arena(int max_concurrency = automatic, unsigned reserved_for_masters = 1,
priority a_priority = priority::normal,
leave_policy a_leave_policy = leave_policy::automatic);
task_arena(const constraints& constraints_, unsigned reserved_for_masters = 1,
priority a_priority = priority::normal,
leave_policy a_leave_policy = leave_policy::automatic);
void initialize(int max_concurrency, unsigned reserved_for_masters = 1,
priority a_priority = priority::normal,
leave_policy a_leave_policy = leave_policy::automatic);
void initialize(constraints a_constraints, unsigned reserved_for_masters = 1,
priority a_priority = priority::normal,
leave_policy a_leave_policy = leave_policy::automatic);
void start_parallel_phase();
void end_parallel_phase(bool with_fast_leave = false);
class scoped_parallel_phase {
public:
scoped_parallel_phase(task_arena& ta, bool with_fast_leave = false);
};
}; // class task_arena
namespace this_task_arena {
void start_parallel_phase();
void end_parallel_phase(bool with_fast_leave = false);
} // namespace this_task_arena
} // namespace tbb
} // namespace oneapiメンバーのタイプ#
- enum leave_policy::automatic#
コンストラクターまたは initialize メソッドに渡されると、初期化された task_arena には、アリーナに使用可能なワークがなくなり、アリーナが並列フェーズでない場合、ワーカースレッドがアリーナを離脱する速さに関するデフォルトの (おそらくシステム固有の) ポリシーが設定されます。
注
task_arena 内のワーカースレッドは、内部ヒューリスティックに基づいて保持される可能性があります。
- enum leave_policy::fast#
コンストラクターまたは initialize メソッドに渡されると、初期化された task_arena には、アリーナに使用可能なワークがなくなり、アリーナが並列フェーズでない場合、ワーカースレッドがより迅速にアリーナを離れるポリシーが設定されます。
- class scoped_parallel_phase#
並列フェーズをコードのスコープにマップする RAII クラス。
- scoped_parallel_phase::scoped_parallel_phase(task_arena &ta, bool with_fast_leave = false)#
指定された task_arena で並列フェーズを開始する scoped_parallel_phase オブジェクトを構築します。with_fast_leave が true の場合、ワーカースレッドの離脱ポリシーは一時的に fast に設定されます。
注
leave_policy::fast で初期化された task_arena では、with_fast_leave 設定は効果がありません。
注
アクティブな並列フェーズがない状態でワーカースレッドがアリーナに入ると、離脱ポリシーはアリーナの初期化中に設定された値にリセットされます。
メンバー関数#
- task_arena(const task_arena&)#
leave_policy を含む task_arena インスタンスから設定をコピーします。
- void start_parallel_phase()#
スケジューラーがヒントを使用してスレッドをアリーナ内に長く保持できるポイントを示します。
注
この関数は、スケジューラーのウォームアップ・ヒントとしても使用できます。これにより、スケジューラーはワーカースレッドを事前に起動できるようになります。
- void end_parallel_phase(bool with_fast_leave = false)#
スケジューラーがヒントを破棄し、アリーナ内のスレッドを保持しなくなるポイントを示します。with_fast_leave が true の場合、ワーカースレッドの離脱ポリシーは一時的に fast に設定されます。
注
leave_policy::fast で初期化された task_arena では、with_fast_leave 設定は効果がありません。
注
アクティブな並列フェーズがない状態でワーカースレッドがアリーナに入ると、離脱ポリシーはアリーナの初期化中に設定された値にリセットされます。
関数#
- void this_task_arena::start_parallel_phase()#
現在の task_arena の並列フェーズの開始を示します。
- void this_task_arena::end_parallel_phase(bool with_fast_leave = false)#
現在の task_arena の並列フェーズの終了を示します。with_fast_leave が true の場合、ワーカースレッドの離脱ポリシーは一時的に fast に設定されます。
例#
この例では、task_arena は leave_policy::fast を使用して作成されます。これは、並列ワークが完了すると、ワーカースレッドが task_arena に残らないことを意味します。
ただし、ワークフローには、シリアルワーク (プレフィクス sum) によって中断される一連の並列ワーク (データの初期化と並べ替え) が含まれます。並列ワークの開始と終了のヒントを指定するには、scoped_parallel_phase が使用されます。これは、今後さらに並列ワークが発生するため、ワーカースレッドを task_arena に残す必要があることをスケジューラーに知らせるヒントになります。