Memory management 有人能帮我理解VkPhysicalDeviceMemoryProperties吗?

Memory management 有人能帮我理解VkPhysicalDeviceMemoryProperties吗?,memory-management,vulkan,Memory Management,Vulkan,我想弄明白,但我有点卡住了 类型和堆的关联方式很简单,尽管有点奇怪。(为什么不给VkMemoryHeapaVkMemoryTypemember?) 我想我理解所有的VkMemoryPropertyFlags的意思,它们看起来相当简单 但是VkMemoryHeap.flags成员是怎么回事?它显然只有一个非零的有效值,VkMemoryHeapFlagBits.VK\u MEMORY\u HEAP\u DEVICE\u LOCAL\u BIT,尽管这本身并不奇怪,但堆的内存类型上可能存在一个VkMe

我想弄明白,但我有点卡住了

类型和堆的关联方式很简单,尽管有点奇怪。(为什么不给
VkMemoryHeap
a
VkMemoryType
member?)

我想我理解所有的
VkMemoryPropertyFlags
的意思,它们看起来相当简单

但是
VkMemoryHeap.flags
成员是怎么回事?它显然只有一个非零的有效值,
VkMemoryHeapFlagBits.VK\u MEMORY\u HEAP\u DEVICE\u LOCAL\u BIT
,尽管这本身并不奇怪,但堆的内存类型上可能存在一个
VkMemoryPropertyFlagBits.VK\u MEMORY\u PROPERTY\u DEVICE\u LOCAL\u BIT


VkMemoryHeap.flags
成员的含义是什么,以及它与
VkMemoryType.flags
成员的关系如何?

Vulkan在内存方面认识到两个不同的概念。设备可以与RAM的实际物理部分进行通信。还有一些方法可以从这些RAM池中分配内存

堆表示一段特定的RAM
VkMemoryHeap
是一个对象,用于描述设备可以与之通信的可用RAM堆之一。实际上,定义特定堆的东西并不多。只有两个:RAM存储器的字节数和存储器相对于Vulkan设备的位置(本地与非本地)

内存类型是从特定堆分配内存的一种特殊方法
VkMemoryType
是描述分配内存的特定方式的对象。对于如何从堆中分配内存,还有更多的描述性标志

一个更具体的例子,考虑一个带有离散GPU的标准PC设置。该设备有自己的本地RAM,但离散GPU也可以访问CPU内存。因此,Vulkan设备将有两个堆:一个是本地堆,另一个是非本地堆

但是,通常会有两种以上的内存类型。通常有一种表示本地内存的内存类型,它没有设置
VK\u memory\u属性\u HOST\u VISIBLE\u位。这意味着您无法映射内存;只能通过其他内存类型的传输操作(或渲染操作或其他任何操作)访问它

但通常会有两种内存类型,它们都使用相同的非本地堆。它们都是
VK\u MEMORY\u PROPERTY\u HOST\u VISIBLE\u BIT
,因此允许映射。但是,其中一个可能设置了
VK\u MEMORY\u PROPERTY\u HOST\u CACHED\u BIT
标志,而另一个可能是
VK\u MEMORY\u PROPERTY\u HOST\u COHERENT\u BIT
。这允许您选择是要缓存的CPU访问(因此需要显式刷新修改的内存范围)还是非缓存的CPU访问

但是,虽然它们是两种不同的内存类型,但它们都是从同一堆分配的。这就是为什么
VkMemoryType
有一个索引,该索引引用从中分配内存的堆


我唯一不明白的是这两个
设备\u LOCAL
标志是如何相互作用的

你看过说明书了吗?它并没有完全隐藏它的工作原理:

如果
propertyFlags
设置了
VK\u MEMORY\u PROPERTY\u DEVICE\u LOCAL\u位
位,则使用此类型分配的内存对设备访问最有效。此属性将仅为属于设置了
VK\u memory\u HEAP\u DEVICE\u LOCAL\u位的堆的内存类型设置

它是说如果内存是本地的,那么与该内存对应的所有类型都是本地的,还是说它们可以是本地的

你似乎试图给这些东西强加错误的含义。只需看看说明书上说的话,从表面上看就可以了

PROPERTY\u DEVICE\u LOCAL
表示将实现最佳设备访问性能的内存类型。这与
内存设备本地
之间的唯一联系是,具有
属性设备本地
的内存类型将仅与使用
内存设备本地
的内存堆相关联

这是这里唯一相关的意思

如果你想要一个内存堆是设备本地的例子,但是内存类型不是,那么考虑一个没有它自己内存的GPU。只有一个堆,因此它是

内存\设备\本地

但是,以使主机可见的方式从该池分配内存可能会降低设备访问该内存的性能。因此,同一堆的主机可见内存类型将不会使用
属性\u设备\u本地


同样,使内存主机可见不会降低性能。因此,它们只有一种内存类型,具有所有可用属性。对于英特尔来说,他们的片上GPU显然可以访问某种级别的CPU缓存。

快速跟进,如果堆没有设置
VK\U内存\u堆设备\u本地\u位
标志,那么与之相关的任何内存类型都不能设置
VK\U内存\u属性\u设备\u本地\u位
标志,这样说是否正确?我唯一不明白的是这两个
设备\u LOCAL
标志是如何相互作用的。@AlphaModder:Updated。哎哟,不知怎的错过了。是说如果内存是本地的,那么与该内存对应的所有类型都是本地的,还是说它们可以是本地的?读了这一节后,我有了完全相同的问题,万岁!已经有人问了,也有人回答了!