我应该使用 HOST_VISIBLE_BIT 同步对内存的访问吗? HOST_COHERENT_BIT 旗帜?

Should I syncronize an access to a memory with HOST_VISIBLE_BIT | HOST_COHERENT_BIT flags?

换句话说,当我将内存映射到主机并写入内存时,GPU 会读取内存吗?

一致性内存意味着您不需要手动管理 vkInvalidateMappedMemoryRangesvkFlushMappedMemoryRanges 的 CPU 缓存。您仍然需要使用同步来确保从 CPU 和 GPU 的读取和写入以正确的顺序发生,并且您需要 GPU 端的内存屏障来管理 GPU 缓存(使 CPU 写入对GPU 读取,并使 GPU 写入可用于 CPU 读取)。

在 Vulkan 的内存模型中,“可见性”和“可用性”是有区别的。如果你想访问一个值,你需要两者

一致性是关于“可见性”的。但是您仍然需要可用性。 HOST_COHERENT 表示您不需要 vkFlushMappedMemoryRangesvkInvalidateMappedMemoryRanges。对于 CPU 写入,可见性需要 vkFlushMappedMemoryRangesHOST_COHERENT 有效提供),但仅此一点不足以实现可用性:

vkFlushMappedMemoryRanges guarantees that host writes to the memory ranges described by pMemoryRanges can be made available to device access, via availability operations from the VK_ACCESS_HOST_WRITE_BIT access type.

“可用性操作”部分链接到“执行和内存依赖性”的 Vulkan 部分。因此,即使使用连贯映射,您仍然需要在写入该内存的主机和读取它的 GPU 操作之间存在依赖关系。

对于从 CPU 写入数据的 GPU 读取操作,对 vkQueueSubmit 的调用充当对任何 CPU 写入 GPU 可访问内存的主机内存依赖,只要这些写入是在函数调用 之前进行的。

如果您需要更细粒度的写入依赖(例如,您希望 GPU 能够在您写入数据时批量执行某些操作),或者如果您需要读取由GPU,你需要一个明确的依赖。

对于批量GPU读取,这可以通过一个事件来处理;主机在写入内存后设置事件,首先读取内存的命令缓冲区操作为该事件发出vkCmdWaitEvents。您还需要设置适当的内存屏障和 source/destination 阶段。

对于 CPU 读取 GPU 写入的数据,这可能是事件、时间线信号量或栅栏。

但总的来说,CPU 写入 GPU 可访问内存仍然需要某种形式的同步。