上图总结了我对 memoryHeap 及其由 Vulkan 为给定系统设置生成的 memoryTypes 的理解。感谢@NicolBolas 分享的关于此主题的答案 1 , 2 , 3和@krOoze 的回答4 .
不过,我还有一些悬而未决的问题,我希望得到帮助,我已将它们用红色标出,并在下面根据评论详细说明@NicolBolas。
问题
当只有 4 个 RAM 时,为什么 sysRam 中有 9 个 memoryType? 每种内存类型的物理意义是什么?如何使用每个 这些内存类型?
为什么 GPU RAM 有两种内存类型?这是否意味着每个 GPU内存的内存类型是6144MB/2 = 3072MB?
- 每种内存类型是否有大小限制?如果是,如何发现 他们的极限?
- 为什么 Vulkan 和 cat/proc/meminfo 报告空闲内存 不同?
提前感谢您的帮助。
最佳答案
Why are there 9 memoryType in sysRam when there are only 4x RAMs? What is the physical meaning of each memoryType? How to use each of these memoryType?
Why are there 2 memory types for GPU RAM?
我不知道“4x RAM”是什么意思;我怀疑您是在谈论您的机器中有多少物理内存棒。内存类型(或堆)不关心这些事情。
至于其他,记住 Vulkan 中内存的工作原理始终很重要。堆在某种程度上代表实际的物理 RAM。内存类型表示分配该内存的方式。但是内存的使用有它们自己的内存类型限制。
例如,如果图像具有颜色附件使用参数,则实现可以强制您使用特定的内存类型作为支持该图像的内存。没有颜色附件的图像可以限制为使用其他内存类型,但不是那个。等等。
显然,NVIDIA does this for certain combinations of usage and formats .仅仅查询可用的内存类型不足以了解如何分配内存。您必须弄清楚您将使用哪些缓冲区和图像(包括格式和使用参数)。然后你必须查询实现对它们施加了哪些限制。
您的应用程序必须适应这些限制。
Is there a size limit to each memoryTypes?
有这样的东西是没有意义的。 Memory types define how memory is allocated, not how much storage is available.后者是内存堆的工作。
Why are the free memory reported by Vulkan and cat /proc/meminfo different?
Vulkan 没有报告可用内存的 API,只有总内存。询问可用内存的数量是愚蠢的。内存(或者至少是应用程序中的虚拟页面)由应用程序中的所有线程共享。尤其是 GPU 内存在机器上的所有进程之间共享。当您得到答复时,内存量可能已经改变。因此,当您根据被告知可用的内容分配内存时,它可能不再可用。
最好先分配并在发生分配失败时处理。
您可以询问总内存,以便您可以决定如何分配内存块。但这就是您确定可用和不可用的方式,而不是通过查询尺寸。
关于linux - Vulkan 内存堆及其内存类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51624650/