gpt4 book ai didi

memory-management - 有人能帮我理解 VkPhysicalDeviceMemoryProperties 吗?

转载 作者:行者123 更新时间:2023-12-04 00:51:49 24 4
gpt4 key购买 nike

我想弄清楚,但我有点卡住了。

类型和堆的关联方式很简单,虽然有点奇怪。 (为什么不直接给 VkMemoryHeap 一个 VkMemoryType 成员(member)?)

我想我明白什么了VkMemoryPropertyFlags意思是,它们看起来相当简单。

但是 VkMemoryHeap.flags 是怎么回事?成员?它显然只有一个非零有效值,VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT ,虽然这本身不会太奇怪,但还有一个 VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT这可能存在于堆的内存类型上。
VkMemoryHeap.flags有什么用成员的意思以及它与 VkMemoryType.flags 有何关系成员?

最佳答案

在内存方面,Vulkan 识别出两个不同的概念。有设备可以与之通信的实际物理 RAM 部分。然后有一些方法可以从这些 RAM 池之一分配内存。
堆代表一块特定的 RAM。 VkMemoryHeap是描述设备可以与之通信的可用 RAM 堆之一的对象。定义特定堆的东西确实不多。只有两个:该 RAM 存储的字节数以及存储相对于 Vulkan 设备的位置(本地与非本地)。
内存类型是从特定堆分配内存的一种特殊方式。 VkMemoryType是描述分配内存的特定方式的对象。关于如何从堆分配内存,还有更多描述性标志。
对于更具体的示例,请考虑具有独立 GPU 的标准 PC 设置。该设备有自己的本地 RAM,但独立 GPU 也可以访问 CPU 内存。所以一个 Vulkan 设备将有两个堆:一个是本地的,另一个是非本地的。
但是,通常会有两种以上的内存类型。您通常有一种表示本地内存的内存类型,它没有 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT放。这意味着你不能映射内存;您只能通过其他内存类型(或渲染操作或其他方式)的传输操作来访问它。
但是您通常会有两种内存类型,它们都使用相同的非本地堆。他们都是 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ,从而允许映射。但是,其中之一可能具有 VK_MEMORY_PROPERTY_HOST_CACHED_BIT标志设置,而另一个将是 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT .这允许您选择是要缓存 CPU 访问(因此需要显式刷新修改的内存范围)还是未缓存的 CPU 访问。
但是虽然它们是两种不同的内存类型,但它们都从同一个堆中分配。这就是为什么VkMemoryType有一个索引,指的是它从中分配内存的堆。

Only thing I'm not getting is how the two DEVICE_LOCAL flags interact.


你看规范了吗?它并没有完全隐藏它是如何工作的:

if propertyFlags has the VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT bit set, memory allocated with this type is the most efficient for device access. This property will only be set for memory types belonging to heaps with the VK_MEMORY_HEAP_DEVICE_LOCAL_BIT set.

Is it saying that if the memory is local then all types corresponding to that memory are local, or that they can be local?


您似乎试图将错误的含义强加给这些事情。只需看看规范所说的内容,并从表面上看。 PROPERTY_DEVICE_LOCAL表示将实现最佳设备访问性能的内存类型。这与 MEMORY_DEVICE_LOCAL 之间的唯一联系是 PROPERTY_DEVICE_LOCAL 的内存类型只会与使用 MEMORY_DEVICE_LOCAL 的内存堆相关联.
这是这里唯一相关的含义。
如果您想要一个内存堆何时是设备本地的示例,但具有不是本地设备的内存类型,请考虑一个没有自己内存的 GPU。只有一个堆,因此是 MEMORY_DEVICE_LOCAL .
但是,以使其主机可见的方式从该池分配内存可能会降低设备访问该内存的性能。因此, for such hardware ,同一堆的主机可见内存类型将不会使用 PROPERTY_DEVICE_LOCAL .
再说一次, other hardware不会因为使内存主机可见而损失性能。所以它们只有一种内存类型,它具有所有可用的属性。对于英特尔来说,他们的片上 GPU 显然可以访问某种级别的 CPU 缓存。

关于memory-management - 有人能帮我理解 VkPhysicalDeviceMemoryProperties 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com