Timbunan bersama
Berbagi berguna untuk arsitektur multi-proses dan multi-adaptor.
Gambaran umum berbagi
Tumpukan bersama memungkinkan dua hal: berbagi data dalam timbunan di satu atau beberapa proses, dan mendahului pilihan tata letak tekstur yang tidak ditentukan untuk sumber daya yang ditempatkan dalam timbunan. Berbagi timbunan di seluruh adaptor juga menghilangkan kebutuhan untuk marshaling CPU data.
Baik timbunan maupun sumber daya yang berkomitmen dapat dibagikan. Berbagi sumber daya yang berkomitmen benar-benar berbagi timbunan implisit bersama dengan deskripsi sumber daya yang diterapkan, sehingga deskripsi sumber daya yang kompatibel dapat dipetakan ke timbunan dari perangkat lain.
Semua metode berulir bebas dan mewarisi semantik D3D11 yang ada dari desain berbagi handel NT.
- ID3D12Device::CreateSharedHandle
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
Berbagi timbunan di seluruh proses
Timbunan bersama ditentukan dengan anggota D3D12_HEAP_FLAG_SHARED enum D3D12_HEAP_FLAGS .
Timbunan bersama tidak didukung pada timbunan yang dapat diakses CPU: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK, dan D3D12_HEAP_TYPE_CUSTOM tanpa D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.
Mencakup pilihan tata letak tekstur yang tidak deterministik dapat secara signifikan merusak skenario penyajian yang ditangguhkan pada beberapa GPU, sehingga bukan perilaku default untuk menempatkan dan menerapkan sumber daya. Rendering yang ditangguhkan terganggu pada beberapa arsitektur GPU karena tata letak tekstur deterministik mengurangi bandwidth memori efektif yang dicapai saat penyajian secara bersamaan ke beberapa tekstur target render dengan format dan ukuran yang sama. Arsitektur GPU berkembang jauh dari memanfaatkan tata letak tekstur non-deterministik untuk mendukung pola swizzle standar dan tata letak standar secara efisien untuk penyajian yang ditangguhkan.
Timbunan bersama juga dilengkapi dengan biaya kecil lainnya:
- Data tumpukan bersama tidak dapat didaur ulang secara fleksibel seperti tumpukan dalam proses karena masalah pengungkapan informasi, sehingga memori fisik lebih sering di-nol.
- Ada overhead CPU tambahan kecil dan peningkatan penggunaan memori sistem selama pembuatan dan penghancuran tumpukan bersama.
Berbagi timbunan di seluruh adaptor
Timbunan bersama di seluruh adaptor ditentukan dengan anggota D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER enum D3D12_HEAP_FLAGS.
Tumpukan bersama adaptor silang memungkinkan beberapa adaptor untuk berbagi data tanpa CPU marshaling data di antara mereka. Meskipun berbagai kemampuan adaptor menentukan seberapa efisien adaptor dapat meneruskan data di antara mereka, hanya memungkinkan salinan GPU meningkatkan bandwidth efektif yang dicapai. Beberapa tata letak tekstur diizinkan pada timbunan adaptor silang untuk mendukung pertukaran data tekstur, bahkan jika tata letak tekstur tersebut tidak didukung. Pembatasan tertentu dapat berlaku untuk tekstur tersebut, seperti hanya mendukung penyalinan.
Berbagi lintas adaptor berfungsi dengan timbunan yang dibuat dengan memanggil ID3D12Device::CreateHeap. Aplikasi Anda kemudian dapat membuat sumber daya melalui CreatePlacedResource. Ini juga diizinkan oleh sumber daya/timbunan yang dibuat oleh CreateCommittedResource tetapi hanya untuk sumber daya D3D12_RESOURCE_DIMENSION_TEXTURE2D baris-utama (lihat D3D12_RESOURCE_DIMENSION). Berbagi lintas adaptor tidak berfungsi dengan CreateReservedResource.
Untuk berbagi lintas adaptor, semua aturan berbagi sumber daya lintas antrean yang biasa masih berlaku. Aplikasi Anda harus mengeluarkan hambatan yang sesuai untuk memastikan sinkronisasi dan koherensi yang tepat antara kedua adaptor. Aplikasi Anda harus menggunakan pagar lintas adaptor untuk mengoordinasikan penjadwalan daftar perintah yang dikirimkan ke beberapa adaptor. Tidak ada mekanisme untuk berbagi sumber daya lintas adaptor di seluruh versi API D3D. Sumber daya bersama lintas adaptor hanya didukung dalam memori sistem. Tumpukan/sumber daya bersama lintas adaptor didukung dalam tumpukan D3D12_HEAP_TYPE_DEFAULT dan tumpukan D3D12_HEAP_TYPE_CUSTOM (dengan kumpulan memori L0, dan properti halaman CPU write-combine). Driver harus yakin bahwa operasi baca/tulis GPU ke tumpukan bersama lintas adaptor berkoheren dengan GPU lain pada sistem. Misalnya, driver mungkin perlu mengecualikan data heap agar tidak berada di cache GPU yang biasanya tidak perlu dibersihkan ketika CPU tidak dapat langsung mengakses data heap.
Aplikasi Anda harus membatasi penggunaan tumpukan adaptor silang hanya untuk skenario yang memerlukan fungsionalitas yang mereka berikan. Timbunan lintas adaptor terletak di D3D12_MEMORY_POOL_L0, yang tidak selalu apa yang disarankan GetCustomHeapProperties. Kumpulan memori tersebut tidak efisien untuk arsitektur adaptor diskrit/NUMA. Dan, tata letak tekstur yang paling efisien tidak selalu tersedia.
Batasan berikut juga berlaku:
- Bendera timbunan yang terkait dengan tingkat timbunan harus D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
- D3D12_HEAP_FLAG_SHARED juga harus diatur.
- Baik D3D12_HEAP_TYPE_DEFAULT harus diatur atau D3D12_HEAP_TYPE_CUSTOM dengan D3D12_MEMORY_POOL_L0 dan D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE harus diatur.
- Hanya sumber daya dengan D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER yang dapat ditempatkan pada tumpukan adaptor silang.
- Sesi yang dilindungi tidak dapat diteruskan ke dalam pembuatan timbunan saat D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER ditentukan
Untuk informasi selengkapnya tentang menggunakan beberapa adaptor, lihat bagian Sistem multi-adaptor.