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

时间:2018-01-13 17:32:40

标签: c++ c nvidia 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

我坐下来思考......我应该选择哪一个?排除七个相同的主机本地内存类型,我们仍然有两个相同的设备内存类型。这一定有一些原因,所以我通过互联网的深处探索我的冒险!

StackOverflow似乎没有类似的东西,谷歌从Nvidia返回一些似乎没有广泛涉及内存类型的官方文档,所以也许Vulkan文档有些多汁? vkGetPhysicalDeviceMemoryPropertiesVkPhysicalDeviceMemoryPropertiesVkMemoryType似乎没有提供有关多个相同内存类型主题的任何有见地的信息。也许official Vulkan programming guide(其源代码仍然没有被发布)可以触及这个主题?不幸的是,似乎我的快速浏览引导我进入第10页及其后的内容似乎没有提及相同的内存类型(但在它提到相同的队列系列之后的队列部分)。

为什么我会获得多种内存类型,更重要的是我应该选择哪种类型?如果我想分配多个缓冲区like you would do with queues

,我应该交替使用不同类型吗?

1 个答案:

答案 0 :(得分:5)

就Vulkan规范而言:

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

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

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

Vulkan不一定知道(和报告)一切。但只要你坚持上述,你应该没事。

What’s your Vulkan Memory Type? NVIDIA文章似乎描述了主机 - 本地类型的情况:

  

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

     

[...]

     

要启用此功能,我们将公开其他主机本地内存类型:

     
      
  • 缓冲区的内存类型
  •   
  • 任何格式的彩色图像的记忆类型
  •   
  • 为系统内存中的每种深度/模板格式分别设置深度/模板图像的内存类型
  •   

数学似乎检查:1(缓冲区)+ 1(图像)+ 5(这似乎匹配此GPU上支持的深度格式)= 7.

我希望设备本地类型有类似的理由。推测:可能是一个用于深度资源,一个用于图像和缓冲区。