Bagikan melalui


Pemantauan konteks

Artikel ini menyediakan informasi tentang pemantauan konteks, yang memungkinkan sinkronisasi fleksibel antara mesin GPU, atau di seluruh inti CPU dan mesin GPU. Objek pagar yang dipantau, yang merupakan bentuk lanjutan sinkronisasi pagar, memungkinkan inti CPU atau mesin GPU untuk memberi sinyal atau menunggu objek pagar tertentu.

Pembuatan pagar yang dipantau

Runtime Direct3D membuat objek pagar yang dipantau dengan memanggil panggilan balik CreateSynchronizationObjectCb driver mode pengguna dengan jenis objek sinkronisasi D3DDDI_MONITORED_FENCE .

Objek pagar yang dipantau dibuat bersama dengan atribut berikut:

  • Nilai awal
  • Bendera (menentukan perilaku menunggu dan memberi sinyal)

Setelah dibuat, kernel grafis mengembalikan objek pagar yang terdiri dari item berikut:

Item Deskripsi
hSyncObject Tangani ke objek sinkronisasi. Digunakan untuk merujuknya dalam panggilan ke kernel grafis.
FenceValueCPUVirtualAddress Pemetaan baca-saja dari nilai pagar (64 bit) untuk CPU. Alamat ini dipetakan WB (dapat di-cache) dari sudut pandang CPU pada platform yang mendukung koherensi I/O, UC (tidak di-cache) pada platform lain. Memungkinkan CPU untuk melacak kemajuan pagar hanya dengan membaca lokasi memori ini. CPU tidak diizinkan untuk menulis ke lokasi memori ini. Untuk memberi sinyal pagar, CPU diperlukan untuk memanggil SignalSynchronizationObjectFromCpuCb. Adaptor yang mendukung IoMmu harus menggunakan alamat ini untuk akses GPU. Alamat dipetakan sebagai baca-tulis dalam kasus ini.
FenceValueGPUVirtualAddress Pemetaan baca/tulis nilai pagar (64 bit) untuk GPU. Alamat ini dipetakan sebagai memerlukan koherensi I/O pada platform yang mendukungnya. Untuk memberi sinyal pagar, GPU diizinkan untuk menulis langsung ke alamat virtual GPU ini. GPU IoMmu tidak boleh menggunakan alamat ini.

Nilai pagar adalah nilai 64-bit dengan alamat virtual masing-masing selaras pada batas 64-bit. GPU harus menyatakan apakah mereka mampu memperbarui nilai 64-bit secara atomik seperti yang terlihat oleh CPU melalui bendera DXGK_VIDSCHCAPS::No64BitAtomics yang ditambahkan. Jika GPU hanya mampu memperbarui nilai 32-bit secara atomik, OS menangani kasus wraparound pagar secara otomatis. Namun menempatkan pembatasan bahwa nilai pagar tunggu dan sinyal yang luar biasa tidak boleh lebih dari UINT_MAX/2 jauh dari nilai pagar sinyal terakhir.

Sinyal GPU

Jika mesin GPU tidak mampu menulis ke pagar yang dipantau menggunakan alamat virtualnya, driver mode pengguna (UMD) menggunakan callback SignalSynchronizationObjectFromGpuCb untuk mengantre paket sinyal perangkat lunak ke konteks GPU.

Untuk memberi sinyal pagar dari GPU, UMD menyisipkan perintah tulis pagar dalam aliran perintah konteks secara langsung tanpa melalui mode kernel. Mekanisme di mana kernel memantau kemajuan pagar bervariasi tergantung pada apakah mesin GPU tertentu mendukung implementasi dasar atau lanjutan dari pagar yang dipantau.

Saat buffer perintah menyelesaikan eksekusi pada GPU, kernel grafis:

  • Melalui daftar objek pagar dengan menunggu tertunda yang dapat disinyalir untuk proses ini
  • Membaca nilai pagar mereka saat ini
  • Menentukan apakah ada penantian yang perlu ditunggu.

GPU tunggu

Untuk menunggu pagar yang dipantau pada mesin GPU, UMD terlebih dahulu perlu membersihkan buffer perintah yang tertunda lalu memanggil WaitForSynchronizationObjectFromGpuCb yang menentukan objek pagar (hSyncObject) dan nilai pagar yang sedang ditunggu. Kernel grafis mengantrekan dependensi ke database internalnya, kemudian segera kembali ke UMD sehingga dapat terus mengantre bekerja di belakang operasi tunggu. Buffer perintah yang dikirimkan setelah operasi tunggu tidak dijadwalkan untuk eksekusi hingga operasi tunggu terpenuhi.

Sinyal CPU

Callback SignalSynchronizationObjectFromCpuCb ditambahkan untuk memungkinkan CPU memberi sinyal objek pagar yang dipantau. Ketika CPU memberi sinyal objek pagar yang dipantau, kernel grafis memperbarui lokasi memori pagar dengan nilai yang disinyalir. Nilai ini menjadi segera terlihat oleh pembaca mode pengguna dan segera tidak menunggu waktu tunggu yang terpenuhi.

CPU tunggu

Panggilan balik WaitForSynchronizationObjectFromCpuCb ditambahkan untuk memungkinkan CPU menunggu pada objek pagar yang dipantau. Tersedia dua bentuk operasi tunggu. Dalam bentuk pertama, WaitForSynchronizationObjectFromCpuCb memblokir hingga penantian terpenuhi. Dalam bentuk kedua, WaitForSynchronizationObjectFromCpuCb menangani peristiwa CPU yang disinyalir setelah kondisi tunggu terpenuhi.