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

Why does vkGetPhysicalDeviceMemoryProperties return multiple identical memory types?

本文关键字:内存类型 vkGetPhysicalDeviceMemoryProperties 返回 为什么      更新时间:2023-10-16

因此,我在初始化期间在 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文档有一些多汁的东西? vkGetPhysicalDeviceMemoryProperties,VkPhysicalDeviceMemoryProperties和VkMemoryType似乎没有提供有关多种相同内存类型主题的任何有见地的信息。也许官方的 Vulkan 编程指南(顺便说一下,其源代码尚未发布)可以触及这个主题?不幸的是,我的快速浏览似乎将我带到了第 10 页及以后,其中似乎没有提到任何关于相同内存类型的内容(但队列部分紧接着确实提到了相同的队列系列)。

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

就 Vulkan 规范而言:

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

因此,最佳/预期的做法是:

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

Vulkan不一定知道(并报告)一切。但只要你坚持以上应该没问题。

您的 Vulkan 内存类型是什么?NVIDIA 文章似乎描述了主机本地类型正在发生的事情:

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

[...]

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

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

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

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