Partager via


Préemption du GPU

Le modèle de préemption GPU a été mis à jour dans Windows 8 (WDDM 1.2). Dans le modèle mis à jour, le système d’exploitation :

  • N’autorise pas le pilote d’affichage en mode noyau (KMD) à désactiver la préemption des paquets DMA GPU.
  • Garantit que les requêtes de préemption sont envoyées au GPU avant qu’il ne lance un processus de Timeout Detection and Recovery (TDR).
Spécification Description
Mise en œuvre du pilote : Graphiques complets et Rendu uniquement Obligatoire
WHLK exigences et tests Device.Graphics…Preemption Test, Device.Graphics…FlipOnVSyncMmIo

Si le système d'exploitation ne peut pas préempter correctement les paquets longs, alors :

  • Le travail GPU à priorité élevée (par exemple, le travail requis par le Gestionnaire de fenêtres de bureau (DWM)) peut être retardé. Ce délai entraîne des problèmes pendant les transitions de fenêtre et les animations.
  • Le processus TDR peut réinitialiser le GPU à plusieurs reprises et éventuellement provoquer un bogue système.

Tous les KMD WDDM 1.2 doivent prendre en charge le modèle de préemption Windows 8. Toutefois, lors de l'exécution, les pilotes WDDM 1.2 peuvent également rejeter le modèle de préemption Windows 8 et adopter le comportement de Windows 7 par le planificateur du sous-système du noyau graphique DirectX (Dxgkrnl).

Interface de préemption GPU

KMD peut utiliser les DDIS suivants pour implémenter le modèle de préemption GPU Windows 8.

Étapes d’implémentation du pilote

Suivez ces étapes générales pour implémenter le modèle de préemption GPU Windows 8 dans votre kmD :

  1. Compilez votre pilote avec des en-têtes qui possèdent DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
  2. Déclarez la prise en charge du modèle de préemption GPU de Windows 8 en définissant les membres PreemptionAware et MultiEngineAware de la structure DXGK_VIDSCHCAPS à 1. Pour prendre en charge le modèle de préemption Windows 7, mettez PreemptionAware à zéro.
  3. Spécifiez le niveau de granularité de préemption pris en charge dans la structure D3DKMDT_PREEMPTION_CAPS, qui accepte des valeurs constantes issues des énumérations D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY et D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY.
  4. Si le matériel prend en charge le changement de contexte différé, envoyez un tampon de longueur nulle à la fonction DxgkDdiSubmitCommand et définissez le membre pSubmitCommand->Flags->ContextSwitch sur 1. Notez la discussion concernant le membre ContextSwitch de la structure DXGK_SUBMITCOMMANDFLAGS.
  5. Définissez les allocations de contexte GPU et les allocations de contexte d’appareil en appelant la fonction DxgkCbCreateContextAllocation. Notez les instructions et restrictions spécifiques fournies dans les remarques de la fonction.
  6. Appelez la fonction DxgkCbDestroyContextAllocation pour détruire les allocations de contexte GPU et les allocations de contexte d’appareil créées avec DxgkCbCreateContextAllocation.
  7. Lors de la préparation de la mémoire tampon DMA en réponse à un appel à la fonction DxgkDdiBuildPagingBuffer, initialisez la ressource de contexte en remplissant la structure interne InitContextResource au sein de la structure DXGKARG_BUILDPAGINGBUFFER. Si les ressources de contexte sont supprimées ou déplacées, le gestionnaire de mémoire vidéo conserve le contenu des ressources de contexte.
  8. Le pilote doit prendre en charge le flip E/S mappé en mémoire sur la prochaine synchronisation verticale. Dans Windows 8, le planificateur GPU tente de préempter le matériel même si des flips sont en attente. Par conséquent, pour éviter le déchirement et les artefacts de rendu, le pilote doit prendre en charge le modèle de flip E/S mappé en mémoire et doit définir le membre FlipOnVSyncMmIo de la structure DXGK_FLIPCAPS à 1 et prendre en charge les opérations décrites dans FlipOnVSyncMmIo.

Considérations relatives au mappage de mémoire dans votre implémentation

Suivez ces instructions pour créer un pilote robuste qui prend en charge le modèle de préemption gpu Windows 8 et fournit une expérience utilisateur de qualité :

  • Demandez la préemption en milieu de tampon DMA au GPU lorsque le planificateur Dxgkrnl envoie une commande de préemption. Les périphériques matériels qui disposent d’une granularité plus fine de préemption en milieu de tampon DMA devraient offrir une meilleure expérience client.
  • Autorisez la réutilisation des identifiants de fence de commande de pagination : si une requête de préemption a entraîné la préemption des commandes de pagination dans la file d’attente matérielle, le planificateur Dxgkrnl renverra les commandes de pagination préemptées avec les mêmes identifiants de fence qui leur étaient initialement attribués, et ces commandes de pagination seront planifiées avant toute autre commande sur ce moteur. Les commandes non-paginées seront renvoyées avec de nouveaux identifiants de fence.
  • Fournissez une liste d’emplacements de correctifs pour les tampons DMA fractionnés. Pour plus d’informations, veuillez consulter la section Fractionner un buffer DMA.
  • Un mode de vérification, appelé détection de fuite de liaison, est disponible. Ce mode de vérification parcourt la liste d’emplacements de correctifs et rejette les paquets qui ne libèrent pas ou ne reprogramment pas les allocations pour chaque paquet fractionné. Certains matériels prennent en charge les adresses virtuelles, ce qui permet un niveau supplémentaire d’indirection qui peut rendre cette vérification inutile. Dans ce cas, pour indiquer que le pilote se retire du mode de vérification, définissez le membre NoDmaPatching de la structure DXGK_VIDSCHCAPS à 1.
  • Dans Windows 7, le Dxgkrnl planificateur garantit que tous les paquets DMA fractionnés correspondant à la même commande de rendu sont exécutés séquentiellement sans basculer vers un autre contexte de rendu. Dans le modèle de préemption Windows 8, le planificateur peut exécuter des paquets de rendu à partir d’un contexte différent entre deux paquets fractionnés qui correspondent à la même commande de rendu. Par conséquent, les pilotes qui connaissent la préemption doivent gérer une soumission de paquetS DMA fractionnée/partielle de la même façon qu’une soumission de paquets complète normale. En particulier, l’état du GPU doit être enregistré ou restauré à la limite pour ces soumissions.
  • Un pilote sensible à la préemption ne doit pas modifier le contenu d'une mémoire tampon DMA fractionnée lorsqu'il est diffusé à plusieurs adaptateurs en mode LDA (Linked Display Adapter), où plusieurs GPU physiques sont liés pour former un GPU virtuel unique, plus rapide. Dans le modèle de préemption Windows 8, le Dxgkrnl planificateur ne garantit plus l’exécution synchrone d’une séquence de paquets fractionnée sans passer à un autre contexte. Un pilote qui a modifié le contenu d’un paquet DMA fractionné compromettrait l’intégrité des données du paquet. Plus précisément, si le paquet a été exécuté sur un autre moteur, il fonctionne sur la même copie des données de mémoire tampon DMA.
  • Dans le modèle de préemption GPU de Windows 8, le planificateur Dxgkrnl active la préemption pour les paquets qui ont des primitives de synchronisation associées « signal on submit ». Si un appareil utilise des primitives de synchronisation « signal sur envoi » avec des états d’attente basés sur le matériel, il doit prendre en charge la possibilité de préempter une instruction d’attente avant que la condition d’attente soit satisfaite.

Configuration requise pour la certification matérielle

Pour plus d’informations sur les exigences que les appareils matériels doivent respecter lorsqu’ils implémentent cette fonctionnalité, reportez-vous à la documentation WHLK appropriée sur Device.Graphics... Test de préemption et Device.Graphics... FlipOnVSyncMmIo.