为什么 vkGetPhysicalDeviceMemoryProperties 返回多个相同的内存类型?
Why does vkGetPhysicalDeviceMemoryProperties return multiple identical memory types?
因此,我在初始化期间在 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。
我希望设备本地类型具有类似的理由。推测:可能一个用于深度资源,一个用于图像和缓冲区。
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 类型总是使用其大小存储在内存中吗
- 使用模板类的自定义列表类型中的内存泄漏
- 具有 STL 向量类型成员的类的复制内存
- 内存中的长长类型表示形式
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 为模板参数类型中的新对象分配内存
- 如何创建非 POD 类型的连续内存池?
- 内存效率:模板与基本数据类型
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 避免在禁用复制的 POD 类型的内存上使用"-Wclass-memaccess"
- 为什么 vkGetPhysicalDeviceMemoryProperties 返回多个相同的内存类型?
- 为什么 XOCDE STL 源内存类型定义有 |象征
- 有没有办法区分对象实例使用的内存类型
- 提升共享内存类型
- c++中等效的内存类型是什么?
- Arduino内存类型,学术
- 在内核调用(计算1.1或1.2)期间,仅用于设备计算的CUDA内存(类型)