为什么vkGetPhysicalDeviceMemoryProperties返回多个相同的内存类型?

Frz*_*lms 5 c c++ nvidia vulkan

因此,在初始化期间,我正在Vulkan中收集有关我的设备的一些信息,并找到由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
Run Code Online (Sandbox Code Playgroud)

我坐下来考虑...我应该选择哪一个?除了七种相同的主机本地内存类型,我们还有两种相同的设备内存类型。一定有这个原因,所以我要穿越互联网深入我的冒险之旅!

StackOverflow似乎没有任何相似之处,并且Google从Nvidia返回了一些官方文件,这些文件似乎并未广泛涉及内存类型,因此Vulkan文档可能有很多功能吗?vkGetPhysicalDeviceMemoryPropertiesVkPhysicalDeviceMemoryPropertiesVkMemoryType似乎没有提供关于多种相同内存类型的任何有见地的信息。也许是官方的Vulkan编程指南(顺便说一下,其源代码仍未发布)可以涉及到这个话题吗?不幸的是,我的快速浏览似乎使我进入了第10页,在此之后,似乎没有提及任何有关相同内存类型的内容(但是紧随其后的队列部分确实提及了相同的队列系列)。

为什么我会获得多种内存类型,更重要的是我应该选择哪一种?如果我想像分配队列一样分配多个缓冲区,是否应该交替使用不同的类型?

krO*_*oze 5

就Vulkan规范而言:

  • VkMemoryRequirements::memoryTypeBits 告诉您可以使用的类型
  • 如果内存类型标志相同,则应按性能排序

所以,最好的/预期的做法是:

1)确定您想要/需要的标志。
2)用VkMemoryRequirements::memoryTypeBits
3)允许的类型进一步过滤列表。3)如果还有剩余类型,则选择第一个。(或者从第1步开始使用更少的标志。)

Vulkan不一定知道(并报告)一切。但是,只要您坚持上述条件,就可以了。

什么是你的福尔康内存类型?NVIDIA的文章似乎描述了本地主机类型的情况:

传统上,在OpenGL或DirectX 11中,驱动程序通过在设备内存过剩的情况下在设备本地内存和系统内存之间移动资源来支持应用程序的资源分配,如果用户选择的图像质量设置超出可用数量,则可能会发生这种情况。设备本地内存。

[...]

为了实现这一点,我们将公开其他主机本地内存类型:

  • 缓冲区的内存类型
  • 任何格式的彩色图像的存储类型
  • 系统存储器中每种深度/模板格式的深度/模板图像的单独存储类型

数学似乎可以检查出:1(对于缓冲区)+1(对于图像)+ 5(似乎与该GPU上支持的深度格式相匹配)= 7。

我希望设备本地类型具有相似的原理。规格:一种可能用于深度资源,另一种可能用于图像和缓冲区。

  • 我假设(并希望)他们使用“ memoryTypeBits”将每个图像或缓冲区限制为仅相关的内存类型。这样,正确编写的应用程序应该做正确的事情。 (2认同)