Gunakan DRED untuk mendiagnosis kesalahan GPU
DRED adalah singkatan Dari Data Diperluas yang Dihapus Perangkat. DRED adalah serangkaian fitur diagnostik yang berkembang yang dirancang untuk membantu Anda mengidentifikasi penyebab kesalahan penghapusan perangkat yang tidak terduga. Pada perangkat keras yang mendukung fitur yang diperlukan (seperti yang didefinisikan di bawah), DRED memberikan remah roti otomatis serta pelaporan kesalahan halaman GPU.
Remah roti otomatis
Untuk mengatur adegan untuk remah roti otomatis, mari kita sebutkan terlebih dahulu varietas manual. Untuk mengantisipasi akhirnyanya Deteksi dan Pemulihan Batas Waktu (TDR), Anda dapat menggunakan metode ID3D12GraphicsCommandList2::WriteBufferImmediate untuk menempatkan remah roti ke aliran perintah GPU, untuk melacak kemajuan GPU.
Ini adalah pendekatan yang wajar jika Anda ingin membuat implementasi overhead yang kustom dan rendah. Tetapi mungkin tidak memiliki beberapa fleksibilitas solusi standar, seperti ekstensi debugger, atau pelaporan melalui Pelaporan Galat Windows (WER) (juga dikenal sebagai Watson).
Jadi, remah roti otomatis DRED memanggil WriteBufferImmediate untuk menempatkan penghitung kemajuan ke aliran perintah GPU. DRED menyisipkan remah roti setelah setiap operasi render—yang berarti setiap operasi yang menghasilkan pekerjaan GPU (misalnya, Gambar, Kirim, Salin, Selesaikan, dan lainnya). Jika perangkat dihapus di tengah beban kerja GPU, maka nilai breadcrumb DRED pada dasarnya adalah kumpulan operasi render yang selesai sebelum kesalahan.
Buffer cincin riwayat remah roti mempertahankan hingga 64KiB operasi dalam daftar perintah tertentu. Jika ada lebih dari 65536 operasi dalam daftar perintah, maka hanya operasi 64KiB terakhir yang disimpan—menimpa operasi terlama terlebih dahulu. Namun, nilai penghitung remah roti terus dihitung hingga UINT_MAX
. Oleh karena itu, LastOpIndex = (BreadcrumbCount - 1) % 65536.
DRED 1.0 pertama kali tersedia di Windows 10, versi 1809 (Pembaruan Windows 10 Oktober 2018), dan mengekspos remah roti otomatis dasar. Namun, tidak ada API untuk itu, dan satu-satunya cara untuk mengaktifkan DRED 1.0 adalah dengan menggunakan Feedback Hub untuk menangkap reproduksi TDR (repro) untuk Aplikasi & Game>Performa dan Kompatibilitas. Tujuan utama dred 1.0 adalah untuk membantu untuk root-cause-analyze game crash melalui umpan balik pelanggan.
Peringatan
- Karena GPU sangat disalurkan, tidak ada jaminan bahwa penghitung remah roti menunjukkan operasi yang tepat yang gagal. Bahkan, pada beberapa perangkat render yang ditangguhkan berbasis petak peta, dimungkinkan bagi penghitung breadcrumb menjadi penghitung sumber daya penuh atau tampilan akses yang tidak diurutkan (UAV) di belakang kemajuan GPU yang sebenarnya.
- Driver tampilan dapat menyusun ulang perintah, melakukan pra-pengambilan dari memori sumber daya dengan baik sebelum menjalankan perintah, atau menghapus memori cache dengan baik setelah menyelesaikan perintah. Salah satunya dapat menghasilkan kesalahan GPU. Dalam kasus seperti itu, penghitung remah roti otomatis mungkin kurang membantu, atau menyesatkan.
Performa
Meskipun remah roti otomatis dirancang untuk overhead rendah, mereka tidak gratis. Pengukuran empiris menunjukkan kehilangan performa 2-5% pada mesin game grafis AAA Direct3D 12 yang khas. Untuk alasan ini, remah roti otomatis nonaktif secara default.
Persyaratan perangkat keras
Karena nilai penghitung remah roti harus dipertahankan setelah penghapusan perangkat, sumber daya yang berisi remah roti harus ada dalam memori sistem, dan harus bertahan jika terjadi penghapusan perangkat. Ini berarti bahwa driver tampilan perlu mendukung D3D12_FEATURE_EXISTING_HEAPS. Untungnya, ini adalah kasus untuk sebagian besar driver tampilan Direct3D 12 pada Windows 10, versi 1903.
Pelaporan kesalahan halaman GPU
Fitur yang baru untuk DRED 1.1 adalah pelaporan kesalahan halaman GPU DRED. Kesalahan halaman GPU umumnya terjadi di bawah salah satu kondisi ini.
- Aplikasi secara keliru menjalankan pekerjaan pada GPU yang mereferensikan objek yang dihapus. Ini adalah salah satu alasan utama penghapusan perangkat yang tidak terduga.
- Aplikasi secara keliru menjalankan pekerjaan pada GPU yang mengakses sumber daya yang dikeluarkan, atau petak peta non-residen.
- Shader mereferensikan deskriptor yang tidak diinisialisasi atau usang.
- Shader mengindeks di luar akhir pengikatan akar.
DRED mencoba mengatasi beberapa skenario ini dengan melaporkan nama dan jenis objek API yang ada atau yang baru-baru ini dibebaskan yang cocok dengan alamat virtual (VA) dari kesalahan halaman yang dilaporkan GPU.
Peringatan
Tidak semua GPU mendukung kesalahan halaman (meskipun, banyak yang melakukannya). Beberapa GPU merespons kesalahan memori dengan: penulisan bit-bucket; membaca data yang disimulasikan (misalnya, nol); atau hanya dengan menggantung. Sayangnya, dalam kasus di mana GPU tidak segera menggantung, Deteksi dan Pemulihan Waktu Habis (TDR) dapat terjadi nanti di pipa, membuatnya lebih sulit untuk menemukan akar penyebabnya.
Performa
Runtime Direct3D 12 harus secara aktif mengumpulkan kumpulan objek API yang ada dan yang baru dihapus yang dapat diindeks oleh alamat virtual (VA). Ini meningkatkan overhead memori sistem, dan memperkenalkan hit performa kecil pada pembuatan dan penghancuran objek. Untuk alasan itu, perilaku ini nonaktif secara default.
Persyaratan perangkat keras
GPU yang tidak mendukung kesalahan halaman masih dapat memperoleh manfaat dari fitur remah roti otomatis.
Menyiapkan DRED dalam kode
Pengaturan DRED bersifat global untuk proses, dan Anda harus mengonfigurasinya sebelum membuat Perangkat Direct3D 12. Untuk melakukannya, panggil fungsi D3D12GetDebugInterface untuk mengambil ID3D12DeviceRemovedExtendedData Pengaturan.
CComPtr<ID3D12DeviceRemovedExtendedDataSettings> pDredSettings;
VERIFY_SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDredSettings)));
// Turn on auto-breadcrumbs and page fault reporting.
pDredSettings->SetAutoBreadcrumbsEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);
pDredSettings->SetPageFaultEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);
Catatan
Modifikasi pada pengaturan DRED tidak berpengaruh pada perangkat yang sudah dibuat. Tetapi panggilan berikutnya ke D3D12CreateDevice menggunakan pengaturan DRED terbaru.
Mengakses data DRED dalam kode
Setelah penghapusan perangkat terdeteksi (misalnya, Present mengembalikan DXGI_ERROR_DEVICE_REMOVED), gunakan metode antarmuka ID3D12DeviceRemovedExtendedData untuk mengakses data DRED untuk perangkat yang dihapus.
Untuk mengambil antarmuka ID3D12DeviceRemovedExtendedData , panggil QueryInterface pada antarmuka ID3D12Device (atau turunan), melewati pengidentifikasi antarmuka (IID) ID3D12DeviceRemovedExtendedData.
void MyDeviceRemovedHandler(ID3D12Device * pDevice)
{
CComPtr<ID3D12DeviceRemovedExtendedData> pDred;
VERIFY_SUCCEEDED(pDevice->QueryInterface(IID_PPV_ARGS(&pDred)));
D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT DredAutoBreadcrumbsOutput;
D3D12_DRED_PAGE_FAULT_OUTPUT DredPageFaultOutput;
VERIFY_SUCCEEDED(pDred->GetAutoBreadcrumbsOutput(&DredAutoBreadcrumbsOutput));
VERIFY_SUCCEEDED(pDred->GetPageFaultAllocationOutput(&DredPageFaultOutput));
// Custom processing of DRED data can be done here.
// Produce telemetry...
// Log information to console...
// break into a debugger...
}
Akses debugger ke DRED
Debugger memiliki akses ke data DRED melalui d3d12! Ekspor data D3D12DeviceRemovedExtendedData .
Untuk pengguna WinDbg, lihat repositori GitHub DirectX-Debugging-Tools untuk ekstensi WinDBG yang membuatnya jauh lebih mudah untuk men-debug status Direct3D 12 DRED.
Telemetri DRED
Aplikasi Anda dapat menggunakan API DRED untuk mengontrol fitur DRED, dan mengumpulkan telemetri untuk membantu menganalisis masalah. Ini memberi Anda jaring yang jauh lebih luas untuk menangkap TDR yang sulit direproduksi.
Pada Windows 10, versi 1903, semua peristiwa yang dihapus perangkat mode pengguna dilaporkan ke Pelaporan Galat Windows (WER), juga dikenal sebagai Watson. Jika kombinasi aplikasi, GPU, dan driver tampilan tertentu menghasilkan jumlah peristiwa yang dihapus perangkat yang memadai, ada kemungkinan DRED akan diaktifkan sementara bagi pelanggan yang meluncurkan aplikasi yang sama pada konfigurasi serupa.