スケジューラ ポリシー
このドキュメントでは、同時実行ランタイムでのスケジューラ ポリシーの役割について説明します。 スケジューラ ポリシーを使用すると、スケジューラでタスクを管理する場合に使用される方法を制御できます。 たとえば、あるタスクは THREAD_PRIORITY_NORMAL
で実行され、他のタスクは THREAD_PRIORITY_HIGHEST
で実行される必要があるアプリケーションを考えてみましょう。 この場合、2 つのスケジューラ インスタンスを作成できます。1 つは ContextPriority
ポリシーを THREAD_PRIORITY_NORMAL
に指定し、もう 1 つでは同じポリシーを THREAD_PRIORITY_HIGHEST
に指定します。
スケジューラ ポリシーを使用すると、使用可能な処理リソースを分割し、各スケジューラに一連の固定リソースを割り当てることができます。 たとえば、4 つのプロセッサを超えた拡張を行わない並列アルゴリズムについて考えてみましょう。 この場合、同時に使用するプロセッサを 4 つ以下にするようにタスクを制限するスケジューラ ポリシーを作成できます。
ヒント
同時実行ランタイムには、既定のスケジューラが用意されています。 そのため、アプリケーションでスケジューラを作成する必要はありません。 タスク スケジューラを使用すると、アプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。
concurrency::CurrentScheduler::Create、concurrency::Scheduler::Create、または concurrency::Scheduler::SetDefaultSchedulerPolicy メソッドを使用してスケジューラ インスタンスを作成する場合は、concurrency::SchedulerPolicy オブジェクトを指定して、スケジューラの動作を指定するキーと値のペアのコレクションが含まれるようにします。 SchedulerPolicy
コンストラクターは可変数の引数を受け取ります。 最初の引数は、指定しようとしているポリシー要素の数です。 残りの引数は、各ポリシー要素のキーと値のペアです。 次の例では、3 つのポリシー要素を指定する SchedulerPolicy
オブジェクトを作成します。 ランタイムでは、指定されていないポリシー キーの既定値が使用されます。
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
concurrency::PolicyElementKey 列挙型は、タスク スケジューラに関連付けられているポリシー キーを定義します。 次の表では、ポリシー キーについて、およびランタイムで各ポリシー キーに使用される既定値について説明します。
ポリシー キー | 説明 | Default Value |
---|---|---|
SchedulerKind |
タスクのスケジュール設定に使用するスレッドの種類を指定する concurrency::SchedulerType 値。 | ThreadScheduler (通常のスレッドを使用)。 これは、このキーに対する唯一の有効な値です。 |
MaxConcurrency |
スケジューラで使用する同時実行リソースの最大数を指定する unsigned int 値。 |
concurrency::MaxExecutionResources |
MinConcurrency |
スケジューラで使用する同時実行リソースの最小数を指定する unsigned int 値。 |
1 |
TargetOversubscriptionFactor |
各処理リソースに割り当てるスレッドの数を指定する unsigned int 値。 |
1 |
LocalContextCacheSize |
各仮想プロセッサのローカル キューにキャッシュできるコンテキストの最大数を指定する unsigned int 値。 |
8 |
ContextStackSize |
各コンテキストに予約するスタックのサイズ (KB) を指定する unsigned int 値。 |
0 (既定のスタック サイズを使用) |
ContextPriority |
各コンテキストのスレッドの優先度を指定する int 値。 これには、SetThreadPriority または INHERIT_THREAD_PRIORITY に渡すことができる任意の値を指定できます。 |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
使用するスケジュール アルゴリズムを指定する concurrency::SchedulingProtocolType 値。 | EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
統計に基づく進行状況に従ってリソースを再調整するかどうかを指定する concurrency::DynamicProgressFeedbackType 値。 メモ このポリシーは、ランタイムで使用するために予約されているため、 ProgressFeedbackDisabled に設定しないでください。 |
ProgressFeedbackEnabled |
各スケジューラでは、タスクのスケジュール時に独自のポリシーが使用されます。 1 つのスケジューラに関連付けられているポリシーは、他のスケジューラの動作には影響しません。 また、Scheduler
オブジェクトを作成した後で、スケジューラ ポリシーを変更することはできません。
重要
ランタイムで作成されるスレッドの属性を制御する場合は、スケジューラ ポリシーのみを使用します。 ランタイムで作成されるスレッドのスレッドアフィニティや優先度は、未定義の動作が発生する可能性があるため、変更しないでください。
明示的にスケジューラを作成しない場合、ランタイムで既定のスケジューラが作成されます。 アプリケーションで既定のスケジューラを使用するときに、そのスケジューラで使用するポリシーを指定する場合は、並列処理をスケジュールする前に、concurrency::Scheduler::SetDefaultSchedulerPolicy メソッドを呼び出します。 Scheduler::SetDefaultSchedulerPolicy
メソッドを呼び出さない場合、ランタイムではテーブルから既定のポリシー値が使用されます。
スケジューラ ポリシーのコピーを取得するには、concurrency::CurrentScheduler::GetPolicy メソッドと concurrency::Scheduler::GetPolicy メソッドを使用します。 これらのメソッドから返されるポリシー値は、スケジューラの作成時に指定したポリシー値とは異なる場合があります。
例
特定のスケジューラ ポリシーを使用してスケジューラの動作を制御する例を確認するには、「方法: 特定のスケジューラ ポリシーを指定する」および「方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する」を参照してください。
関連項目
タスク スケジューラ
方法: 特定のスケジューラ ポリシーを指定する
方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する