有人可以帮我理解VkPhysicalDeviceMemoryProperties吗?

时间:2016-04-05 20:32:28

标签: memory-management vulkan

我试图解决这个问题,但我有点陷入困境。

类型和堆的关联方式很简单,如果有点奇怪的话。 (为什么不给VkMemoryHeap成员VkMemoryType

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

但与VkMemoryHeap.flags会员有什么关系?它显然只有一个非零有效值VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,虽然它本身并不太奇怪,但也有一个VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT可能出现在堆的内存类型上。

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

1 个答案:

答案 0 :(得分:14)

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有一个索引引用它所分配的内存堆的原因。

  

我唯一没有得到的是两个DEVICE_LOCAL标志如何相互作用。

您是否看过规格?它并不完全隐藏它的工作原理:

  

如果propertyFlags设置了VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT位,则使用此类型分配的内存对设备访问最有效。仅对属于具有VK_MEMORY_HEAP_DEVICE_LOCAL_BIT集合的堆的内存类型设置此属性。

     

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

你似乎试图对这些事情强加错误的含义。只需看看规范所说的内容,并将其视为面值。

PROPERTY_DEVICE_LOCAL表示将实现最佳设备访问性能的内存类型。此MEMORY_DEVICE_LOCALPROPERTY_DEVICE_LOCAL之间的唯一连接是MEMORY_DEVICE_LOCAL的内存类型只与使用MEMORY_DEVICE_LOCAL的内存堆相关联。

这是这里唯一的相关含义。

如果你想要一个关于内存堆何时是设备本地,但内存类型不是内存类的例子,可以考虑一个没有自己内存的GPU。只有一个堆,因此PROPERTY_DEVICE_LOCAL

但是,以使主机可见的方式从该池分配内存可能会降低设备对该内存的访问性能。因此,for such hardware,同一堆的主机可见内存类型将不会使用 tag {{44}} {{55}}

So, basically I'm making smth like multicolor text area and fill with different colors input data. For example, user entered words: one, two, three.

And I split <code> tag value by comma, then wrap all of them and set some color:

<code>
<span style="color: green">one</span>,
<span style="color: yellow">two</span>,
<span style="color: red">three</span>
</code>

I'm just listening for changes and input newly wrapped words with appropriate colors. But unfortunately I faced with really strange behavior: after I've inserted this formatted text, caret moved before the last <span>. If I'm editing, for example, word two, then caret will move to before <span ...>one</span>

Does anyone can tell why <code> has such strange behavior and how better to make a work-around?...