Bagikan melalui


Pengoptimalan UMA: Tekstur yang Dapat Diakses CPU dan Swizzle Standar

GPU Universal Memory Architecture (UMA) menawarkan beberapa keuntungan efisiensi dibandingkan GPU diskrit, terutama saat mengoptimalkan perangkat seluler. Memberikan akses CPU sumber daya 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 pointer 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 berinteraksi begitu sering 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 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 heap.

  • 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 mendapat manfaat universal dari pengoptimalan sederhana untuk mengurangi waktu pemuatan tingkat. Setelah mengenali UMA, aplikasi dapat mengoptimalkan CopyTextureRegion awal untuk mengisi tekstur yang tidak akan dimodifikasi 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 penyajian 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 (precluding 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 perolehan 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 menggeliat, lihat kurva urutan Z.

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 StandardSwizzle64KBSupporteddari D3D12_FEATURE_DATA_D3D12_OPTIONS.

Pemetaan tekstur referensi API berikut:

Enum

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

Struktur

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 dan buffer sampel tunggal.
  • Penyalinan subresource linear harus diratakan ke D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 byte), dengan pitch baris diratakan 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 linear ke heap unggahan, diikuti oleh operasi salinan 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 tumpukan default.

WriteToSubresource dan ReadFromSubresource mengatur ulang data tekstur antara tata letak utama baris dan tata letak sumber daya yang tidak terdefinisi. 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