Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette section traite de l’interrogation des horodatages et de la calibration des compteurs d’horodatage gpu et processeur.
Tip
Pour l’analyse interactive du profilage gpu et du minutage d’images, utilisez PIX pour Windows. PIX fournit des vues de captures GPU, de captures temporelles et de surveillance du système, qui corrèlent visuellement l’activité du CPU et du GPU, ce qui en fait le point de départ recommandé avant d’écrire une infrastructure personnalisée de requêtes d’horodatage. Le KIT SDK d’agilité DirectX 12 garantit que vous disposez des dernières fonctionnalités d’exécution disponibles pour le profilage et les diagnostics, quelle que soit la version du système d’exploitation.
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 renvoyée est exprimée en Hz (tics/s). Si la file d’attente de commandes spécifiée ne prend pas en charge les horodatages (consultez la table 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 éventuellement prend 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 d’horodatage avec les résultats obtenus à partir de l’appel QueryPerformanceCounter. Cela est activé par l’appel ID3D12CommandQueue ::GetClockCalibration.
Un horodatage est relevé par le GPU au moment où celui-ci a terminé 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 d’horodatage sont une opération BOP (bottom-of-pipe) dans Direct3D 12.
GetClockCalibration échantillonne le compteur d’horodatage du GPU pour une file d’attente de commandes donnée et échantillonne le compteur du CPU via QueryPerformanceCounter presque au même moment. 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 dans la rubrique Requêtes ).
Notez que les compteurs d’horodatage du GPU et du CPU ne sont pas nécessairement directement liés à la vitesse d’horloge de ces processeurs, mais fonctionnent plutôt à partir des cycles d’horodatage.
Avertissement
Les horloges d’horodatage du GPU peuvent cesser de tourner sur certains matériels lorsque le GPU est inactif, de sorte que la corrélation peut se décaler. Pour éviter cela, appelez ID3D12Device ::SetStablePowerState pendant le développement (nécessite le mode développeur activé).
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 sur une file d’attente de commandes) via des requêtes d’horodatage. (Consultez Requêtes pour plus d’informations sur les requêtes en général).
Toutes les requêtes d’horodatage utilisent le type D3D12_QUERY_TYPE_TIMESTAMP pour la requête réelle. Toutefois, en raison de limitations matérielles, D3D12_COMMAND_LIST_TYPE_DIRECT et D3D12_COMMAND_LIST_TYPE_COMPUTE utiliser une D3D12_QUERY_HEAP_TYPE différente de celle utilisée par D3D12_COMMAND_LIST_TYPE_COPY .
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 dans la file d'attente de copie ne sont prises en charge que 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 des UINT64 qui représentent des cycles, comme le renvoie ID3D12CommandQueue::GetClockCalibration, et doit donc être divisé par la fréquence de la file pour obtenir la durée en secondes.
Important
Pour une précision, utilisez l’arithmétique à virgule flottante lors du calcul des intervalles de seconde ou millisecondes des horodatages. Par exemple, utilisez queriedTicks / (double)Frequency au lieu de queriedTicks / Frequency.