Apakah menggunakan banyak peta tekstur buruk untuk caching?

10

Jika saya memiliki banyak tekstur (misalnya 5+ peta) yang terikat ke unit tekstur yang sama, apakah itu berfungsi lebih buruk untuk cache daripada jika saya hanya memiliki 2 atau 3 tekstur?

Felipe Lira
sumber

Jawaban:

16

Hanya menambahkan jawaban imallett , memang benar bahwa meningkatkan jumlah akses ke data tekstur yang berbeda dalam shader akan meningkatkan tekanan pada cache GPU, tetapi ada beberapa faktor lain yang dapat secara signifikan mempengaruhi efeknya. Ini juga mungkin rumit oleh fakta bahwa, seperti cache CPU, mungkin ada beberapa lapisan cache dalam GPU, yaitu. Unit Tekstur <= L0 <= L1 <= ..Memory

Hindari alias -> Gunakan peta MIP

Jika Anda memiliki adegan yang memiliki minifikasi data tekstur, baik itu karena perspektif atau penskalaan sederhana dan Anda tidak menggunakan pemetaan MIP, maka Anda akan mendapatkan alias. Ini tidak hanya akan menghasilkan artefak visual; sangat mungkin menjadi masalah kinerja.

Segera setelah Anda mendapatkan aliasing, akses alamat ke tekstur akan menjadi tidak koheren yang tidak hanya akan meruntuhkan cache tetapi juga memperkenalkan banyak "istirahat halaman" DRAM (lebih tepatnya, pemecah baris) yang bisa mahal. Pemetaan MIP membantu mengurangi inkoherensi.

Kompresi tekstur

Mungkin sedikit opsi yang jelas, tetapi jika Anda dapat menggunakan kompresi tekstur (mis. DXTn | ETC * | PVRTC * | dll.) Menargetkan dari 8bpp ke, katakanlah, 2bpp, Anda dapat sangat meningkatkan efektivitas bandwidth / cache memori dengan faktor 4x hingga 16x. Sekarang saya tidak dapat berbicara untuk semua GPU, tetapi beberapa skema kompresi tekstur (misalnya yang tercantum di atas) sangat mudah untuk didekode dalam perangkat keras, sehingga data dapat tetap terkompresi di seluruh hierarki cache dan hanya akan didekompresi di unit tekstur, sehingga secara efektif mengalikan ukuran cache tersebut.

Ukuran data

Jelas, beberapa data, misalnya target render yang digunakan sebagai data tekstur dalam render berikutnya, tidak dapat menggunakan kompresi tekstur. Kapan pun Anda bisa, gunakan format piksel terkecil yang akan melakukan pekerjaan itu, yaitu, jika 32 / 16bpp (A) RGB akan melakukannya, jangan gunakan format float 4x32!

Akses jarang

Ini agak terkait dengan contoh aliasing di atas, tetapi kami telah melihat kasus di mana target render besar dibuat, tetapi kemudian hanya sampel yang sangat jarang. Garis cache, baik di CPU atau GPU, cukup panjang jadi jika Anda hanya menggunakan satu piksel di setiap baris cache, Anda akan membuang-buang transfer.

Juga, tekstur terkompresi WRT, ini mencapai kompresi dengan berbagi data secara efektif antara wilayah texels lokal. Jika Anda tidak memiliki akses yang koheren, terlepas dari pengurangan jejak memori, kompresi mungkin tidak akan membantu.

Baca Tekstur Bergantung

Tidak terlalu banyak masalah cache (well, kecuali jika akses yang dikomputasi cukup tidak koheren), tetapi akses tekstur yang tidak secara langsung ditentukan oleh koordinat UV yang disediakan dengan simpul mungkin lebih lambat daripada yang secara langsung ditentukan.

Tekstur Ubin / Morton VS Melangkah

Meskipun saya menduga sebagian besar tekstur hari ini akan disimpan dalam urutan ubin atau seperti Morton (alias Twiddled / Swizzled) (atau bahkan kombinasi keduanya), beberapa tekstur mungkin masih dalam urutan garis pindai, yang berarti bahwa rotasi tekstur cenderung menyebabkan sejumlah besar kesalahan cache / page break. Sayangnya, saya tidak benar-benar tahu bagaimana menemukan jika format tertentu diatur sedemikian rupa.

(Untuk bacaan latar belakang, cobalah Blinn's The Truth About Texture Mapping . FWIW, dengan mengambil beberapa langkah lebih jauh mengarah pada penggunaan tekstur Twiddled-order (mis. Morton order) di setidaknya beberapa perangkat keras PC awal ).

Simon F
sumber
8

Jawabannya tergantung pada apa yang Anda maksudkan. Perangkat keras modern (misalnya dengan tekstur tanpa ikatan) benar-benar tidak terlalu peduli berapa banyak tekstur yang "terikat". Pertanyaan sebenarnya adalah berapa banyak yang Anda gunakan .

Tekstur umumnya menyimpan data dengan cara yang ramah cache (kurva Morton, saya percaya). Jika Anda menggunakan lebih banyak tekstur, Anda akan mendapatkan lebih banyak cache cache, karena sekarang tekstur saling bersaing untuk mendapatkan ruang.

Ini benar-benar hanya turun ke heuristik pemrograman shader lama yang terkenal: keran tekstur lambat; jangan gunakan terlalu banyak.

Imallett
sumber