linux - Vulkan 内存堆及其内存类型

标签 linux heap-memory vulkan

enter image description here

上图总结了我对 memoryHeap 及其由 Vulkan 为给定系统设置生成的 memoryTypes 的理解。感谢@NicolBolas 分享的关于此主题的答案 1 , 2 , 3和@krOoze 的回答4 .

不过,我还有一些悬而未决的问题我希望得到帮助,我已将它们用红色标出,并在下面根据评论详细说明@NicolBolas。

问题

  1. 当只有 4 个 RAM 时,为什么 sysRam 中有 9 个 memoryType? 每种内存类型的物理意义是什么?如何使用每个 这些内存类型?

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

  3. 每种内存类型是否有大小限制?如果是,如何发现 他们的极限?
  4. 为什么 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/

相关文章:

c++ - 删除指针数组: _BLOCK_TYPE_IS_VALID

synchronization - Vulkan 中的信号量何时用于在队列操作和主机之间插入依赖关系?

vulkan - Vulkan vkCmdDrawIndexedIndirect 如何为每个内部绘制命令使用不同的纹理

linux - QT_DIR 未找到

linux - 如何增加在linux中运行cppcheck进程的线程数

c - Malloc 在同一个堆位置?

opengl - OpenGL 中的 Vulkan GLSL 着色器

c - lseek读取/proc/pid/mem的偏移量

linux - 使用 grep -v 从制表符分隔文件中删除行

C 中的损坏堆,我不知道为什么