GPU 上的相干内存是什么?

2024-01-25

我在记忆中不止一次遇到“非连贯”和“连贯”记忆这个术语。

科技论文 https://renderdoc.org/vulkan-in-30-minutes.html与图形编程相关。我一直在寻找简单明了的解释,但发现大部分是“硬核”论文this https://www.ece.ubc.ca/~aamodt/papers/isingh.hpca2013.pdf我很高兴收到外行风格的答案,了解 GPU 架构上的相干内存实际上是什么,以及它与其他(可能不相干)内存类型的比较。


记忆就是记忆。但不同的东西可以访问该内存。 GPU 可以访问内存,CPU 可以访问内存,也许还可以访问其他硬件位,等等。

如果其他人对该内存所做的更改是“一致”的,那么该特定事物就具有对内存的“一致”访问visible给读者。现在,您可能认为这是愚蠢的。毕竟,如果记忆被改变了,怎么可能有人possibly会看不到吗?

简单来说,就是缓存。

事实证明,更换内存的成本很高。所以我们尽一切可能avoid改变记忆,除非我们绝对必须这样做。当您将 CPU 中的单个字节写入内存中的指针时,CPU 尚未写入该字节。或者至少,记忆中没有。它将其写入该内存的本地副本,称为“缓存”。

其原因是,一般来说,应用程序不会写入(或读取)单个字节。他们更有可能以小块的形式写入(和读取)大量字节。因此,如果您要执行昂贵的操作(例如内存加载或存储),则应该加载或存储大块内存。因此,您将对内存块进行的所有更改存储在缓存中,然后在将来的某个时刻将该缓存块写入实际内存。

但是,如果您有两个使用相同内存的独立设备,则需要某种方法来确保一个设备的写入对其他设备可见。大多数 GPU 无法读取 CPU 缓存。大多数 CPU 语言都没有语言级支持来表示“嘿,我写到内存中的东西?我真的是说你现在就把它写到内存中。”因此,您通常需要一些东西来确保更改的可见性。

在 Vulkan 中,内存标记为VK_MEMORY_PROPERTY_HOST_COHERENT_BIT意味着,如果您读/写该内存(通过映射指针,因为这是 Vulkan 让您直接写入内存的唯一方式),您don't需要使用函数vkInvalidateMappedMemoryRanges/vkFlushMappedMemoryRanges以确保 CPU/GPU 可以看到这些更改。任何更改的可见性都得到双向保证。如果该标志在内存上不可用,则必须使用上述函数来确保要访问的特定数据区域的一致性。

对于相干内存,硬件方面会发生以下两件事之一。 CPU 对内存的访问不会缓存在任何 CPU 的缓存中,或者 GPU 可以直接访问 CPU 的缓存(可能是因为与 CPU 位于同一芯片上)。您通常可以看出后者正在发生,因为 Vulkan 的片上 GPU 实现并不费心提供非一致性内存选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU 上的相干内存是什么? 的相关文章

随机推荐