Stratégies de planificateur

Ce document décrit le rôle des stratégies de planificateur dans le runtime d’accès concurrentiel. Une stratégie de planificateur contrôle la stratégie utilisée par le planificateur lorsqu’il gère les tâches. Par exemple, considérez une application qui nécessite que certaines tâches s’exécutent à l’adresse THREAD_PRIORITY_NORMAL et à d’autres tâches à exécuter.THREAD_PRIORITY_HIGHEST Vous pouvez créer deux instances de planificateur : une qui spécifie la ContextPriority stratégie à être THREAD_PRIORITY_NORMAL et une autre qui spécifie la même stratégie à utiliser THREAD_PRIORITY_HIGHEST.

En utilisant des stratégies de planificateur, vous pouvez diviser les ressources de traitement disponibles et affecter un ensemble fixe de ressources à chaque planificateur. Par exemple, considérez un algorithme parallèle qui ne se met pas à l’échelle au-delà de quatre processeurs. Vous pouvez créer une stratégie de planificateur qui limite ses tâches pour qu’elle n’utilise pas plus de quatre processeurs simultanément.

Conseil

Le runtime d’accès concurrentiel fournit un planificateur par défaut. Par conséquent, vous n’avez pas besoin de en créer un dans votre application. Étant donné que le planificateur de tâches vous aide à affiner les performances de vos applications, nous vous recommandons de commencer par la bibliothèque de modèles parallèles (PPL) ou la bibliothèque d’agents asynchrones si vous débutez avec le runtime d’accès concurrentiel.

Lorsque vous utilisez la méthode concurrency ::CurrentScheduler ::Create, concurrency ::Scheduler ::Create ou concurrency ::Scheduler ::SetDefaultSchedulerPolicy pour créer une instance de planificateur, vous fournissez un objet concurrency ::SchedulerPolicy qui contient une collection de paires clé-valeur qui spécifient le comportement du planificateur. Le SchedulerPolicy constructeur accepte un nombre variable d’arguments. Le premier argument est le nombre d’éléments de stratégie que vous êtes sur le point de spécifier. Les arguments restants sont des paires clé-valeur pour chaque élément de stratégie. L’exemple suivant crée un SchedulerPolicy objet qui spécifie trois éléments de stratégie. Le runtime utilise des valeurs par défaut pour les clés de stratégie qui ne sont pas spécifiées.

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

L’énumération concurrency ::P olicyElementKey définit les clés de stratégie associées au planificateur de tâches. Le tableau suivant décrit les clés de stratégie et la valeur par défaut utilisée par le runtime pour chacun d’entre eux.

Clé de stratégie Description Valeur par défaut
SchedulerKind Valeur concurrency ::SchedulerType qui spécifie le type de threads à utiliser pour planifier des tâches. ThreadScheduler (utilisez des threads normaux). Il s’agit de la seule valeur valide pour cette clé.
MaxConcurrency Valeur unsigned int qui spécifie le nombre maximal de ressources d’accès concurrentiel utilisées par le planificateur. concurrency ::MaxExecutionResources
MinConcurrency Valeur unsigned int qui spécifie le nombre minimal de ressources d’accès concurrentiel utilisées par le planificateur. 1
TargetOversubscriptionFactor Valeur unsigned int qui spécifie le nombre de threads à allouer à chaque ressource de traitement. 1
LocalContextCacheSize Valeur unsigned int qui spécifie le nombre maximal de contextes pouvant être mis en cache dans la file d’attente locale de chaque processeur virtuel. 8
ContextStackSize Valeur unsigned int qui spécifie la taille de la pile, en kilo-octets, à réserver pour chaque contexte. 0 (utilisez la taille de pile par défaut)
ContextPriority Valeur int qui spécifie la priorité de thread de chaque contexte. Il peut s’agir de n’importe quelle valeur que vous pouvez transmettre à SetThreadPriority ou INHERIT_THREAD_PRIORITY. THREAD_PRIORITY_NORMAL
SchedulingProtocol Valeur concurrency ::SchedulingProtocolType qui spécifie l’algorithme de planification à utiliser. EnhanceScheduleGroupLocality
DynamicProgressFeedback Une valeur concurrency ::D ynamicProgressFeedbackType qui spécifie s’il faut rééquilibrer les ressources en fonction des informations de progression basées sur les statistiques.

Notez que cette stratégie ProgressFeedbackDisabled n’est pas définie car elle est réservée pour une utilisation par le runtime.
ProgressFeedbackEnabled

Chaque planificateur utilise sa propre stratégie quand il planifie des tâches. Les stratégies associées à un planificateur n’affectent pas le comportement d’un autre planificateur. En outre, vous ne pouvez pas modifier la stratégie du planificateur après avoir créé l’objet Scheduler .

Important

Utilisez uniquement des stratégies de planificateur pour contrôler les attributs des threads créés par le runtime. Ne modifiez pas l’affinité de thread ou la priorité des threads créés par le runtime, car cela peut entraîner un comportement non défini.

Le runtime crée un planificateur par défaut pour vous si vous ne en créez pas explicitement un. Si vous souhaitez utiliser le planificateur par défaut dans votre application, mais que vous souhaitez spécifier une stratégie pour ce planificateur à utiliser, appelez la méthode concurrency ::Scheduler ::SetDefaultSchedulerPolicy avant de planifier le travail parallèle. Si vous n’appelez pas la Scheduler::SetDefaultSchedulerPolicy méthode, le runtime utilise les valeurs de stratégie par défaut de la table.

Utilisez les méthodes concurrency ::CurrentScheduler ::GetPolicy et concurrency ::Scheduler ::GetPolicy pour récupérer une copie de la stratégie de planificateur. Les valeurs de stratégie que vous recevez de ces méthodes peuvent différer des valeurs de stratégie que vous spécifiez lorsque vous créez le planificateur.

Exemple

Pour examiner des exemples qui utilisent des stratégies de planificateur spécifiques pour contrôler le comportement du planificateur, consultez Comment : spécifier des stratégies de planificateur spécifiques et comment : créer des agents qui utilisent des stratégies de planificateur spécifiques.

Voir aussi

Planificateur de tâches
Guide pratique pour spécifier des stratégies de planificateur
Guide pratique pour créer des agents qui utilisent des stratégies de planificateur spécifiques