我应该使用 HOST_VISIBLE_BIT 同步对内存的访问吗? HOST_COHERENT_BIT 旗帜?
Should I syncronize an access to a memory with HOST_VISIBLE_BIT | HOST_COHERENT_BIT flags?
换句话说,当我将内存映射到主机并写入内存时,GPU 会读取内存吗?
一致性内存意味着您不需要手动管理 vkInvalidateMappedMemoryRanges
和 vkFlushMappedMemoryRanges
的 CPU 缓存。您仍然需要使用同步来确保从 CPU 和 GPU 的读取和写入以正确的顺序发生,并且您需要 GPU 端的内存屏障来管理 GPU 缓存(使 CPU 写入对GPU 读取,并使 GPU 写入可用于 CPU 读取)。
在 Vulkan 的内存模型中,“可见性”和“可用性”是有区别的。如果你想访问一个值,你需要两者。
一致性是关于“可见性”的。但是您仍然需要可用性。 HOST_COHERENT
表示您不需要 vkFlushMappedMemoryRanges
或 vkInvalidateMappedMemoryRanges
。对于 CPU 写入,可见性需要 vkFlushMappedMemoryRanges
(HOST_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 可访问内存仍然需要某种形式的同步。
换句话说,当我将内存映射到主机并写入内存时,GPU 会读取内存吗?
一致性内存意味着您不需要手动管理 vkInvalidateMappedMemoryRanges
和 vkFlushMappedMemoryRanges
的 CPU 缓存。您仍然需要使用同步来确保从 CPU 和 GPU 的读取和写入以正确的顺序发生,并且您需要 GPU 端的内存屏障来管理 GPU 缓存(使 CPU 写入对GPU 读取,并使 GPU 写入可用于 CPU 读取)。
在 Vulkan 的内存模型中,“可见性”和“可用性”是有区别的。如果你想访问一个值,你需要两者。
一致性是关于“可见性”的。但是您仍然需要可用性。 HOST_COHERENT
表示您不需要 vkFlushMappedMemoryRanges
或 vkInvalidateMappedMemoryRanges
。对于 CPU 写入,可见性需要 vkFlushMappedMemoryRanges
(HOST_COHERENT
有效提供),但仅此一点不足以实现可用性:
vkFlushMappedMemoryRanges
guarantees that host writes to the memory ranges described bypMemoryRanges
can be made available to device access, via availability operations from theVK_ACCESS_HOST_WRITE_BIT
access type.
“可用性操作”部分链接到“执行和内存依赖性”的 Vulkan 部分。因此,即使使用连贯映射,您仍然需要在写入该内存的主机和读取它的 GPU 操作之间存在依赖关系。
对于从 CPU 写入数据的 GPU 读取操作,对 vkQueueSubmit
的调用充当对任何 CPU 写入 GPU 可访问内存的主机内存依赖,只要这些写入是在函数调用 之前进行的。
如果您需要更细粒度的写入依赖(例如,您希望 GPU 能够在您写入数据时批量执行某些操作),或者如果您需要读取由GPU,你需要一个明确的依赖。
对于批量GPU读取,这可以通过一个事件来处理;主机在写入内存后设置事件,首先读取内存的命令缓冲区操作为该事件发出vkCmdWaitEvents
。您还需要设置适当的内存屏障和 source/destination 阶段。
对于 CPU 读取 GPU 写入的数据,这可能是事件、时间线信号量或栅栏。
但总的来说,CPU 写入 GPU 可访问内存仍然需要某种形式的同步。