スケジュール グループ

ここでは、同時実行ランタイムでのスケジュール グループの役割について説明します。 スケジュール グループは、関連するタスクの関係付け (グループ化) を行います。 各スケジューラは、1 つ以上のスケジュール グループを使用します。 関連するタスクのグループが同一プロセッサ ノードでの実行によって恩恵を受ける場合など、タスク間で高いレベルの局所性が求められる場合は、スケジュール グループを使用します。 一方、一連のタスクに割り当てられる処理リソースの量を制限する場合など、アプリケーション固有の品質要求がある場合は、スケジューラ インスタンスを使用します。 スケジューラ インスタンスの詳細については、「スケジューラ インスタンス」を参照してください。

ヒント

同時実行ランタイムには既定のスケジューラが備わっているため、アプリケーションでスケジューラを作成する必要はありません。タスク スケジューラではアプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。

すべての Scheduler オブジェクトには、すべてのスケジューリング ノード用の既定のスケジュール グループがあります。 スケジューリング ノードは、基になるシステム トポロジにマップされます。 ランタイムは、すべてのプロセッサ パッケージまたは NUMA (Non-Uniform Memory Architecture) ノードに対し、どれだけ数が多い場合でも、1 つのスケジューリング ノードを作成します。 明示的にタスクをスケジュール グループに関連付けない場合、スケジューラはタスクの追加先グループを選択します。

SchedulingProtocol スケジューラ ポリシーは、スケジューラが各スケジュール グループ内のタスクを実行する順序に影響を与えます。 SchedulingProtocolEnhanceScheduleGroupLocality (既定値) に設定されている場合、現在のタスクが終了すると、または現在のタスクが協調的に譲歩すると、タスク スケジューラは、処理中のスケジュール グループから次のタスクを選択します。 タスク スケジューラは、次の使用できるグループに移動する前に、現在のスケジュール グループを検索して作業対象を見つけます。 これに対し、SchedulingProtocolEnhanceForwardProgress に設定されている場合、各タスクが終了または譲歩した後、スケジューラは次のスケジュール グループに移動します。 これらのポリシーを比較した例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。

ランタイムは、スケジュール グループを表すために concurrency::ScheduleGroup クラスを使用します。 ScheduleGroup オブジェクトを作成するには、concurrency::CurrentScheduler::CreateScheduleGroup または concurrency::Scheduler::CreateScheduleGroup のメソッドを呼び出します。 ランタイムは、Scheduler オブジェクトの有効期間を制御するために参照カウント メカニズムを使用しますが、ScheduleGroup オブジェクトの有効期間を制御するためにも、この参照カウント メカニズムを使用します。 ScheduleGroup オブジェクトを作成すると、ランタイムは参照カウントを 1 に設定します。 concurrency::ScheduleGroup::Reference のメソッドは 1 ずつ参照カウンターをインクリメントします。 concurrency::ScheduleGroup::Release のメソッドは 1 ずつ参照カウンターをデクリメントします。

同時実行ランタイムの多くの型により、オブジェクトをスケジュール グループに関連付けることができます。 たとえば、concurrency::unbounded_bufferconcurrency::joinconcurrency::timerなどの concurrency::agent クラスとメッセージ ブロック クラスは、ScheduleGroup オブジェクトを受け取るコンストラクターのオーバーロードされたバージョンを提供します。 ランタイムは、この ScheduleGroup に関連付けられている Scheduler オブジェクトを使用してタスクをスケジュールします。

また軽量タスクをスケジュールする concurrency::ScheduleGroup::ScheduleTask のメソッドを使用できます。 軽量タスクの詳細については、「軽量タスク」を参照してください。

スケジュール グループを使用してタスクの実行順序を制御する例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。

参照

処理手順

方法: スケジュール グループを使用して実行順序に影響を与える

概念

タスク スケジューラ (同時実行ランタイム)

スケジューラ インスタンス