代码之家  ›  专栏  ›  技术社区  ›  Sun Bear

Vulkan备忘录及其备忘录类型

  •  1
  • Sun Bear  · 技术社区  · 8 年前

    enter image description here

    上图总结了我对memoryheap以及Vulkan为给定系统设置生成的memorytypes的理解。感谢@nicolbolas分享的关于这个主题的答案。 1 , 2 , 3 以及@krooze的回答 4 .

    不过,我还有一些 悬而未决的问题 那个 我喜欢帮助 我已经指出了 穿红衣服 并根据@nicolbolas的评论在下面详细阐述。

    问题

    1. 为什么只有4x内存时系统内存中有9个内存类型? 每个记忆类型的物理意义是什么?如何使用 这些记忆类型?

    2. 为什么GPU RAM有两种内存类型?这是指每个 GPU RAM的内存类型是6144MB/2=3072MB?

    3. 每个内存类型都有大小限制吗?如果是,如何发现 他们的极限?
    4. 为什么vulkan和cat/proc/meminfo报告了空闲内存? 不同?

    感谢您的帮助。

    3 回复  |  直到 8 年前
        1
  •  1
  •   krOoze    8 年前

    [元问题]为什么x在vulkan?

    因为Vulkan规范允许这样做。REST是实现细节,只有实现者\供应商可以肯定地知道,并且可能取决于他睡眠的好坏。

    1. 为什么只有4x内存时系统内存中有9个内存类型?每个记忆类型的物理意义是什么?如何使用这些memoryType中的每一个?

    在中回答 Why does vkGetPhysicalDeviceMemoryProperties return multiple identical memory types? . 一个用于 VkBuffer S,一个用于 VkImage 每个深度格式(即7)一个。等于9;神秘解决。

    1. 为什么GPU RAM有两种内存类型?这是否意味着GPU RAM的每个内存类型是6144MB/2=3072MB?

    原因可能与1类似。我推测一个是为了 VK缓冲器 S,一个用于 维基马奇 有Nvidia的人可以用 vkGetXMemoryRequirements .

    它不一定意味着RAM/2。这并不是完全不可能的,但如果是这样,那么实现者应该再次公开单独的堆。

    1. 每个内存类型都有大小限制吗?如果是,如何发现它们的极限?

    大致是堆大小。由于碎片化,您可能会明显减少。以及由于其他过程共享相同。您的IMPL还可以为其内部需求分配一些本身。

    当你发现极限时 VK_ERROR_OUT_OF_DEVICE_MEMORY . (btw的工作原理与CPU端相同,在CPU端 bad_alloc )

    单个分配的大小有限制(不建议分配4 GB),分配的计数也有限制( maxMemoryAllocationCount )。

    1. 为什么vulkan和cat/proc/meminfo报告的可用内存不同?

    Afaik Vulkan没有报告空闲内存。这个 VkMemoryHeap 显示 全部的 内存:

    size 是堆中的总内存大小(字节)。

        2
  •  3
  •   marc_s MisterSmith    8 年前

    为什么只有4x内存时系统内存中有9个内存类型?每个记忆类型的物理意义是什么?如何使用这些memoryType中的每一个?

    为什么GPU RAM有两种内存类型?

    我不知道你所说的“4x公羊”是什么意思;我怀疑你说的是你的机器里有多少物理记忆棒。内存类型(或堆)并不关心这些事情。

    至于其他的,记住记忆在瓦肯语中是如何工作的总是很重要的。堆在某种程度上表示实际的物理RAM。内存类型表示分配内存的方式。但是 使用 内存有自己的内存类型限制。

    例如,如果一个图像具有color attachment usage参数,则该实现可以强制您为支持该图像的内存使用特定的内存类型。没有彩色附件的图像可以限制为使用其他内存类型,但不能 那个 一个。等等。

    显然地, NVIDIA does this for certain combinations of usage and formats . 仅仅查询可用的内存类型还不足以知道如何分配内存。您必须弄清楚要使用的缓冲区和图像(包括格式和使用参数)。然后您必须查询实现对它们施加了什么限制。

    您的应用程序必须适应这些限制。

    每个内存类型都有大小限制吗?

    有这样的事情是没有道理的。 Memory types define how memory is allocated , not how much storage is available. 后者是内存堆的工作。

    为什么vulkan和cat/proc/meminfo报告的可用内存不同?

    Vulkan没有报告可用内存的API,只有 全部的 记忆。要求有足够的空闲内存是愚蠢的。内存(或者至少是应用程序中的虚拟页)由应用程序中的所有线程共享。尤其是GPU内存在机器上的所有进程之间共享。当你得到一个答案时,记忆的数量可能已经改变了。所以,当你根据别人告诉你的可用信息来分配内存时,它可能不再可用了。

    最好是先分配,如果发生分配失败,就处理它。

    您可以请求总内存,以便决定如何分配内存块。但这就是如何确定什么是可用的和不可用的,而不是通过查询大小。

        3
  •  2
  •   Jonathan Olson    8 年前

    在你问司机之前,你对Vulkan的记忆类型一无所知。

    我认为你最大的误解是记忆类型是物理上分离的。如图所示,您有两个内存堆,假设0是CPU内存,1是GPU。在这些堆中,您有不同的内存类型。每个内存类型在其自己的堆中占用空间,并可以使用所有堆空间或与其他类型共享。对于每种类型,您都有不同的内部分配方法,具有不同的对齐要求和不同的允许使用。有多个与内存类型相关的查询,包括vkgetBufferMemoryRequirements、vkgetImageMemoryRequirements和其他。这完全取决于你用内存做什么。

    此外,这些内存类型取决于驱动程序,并且会因供应商而异(看起来像当前的Nvidia布局)。