Jadi, saya mengumpulkan beberapa info tentang perangkat saya di Vulkan selama inisialisasi dan menemukan kumpulan jenis memori unik (atau lebih tepatnya, sangat mirip) yang dikembalikan oleh vkGetPhysicalDeviceMemoryProperties:

Device Name: GeForce GTX 1060 3GB
Device ID: 7170
Device Type: 2
Device Vendor ID: 4318
Device API Version: 4194369 (1.0.65)
Device Driver Version: 1636843520 (390.65)
Device Heaps:
    0 -> Size: 3133145088 Flags: 1
    1 -> Size: 8523874304 Flags: 0
Device Memory:
    0 -> Index: 1 Flags: 0
    1 -> Index: 1 Flags: 0
    2 -> Index: 1 Flags: 0
    3 -> Index: 1 Flags: 0
    4 -> Index: 1 Flags: 0
    5 -> Index: 1 Flags: 0
    6 -> Index: 1 Flags: 0
    7 -> Index: 0 Flags: 1
    8 -> Index: 0 Flags: 1
    9 -> Index: 1 Flags: 6
    10 -> Index: 1 Flags: 14

Saya duduk dan merenungkan ... mana yang harus saya pilih? Tidak termasuk tujuh jenis memori lokal host yang identik, kami masih memiliki dua jenis memori perangkat yang identik. Pasti ada beberapa alasan untuk ini, jadi saya memulai petualangan saya melalui kedalaman internet!

StackOverflow tampaknya tidak memiliki sesuatu yang serupa, dan Google mengembalikan beberapa dokumen resmi dari Nvidia yang tampaknya tidak menyentuh jenis memori secara ekstensif, jadi mungkin dokumentasi Vulkan memiliki sesuatu yang menarik? vkGetPhysicalDeviceMemoryProperties, VkPhysicalDeviceMemoryProperties dan VkMemoryType tampaknya tidak menawarkan informasi mendalam tentang topik beberapa jenis memori yang identik. Mungkin panduan pemrograman resmi Vulkan (yang kode sumbernya masih belum dipublikasikan) dapat menyentuh ini tema? Sayangnya, tampaknya pandangan sekilas saya telah membawa saya ke halaman 10 dan seterusnya yang sepertinya tidak menyebutkan apa pun tentang jenis memori yang identik (tetapi bagian antrian tepat setelah itu menyebutkan tentang keluarga antrian yang identik).

Mengapa saya mendapatkan beberapa jenis memori, dan yang lebih penting yang mana yang harus saya pilih? Haruskah saya mengganti jenis yang berbeda jika saya ingin mengalokasikan beberapa buffer seperti yang akan Anda lakukan dengan antrian?

8
Frzn Flms 13 Januari 2018, 20:32

1 menjawab

Jawaban Terbaik

Sejauh menyangkut spesifikasi Vulkan:

  • VkMemoryRequirements::memoryTypeBits memberi tahu Anda jenis mana yang dapat Anda gunakan
  • dalam hal flag jenis memori yang sama, mereka harus diurutkan berdasarkan kinerja

Jadi, praktik terbaik/yang diharapkan adalah:

1) Tentukan bendera mana yang Anda inginkan/butuhkan.
2) Filter lebih lanjut daftar dengan jenis yang diizinkan oleh VkMemoryRequirements::memoryTypeBits
3) Jika ada tipe yang tersisa, pilih yang pertama. (Atau mulai dari langkah 1 dengan lebih sedikit flag.)

Vulkan tidak selalu mengetahui (dan melaporkan) segalanya. Tapi selama Anda tetap berpegang pada di atas Anda harus baik-baik saja.

Apa Jenis Memori Vulkan Anda? NVIDIA artikel tampaknya menjelaskan apa yang terjadi untuk tipe Host-lokal:

Di OpenGL atau DirectX 11, driver secara tradisional telah mendukung alokasi sumber daya aplikasi dengan memindahkan sumber daya antara perangkat lokal dan memori sistem jika terjadi kelebihan langganan memori perangkat, yang dapat terjadi jika pengguna mungkin memilih pengaturan kualitas gambar yang melebihi jumlah yang tersedia. memori lokal perangkat.

[...]

Untuk mengaktifkan ini, kami mengekspos jenis memori host-lokal tambahan:

  • Jenis memori untuk buffer
  • Jenis memori untuk gambar berwarna dalam format apa pun
  • Pisahkan jenis memori untuk gambar kedalaman/stensil untuk setiap format kedalaman/stensil dalam memori sistem

Matematika tampaknya memeriksa: 1 (untuk buffer) + 1 (untuk gambar) + 5 (yang tampaknya cocok dengan format kedalaman yang didukung pada GPU ini) = 7.

Saya mengharapkan alasan yang sama untuk jenis perangkat lokal. SPEKULASI: Mungkin satu untuk sumber daya kedalaman dan satu untuk gambar dan buffer.

6
krOoze 13 Januari 2018, 21:05