Partager via


Analyse du contexte

Cet article fournit des informations sur la surveillance du contexte, qui permet une synchronisation flexible entre les moteurs GPU, ou entre les cœurs de processeur et les moteurs GPU. Un objet de clôture supervisé, qui est une forme avancée de synchronisation de clôture, permet à un cœur de processeur ou à un moteur GPU de signaler ou d’attendre sur un objet de clôture particulier.

Création de clôture supervisée

Le runtime Direct3D crée un objet de clôture supervisé en appelant le rappel CreateSynchronizationObjectCb du pilote en mode utilisateur (UMD) avec le type d’objet de synchronisation D3DDDI_MONITORED_FENCE .

Un objet de clôture supervisé est créé avec les attributs suivants :

  • Valeur initiale
  • Indicateurs (spécification de son comportement d’attente et de signalisation)

Lors de la création, le noyau graphique retourne un objet de clôture composé des éléments suivants :

Élément Description
hSyncObject Handle vers l’objet de synchronisation. Utilisé pour y faire référence dans un appel au noyau graphique.
FenceValueCPUVirtualAddress Mappage en lecture seule de la valeur de clôture (64 bits) pour le processeur. Cette adresse est mappée WB (mise en cache) du point de vue de l’UC sur les plateformes prenant en charge la cohérence des E/S, uc (non mise en cache) sur d’autres plateformes. Permet au processeur de suivre la progression de la clôture en lisant simplement cet emplacement de mémoire. Le processeur n’est pas autorisé à écrire dans cet emplacement de mémoire. Pour signaler la clôture, le processeur doit appeler SignalSynchronizationObjectFromCpuCb. Les adaptateurs qui prennent en charge IoMmu doivent utiliser cette adresse pour l’accès GPU. L’adresse est mappée en lecture-écriture dans ce cas.
FenceValueGPUVirtualAddress Mappage en lecture/écriture de la valeur de clôture (64 bits) pour le GPU. Cette adresse est mappée comme nécessitant une cohérence d’E/S sur les plateformes qui la soutiennent. Pour signaler la clôture, le GPU est autorisé à écrire directement dans cette adresse virtuelle GPU. Les GPU IoMmu ne doivent pas utiliser cette adresse.

La valeur de clôture est une valeur 64 bits avec leurs adresses virtuelles respectives alignées sur une limite 64 bits. Les GPU doivent déclarer s’ils sont capables de mettre à jour atomiquement les valeurs 64 bits comme visibles par le processeur via l’indicateur DXGK_VIDSCHCAPS ::No64BitAtomics ajouté. Si un GPU est capable de mettre à jour uniquement les valeurs 32 bits de manière atomique, le système d’exploitation gère automatiquement le cas wraparound de clôture. Toutefois, il impose une restriction selon laquelle les valeurs d’attente et de clôture de signal en suspens ne peuvent pas être supérieures à UINT_MAX/2 par rapport à la dernière valeur de clôture signalée.

Signal GPU

Si un moteur GPU n’est pas en mesure d’écrire sur une clôture surveillée à l’aide de son adresse virtuelle, le pilote en mode utilisateur (UMD) utilise le rappel SignalSynchronizationObjectFromGpuCb pour mettre en file d’attente un paquet de signal logiciel dans le contexte GPU.

Pour signaler la clôture à partir du GPU, l’UMD insère une commande d’écriture de clôture directement dans un flux de commandes de contexte sans passer par le mode noyau. Le mécanisme par lequel le noyau surveille la progression de la clôture varie selon qu’un moteur GPU particulier prend en charge l’implémentation de base ou avancée de la clôture surveillée.

Lorsqu’une mémoire tampon de commandes termine l’exécution sur le GPU, le noyau graphique :

  • Passe en revue la liste des objets de clôture avec des attentes en attente qui peuvent être signalées pour ce processus
  • Lit leur valeur de clôture actuelle
  • Détermine si des attentes doivent être annulées.

Attente GPU

Pour attendre sur une clôture surveillée sur un moteur GPU, l’UMD doit d’abord vider sa mémoire tampon de commandes en attente, puis appeler WaitForSynchronizationObjectFromGpuCb en spécifiant l’objet de clôture (hSyncObject) et la valeur de clôture en attente. Le noyau graphique met en file d’attente la dépendance vers sa base de données interne, puis retourne immédiatement à l’UMD afin qu’il puisse continuer à mettre en file d’attente le travail derrière l’opération d’attente. Les mémoires tampons de commande envoyées après l’opération d’attente ne sont pas planifiées pour l’exécution tant que l’opération d’attente n’est pas satisfaite.

Signal du processeur

Le rappel SignalSynchronizationObjectFromCpuCb a été ajouté pour permettre au processeur de signaler un objet de clôture surveillé. Lorsque le processeur signale un objet de clôture surveillé, le noyau graphique met à jour l’emplacement de la mémoire de clôture avec la valeur signalée. Cette valeur devient immédiatement visible par tout lecteur en mode utilisateur et annule immédiatement les attentes satisfaites.

Attente du processeur

Un rappel WaitForSynchronizationObjectFromCpuCb a été ajouté pour permettre au processeur d’attendre sur un objet de clôture surveillé. Deux formes d’opérations d’attente sont disponibles. Dans le premier formulaire, WaitForSynchronizationObjectFromCpuCb se bloque jusqu’à ce que l’attente soit satisfaite. Dans le deuxième formulaire, WaitForSynchronizationObjectFromCpuCb prend un handle pour un événement de processeur qui est signalé une fois la condition d’attente satisfaite.