我应该使用HOST_VISIBLE_BIT |同步对内存的访问HOST_COHERENT_BIT标志?

时间:2018-02-07 15:26:21

标签: vulkan

换句话说,当我将GPU映射到主机并写入内存时,GPU是否可以读取内存?

2 个答案:

答案 0 :(得分:2)

连贯内存只是意味着您无需使用vkInvalidateMappedMemoryRangesvkFlushMappedMemoryRanges手动管理CPU缓存。您仍然需要使用同步来确保来自CPU和GPU的读取和写入顺序正确,并且您需要GPU端的内存屏障来管理GPU缓存(使GPU写入对GPU读取可见,并使GPU写入可用CPU读取)。

答案 1 :(得分:2)

Vulkan的内存模型中“可见性”和“可用性”之间存在区别。如果要访问值,则需要 both

Coherency是关于“可见性”的。但是你仍然需要可用性。 vkFlushMappedMemoryRanges表示您不需要vkInvalidateMappedMemoryRangesvkFlushMappedMemoryRanges。对于CPU写入,可见性需要HOST_COHERENTvkFlushMappedMemoryRanges有效提供),但仅此一项不足以提供可用性:

  

pMemoryRanges通过VK_ACCESS_HOST_WRITE_BIT访问类型的可用性操作,保证主机对vkCmdWaitEvents 描述的内存范围的写入可供设备访问

“可用性操作”部分链接到“执行和内存依赖性”的Vulkan部分。因此,即使使用相干映射,您仍然需要在写入该内存的主机与读取它的GPU操作之间存在依赖关系。这可以通过一个事件来处理;主机在写入内存后设置事件,读取内存的命令缓冲区操作首先为该事件发出{{1}}。而且您需要设置适当的内存屏障和源/目标阶段。

你必须这样做,即使 CPU在使用它的命令缓冲区提交到队列之前设置了该事件。内存屏障将确保清除任何可能干扰读取CPU数据的GPU缓存。

简而言之,就Vulkan而言,CPU写入,相干与否,与GPU写入没有区别。 总是需要一个障碍来进行写后读写工作。