Waktu (Direct3D 12 Graphics)

Bagian ini mencakup tanda waktu kueri, dan mengkalibrasi penghitung tanda waktu GPU dan CPU.

Frekuensi tanda waktu

Aplikasi Anda dapat mengkueri frekuensi tanda waktu GPU berdasarkan antrean per perintah (lihat metode ID3D12CommandQueue::GetTimestampFrequency ).

Frekuensi yang dikembalikan diukur dalam Hz (ticks/sec). Jika antrean perintah yang ditentukan tidak mendukung tanda waktu (lihat tabel di bagian Kueri ), MAKA API ini gagal (dan mengembalikan E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT dan D3D12_COMMAND_LIST_TYPE_COMPUTE selalu mendukung tanda waktu. D3D12_COMMAND_LIST_TYPE_COPY secara opsional mendukung tanda waktu jika anggota D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupportedadalah TRUE.

Kalibrasi tanda waktu

D3D12 memungkinkan aplikasi untuk menghubungkan hasil yang diperoleh dari kueri tanda waktu dengan hasil yang diperoleh dari panggilan QueryPerformanceCounter. Ini diaktifkan oleh panggilan ID3D12CommandQueue::GetClockCalibration.

Tanda waktu diambil sampelnya oleh GPU saat GPU selesai dengan semua beban kerja sebelumnya. Ini adalah perilaku yang sama yang diadopsi oleh Direct3D 11 (lihat D3D11_QUERY_TIMESTAMP dalam Spesifikasi Fungsional Direct3D 11.3 di GitHub). Itu berarti bahwa kueri tanda waktu adalah operasi bottom-of-pipe (BOP) di Direct3D 12.

GetClockCalibration mengambil sampel penghitung tanda waktu GPU untuk antrean perintah tertentu dan mengambil sampel penghitung CPU melalui QueryPerformanceCounter pada waktu yang hampir bersamaan. Sekali lagi API ini gagal (mengembalikan E_FAIL) jika antrean perintah yang ditentukan tidak mendukung tanda waktu (lihat tabel dalam topik Kueri ).

Perhatikan bahwa penghitung tanda waktu GPU dan CPU belum tentu terkait langsung dengan kecepatan jam prosesor ini, tetapi sebaliknya bekerja dari tanda waktu.

Kueri tanda waktu

Anda dapat memperoleh tanda waktu sebagai bagian dari daftar perintah (bukan panggilan sisi CPU pada antrean perintah) melalui kueri tanda waktu. (Lihat Kueri untuk informasi selengkapnya tentang kueri secara umum).

Semua kueri tanda waktu menggunakan jenis D3D12_QUERY_TYPE_TIMESTAMP untuk kueri aktual. Namun, karena keterbatasan perangkat keras, D3D12_COMMAND_LIST_TYPE_DIRECT dan D3D12_COMMAND_LIST_TYPE_COMPUTE menggunakan D3D12_QUERY_HEAP_TYPE yang berbeda dari yang digunakan D3D12_COMMAND_LIST_TYPE_COPY .

Antrean langsung dan komputasi menggunakan D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Salin antrean menggunakan D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Kueri antrean salin hanya didukung jika anggota D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported adalah TRUE.

Kueri tanda waktu, setelah diselesaikan melalui ID3D12GraphicsCommandList::ResolveQueryData, adalah UINT64 yang mewakili tick, seperti yang dikembalikan oleh ID3D12CommandQueue::GetClockCalibration, dan dengan demikian harus dibagi dengan frekuensi antrean untuk mendapatkan panjang dalam detik.

Penting

Untuk akurasi, gunakan aritmatika floating-point saat menghitung interval tanda waktu kedua atau milidetik. Misalnya, gunakan queriedTicks / (double)Frequency, bukan queriedTicks / Frequency.

Penghitung dan Kueri

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Pengukuran Performa