Temporizzazione (grafica Direct3D 12)
Questa sezione illustra l'esecuzione di query sui timestamp e la calibrazione dei contatori timestamp GPU e CPU.
Frequenza timestamp
L'applicazione può eseguire una query sulla frequenza del timestamp della GPU in base alla coda di comandi (fare riferimento al metodo ID3D12CommandQueue::GetTimestampFrequency ).
La frequenza restituita viene misurata in Hz (tick/sec). Se la coda di comandi specificata non supporta i timestamp (vedere la tabella nella sezione Query ), questa API ha esito negativo (e restituisce E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE supportano sempre i timestamp. D3D12_COMMAND_LIST_TYPE_COPY facoltativamente supporta i timestamp se il membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported è TRUE.
Calibrazione timestamp
D3D12 consente alle applicazioni di correlare i risultati ottenuti dalle query timestamp con i risultati ottenuti dalla chiamata QueryPerformanceCounter
. Questa opzione è abilitata dalla chiamata ID3D12CommandQueue::GetClockCalibration.
Un timestamp viene campionato dalla GPU al momento in cui la GPU viene completata con tutto il carico di lavoro precedente. È lo stesso comportamento adottato da Direct3D 11 (vedere D3D11_QUERY_TIMESTAMP nella specifica funzionale Direct3D 11.3 in GitHub). Ciò significa che le query timestamp sono un'operazione BOP (bottom-of-pipe) in Direct3D 12.
GetClockCalibration esempi il contatore timestamp della GPU per una determinata coda di comandi e esempi il contatore della CPU tramite QueryPerformanceCounter
quasi allo stesso tempo. Se la coda di comandi specificata non supporta i timestamp E_FAIL , vedere la tabella nell'argomento Query .
Si noti che i contatori timestamp GPU e CPU non sono necessariamente direttamente correlati alla velocità di clock di questi processori, ma funzionano invece dai tick timestamp.
Query timestamp
È possibile ottenere timestamp come parte di un elenco di comandi (anziché una chiamata lato CPU in una coda di comandi) tramite query timestamp. Vedere Query per altre informazioni sulle query in generale.
Tutte le query timestamp usano il tipo D3D12_QUERY_TYPE_TIMESTAMP per la query effettiva. Tuttavia, a causa delle limitazioni hardware, D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE usare un D3D12_QUERY_HEAP_TYPE diverso da quello usato da D3D12_COMMAND_LIST_TYPE_COPY .
Le code dirette e di calcolo usano D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
Le code di copia usano D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
Le query della coda di copia sono supportate solo se il membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported è TRUE.
Le query timestamp, una volta risolte tramite ID3D12GraphicsCommandList::ResolveQueryData, sono un oggetto UINT64 che rappresenta i tick, come restituito da ID3D12CommandQueue::GetClockCalibration e, come tale, deve essere diviso in base alla frequenza della coda per ottenere la lunghezza in secondi.
Importante
Per l'accuratezza, usare aritmetica a virgola mobile quando si calcolano intervalli di timestamp secondi o millisecondi. Usare, ad esempio, queriedTicks / (double)Frequency
invece di queriedTicks / Frequency
.