Chronométrage (graphismes Direct3D 12)

Cette section traite de l’interrogation des horodatages et de l’étalonnage des compteurs d’horodatage gpu et processeur.

Fréquence d’horodatage

Votre application peut interroger la fréquence d’horodatage GPU sur une base de file d’attente par commande (reportez-vous à la méthode ID3D12CommandQueue::GetTimestampFrequency ).

La fréquence retournée est mesurée en Hz (cycles/s). Si la file d’attente de commandes spécifiée ne prend pas en charge les horodatages (voir le tableau de la section Requêtes ), cette API échoue (et retourne E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT et D3D12_COMMAND_LIST_TYPE_COMPUTE prennent toujours en charge les horodatages. D3D12_COMMAND_LIST_TYPE_COPY prend éventuellement en charge les horodatages si le membre D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported a la valeur TRUE.

Étalonnage de l’horodatage

D3D12 permet aux applications de mettre en corrélation les résultats obtenus à partir de requêtes timestamp avec les résultats obtenus à partir de l’appel QueryPerformanceCounterde . Cela est activé par l’appel ID3D12CommandQueue::GetClockCalibration.

Un horodatage est échantillonné par le GPU au moment où le GPU est terminé avec toute la charge de travail précédente. Il s’agit du même comportement adopté par Direct3D 11 (voir D3D11_QUERY_TIMESTAMP dans la spécification fonctionnelle Direct3D 11.3 sur GitHub). Cela signifie que les requêtes timestamp sont une opération BOP (bottom-of-pipe) dans Direct3D 12.

GetClockCalibration échantillonne le compteur d’horodatage GPU pour une file d’attente de commandes donnée et échantillonne le compteur processeur via QueryPerformanceCounter presque en même temps. Là encore, cette API échoue (renvoyant E_FAIL) si la file d’attente de commandes spécifiée ne prend pas en charge les horodatages (voir le tableau de la rubrique Requêtes ).

Notez que les compteurs d’horodatage gpu et processeur ne sont pas nécessairement directement liés à la vitesse d’horloge de ces processeurs, mais fonctionnent plutôt à partir des cycles d’horodatage.

Requêtes d’horodatage

Vous pouvez obtenir des horodatages dans le cadre d’une liste de commandes (plutôt qu’un appel côté processeur dans une file d’attente de commandes) via des requêtes d’horodatage. (Pour plus d’informations sur les requêtes en général, consultez Requêtes ).

Toutes les requêtes d’horodatage utilisent le type D3D12_QUERY_TYPE_TIMESTAMP pour la requête réelle. Toutefois, en raison des limitations matérielles, D3D12_COMMAND_LIST_TYPE_DIRECT et D3D12_COMMAND_LIST_TYPE_COMPUTE utilisent une D3D12_QUERY_HEAP_TYPE différente de celle que D3D12_COMMAND_LIST_TYPE_COPY utilise.

Les files d’attente directes et de calcul utilisent D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Les files d’attente de copie utilisent D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Les requêtes de file d’attente de copie sont prises en charge uniquement si le membre D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported a la valeur TRUE.

Les requêtes d’horodatage, une fois résolues via ID3D12GraphicsCommandList::ResolveQueryData, sont un UINT64 qui représente des graduations, comme est retourné par ID3D12CommandQueue::GetClockCalibration, et en tant que telle, elle doit être divisée par la fréquence de file d’attente pour obtenir la longueur en secondes.

Important

Pour la précision, utilisez l’arithmétique à virgule flottante lors du calcul des intervalles de seconde ou milliseconde d’horodatages. Par exemple, utilisez queriedTicks / (double)Frequency au lieu de queriedTicks / Frequency.

Compteurs et requêtes

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Mesure des performances