HOST_CACHED_BIT 和 HOST_COHERENT_BIT 是否相互矛盾?

use*_*299 4 vulkan

Vulkan 中有两种类型的内存让我困惑:

  • VK_MEMORY_PROPERTY_HOST_COHERENT_BIT位指示主机缓存管理命令vkFlushMappedMemoryRangesvkInvalidateMappedMemoryRanges不需要分别刷新主机对设备的写入或使设备写入对主机可见。

  • VK_MEMORY_PROPERTY_HOST_CACHED_BIT位表示以此类型分配的内存已缓存在主机上。主机内存对非高速缓存内存的访问比对高速缓存内存的访问慢,但是非高速缓存内存始终与主机一致。

据我了解,主机和设备都可以立即看到对 COHERENT 类型内存的修改,而主机和/或设备可能不会立即看到对 CACHED 类型内存的修改,即使内存无效/刷新需要使缓存失效。

我见过一些实现结合了这两个标志,并且根据 10.2 ,它是有效的组合文档中的设备内存部分。难道不存在矛盾(缓存和连贯)吗?

Nic*_*las 5

缓存/一致性内存实际上意味着 GPU 可以看到 CPU 的缓存。这种情况经常发生在 GPU 和 CPU 位于同一芯片上的架构上。GPU 实际上只是 CPU 芯片上的另一个核心,可以访问 CPU 的核心。

但它也可能发生在其他架构上。一些独立 GPU 提供缓存/一致性内存。事实上,它们中的大多数不提供没有一致性的缓存内存。从架构的角度来看,它代表了 GPU 通过至少部分 CPU 缓存访问数据的某种方式。

关于缓存/一致性内存,您应该记住的关键是:如果该内存池有替代内存类型,那么设备访问该替代内存的速度可能更快。此外,如果存在替代方案,则设备完全有可能无法将某些类型/格式的图像或缓冲区存储在此类存储器类型中。因此,除非您确实需要从 CPU 访问缓存内存,或者设备没有提供替代方案,否则最好避免使用它。