Bagikan melalui


Pengoptimalan UMA: Tekstur yang Dapat Diakses CPU dan Swizzle Standar

GPU Unified Memory Architecture (UMA) menawarkan beberapa keuntungan efisiensi daripada GPU diskrit, terutama saat mengoptimalkan perangkat seluler. Memberikan sumber daya akses CPU ketika GPU adalah UMA dapat mengurangi jumlah penyalinan yang terjadi antara CPU dan GPU. Meskipun kami tidak merekomendasikan aplikasi secara membabi buta memberikan akses CPU ke semua sumber daya pada desain UMA, ada peluang untuk meningkatkan efisiensi dengan memberikan akses CPU sumber daya yang tepat. Tidak seperti GPU diskrit, CPU secara teknis dapat memiliki penunjuk ke semua sumber daya yang dapat diakses GPU.

Gambaran umum tekstur yang dapat diakses CPU

Tekstur CPU yang dapat diakses, dalam alur grafis, adalah fitur arsitektur UMA, memungkinkan CPU membaca dan menulis akses ke tekstur. Pada GPU diskrit yang lebih umum, CPU tidak memiliki akses ke tekstur dalam alur grafis.

Saran praktik terbaik umum untuk tekstur adalah mengakomodasi GPU diskrit, yang biasanya melibatkan mengikuti proses dalam Mengunggah Data Tekstur Melalui Buffer, dirangkum sebagai:

  • Tidak memiliki akses CPU untuk sebagian besar tekstur.
  • Mengatur tata letak tekstur ke D3D12_TEXTURE_LAYOUT_UNKNOWN.
  • Mengunggah tekstur ke GPU dengan CopyTextureRegion.

Namun, untuk kasus tertentu, CPU dan GPU dapat sering berinteraksi pada data yang sama, sehingga tekstur pemetaan menjadi berguna untuk menghemat daya, atau untuk mempercepat desain tertentu pada adaptor atau arsitektur tertentu. Aplikasi harus mendeteksi kasus-kasus ini dan mengoptimalkan salinan yang tidak perlu. Dalam hal ini, untuk performa terbaik, pertimbangkan hal berikut:

  • Hanya mulai menghibur performa tekstur pemetaan yang lebih baik ketika D3D12_FEATURE_DATA_ARCHITECTURE::UMA ADALAH TRUE. Kemudian perhatikan CacheCoherentUMA jika memutuskan properti cache CPU mana yang akan dipilih pada timbunan.

  • Memanfaatkan akses CPU untuk tekstur lebih rumit daripada untuk buffer. Tata letak tekstur yang paling efisien untuk GPU jarang row_major. Bahkan, beberapa GPU hanya dapat mendukung tekstur row_major saat menyalin data tekstur.

  • GPU UMA harus secara universal mendapat manfaat dari pengoptimalan sederhana untuk mengurangi waktu beban tingkat. Setelah mengenali UMA, aplikasi dapat mengoptimalkan CopyTextureRegion awal untuk mengisi tekstur yang tidak akan dimodifikasi oleh GPU. Alih-alih membuat tekstur dalam tumpukan dengan D3D12_HEAP_TYPE_DEFAULT, dan marshalling data tekstur melalui, aplikasi dapat menggunakan WriteToSubresource untuk menghindari pemahaman tata letak tekstur yang sebenarnya.

  • Di D3D12, tekstur yang dibuat dengan D3D12_TEXTURE_LAYOUT_UNKNOWN dan tidak ada akses CPU adalah yang paling efisien untuk rendering dan pengambilan sampel GPU yang sering. Saat pengujian performa, tekstur tersebut harus dibandingkan dengan D3D12_TEXTURE_LAYOUT_UNKNOWN dengan akses CPU, dan D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE dengan akses CPU, dan D3D12_TEXTURE_LAYOUT_ROW_MAJOR untuk dukungan lintas adaptor.

  • Menggunakan D3D12_TEXTURE_LAYOUT_UNKNOWN dengan akses CPU memungkinkan metode WriteToSubresource, ReadFromSubresource, Map (mendahului akses aplikasi ke pointer), dan Unmap; tetapi dapat mengorbankan efisiensi akses GPU.

  • Menggunakan D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE dengan akses CPU memungkinkan WriteToSubresource, ReadFromSubresource, Map (yang mengembalikan pointer yang valid ke aplikasi), dan Unmap. Ini juga dapat mengorbankan efisiensi akses GPU lebih dari D3D12_TEXTURE_LAYOUT_UNKNOWN dengan akses CPU.

Gambaran Umum Standard Swizzle

D3D12 (dan D3D11.3) memperkenalkan tata letak data multi-dimensi standar. Ini dilakukan untuk memungkinkan beberapa unit pemrosesan beroperasi pada data yang sama tanpa menyalin data atau menggeser data di antara beberapa tata letak. Tata letak standar memungkinkan keuntungan efisiensi melalui efek jaringan dan memungkinkan algoritma untuk membuat pemotongan pendek dengan asumsi pola tertentu.

Untuk deskripsi terperinci tentang tata letak tekstur, lihat D3D12_TEXTURE_LAYOUT.

Perhatikan bahwa swizzle standar ini adalah fitur perangkat keras, dan mungkin tidak didukung oleh semua GPU.

Untuk informasi latar belakang tentang menggelitik, lihat kurva Z-order.

API

Tidak seperti D3D11.3, D3D12 mendukung pemetaan tekstur secara default, sehingga tidak perlu mengkueri D3D12_FEATURE_DATA_D3D12_OPTIONS. Namun D3D12 tidak selalu mendukung swizzle standar - fitur ini perlu dikueri dengan panggilan ke CheckFeatureSupport dan memeriksa bidang StandardSwizzle64KBSupported D3D12_FEATURE_DATA_D3D12_OPTIONS.

Pemetaan tekstur referensi API berikut:

Enums

  • D3D12_TEXTURE_LAYOUT : mengontrol pola berdengung tekstur default dan mengaktifkan dukungan peta pada tekstur yang dapat diakses CPU.

Struktur

  • D3D12_RESOURCE_DESC : menjelaskan sumber daya, seperti tekstur, ini adalah struktur yang banyak digunakan.
  • D3D12_HEAP_DESC : menjelaskan timbunan.

Metode

Sumber daya dan tumpukan induk memiliki persyaratan penyelarasan:

  • D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4MB) untuk tekstur multi-sampel.
  • D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64KB) untuk tekstur sampel tunggal dan buffer.
  • Penyalinan sub sumber daya linier harus diratakan ke D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 byte), dengan pitch baris diselaraskan ke D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 byte).
  • Tampilan buffer konstan harus diratakan ke D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 byte).

Tekstur yang lebih kecil dari 64KB harus diproses melalui CreateCommittedResource.

Dengan tekstur dinamis (tekstur yang mengubah setiap bingkai) CPU akan menulis secara linier ke tumpukan unggahan, diikuti oleh operasi penyalinan GPU.

Biasanya untuk membuat sumber daya dinamis membuat buffer besar dalam timbunan unggahan (lihat Suballocation Within Buffers). Untuk membuat sumber daya penahapan, buat buffer besar dalam timbunan readback. Untuk membuat sumber daya statis default, buat sumber daya yang berdekatan dalam timbunan default. Untuk membuat sumber daya alias default, buat sumber daya yang tumpang tindih dalam timbunan default.

WriteToSubresource dan ReadFromSubresource mengatur ulang data tekstur antara tata letak utama baris dan tata letak sumber daya yang tidak ditentukan. Operasi ini sinkron, sehingga aplikasi harus mengingat penjadwalan CPU. Aplikasi selalu dapat memecah penyalinan ke wilayah yang lebih kecil atau menjadwalkan operasi ini di tugas lain. Sumber daya MSAA dan sumber daya stensil kedalaman dengan tata letak sumber daya buram tidak didukung oleh operasi salinan CPU ini, dan akan menyebabkan kegagalan. Format yang tidak memiliki ukuran elemen power-of-two juga tidak didukung dan juga akan menyebabkan kegagalan. Kode pengembalian memori kehabisan memori dapat terjadi.

Konstanta Inti

ID3D12Heap

Pengikatan Sumber Daya