タスクアリーナの parallel_phase インターフェイス#

この機能を有効にには、TBB_PREVIEW_PARALLEL_PHASE マクロを 1 に設定します。

説明#

この機能は、次の API を使用して tbb::task_arena 仕様を拡張します。

  • task_arenaleave_policy 列挙クラスを追加します。

  • task_arena コンストラクターと task_arena::initialize メソッドの最後のパラメーターとして leave_policy を追加します。これにより、利用可能なワークが不足しているためワーカースレッドが task_arena を離れる前に、スケジューラーに優先ポリシーを通知できます。

  • task_arena クラスと this_task_arena 名前空間に、新しい start_parallel_phase および end_parallel_phase インターフェイスを追加します。これらのインターフェイスは、アリーナへの並列ワークの送信の開始と、終了をマークするスケジューラーへのヒントとして機能し、異なるワーカースレッドの保持ポリシーを可能にします。

  • リソース取得初期化 (RAII) クラス scoped_parallel_phasetask_arena に追加します。

完全なサポート機能となる動機付け、セマンティクス、および条件については、parallel_phase の対応するコメント要求ドキュメントを参照してください。

API#

概要#

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_leavetrue の場合、ワーカースレッドの離脱ポリシーは一時的に 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_leavetrue の場合、ワーカースレッドの離脱ポリシーは一時的に 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_leavetrue の場合、ワーカースレッドの離脱ポリシーは一時的に fast に設定されます。

#

この例では、task_arenaleave_policy::fast を使用して作成されます。これは、並列ワークが完了すると、ワーカースレッドが task_arena に残らないことを意味します。

ただし、ワークフローには、シリアルワーク (プレフィクス sum) によって中断される一連の並列ワーク (データの初期化と並べ替え) が含まれます。並列ワークの開始と終了のヒントを指定するには、scoped_parallel_phase が使用されます。これは、今後さらに並列ワークが発生するため、ワーカースレッドを task_arena に残す必要があることをスケジューラーに知らせるヒントになります。