如何同步`vkMapMemory`?

时间:2016-08-09 08:16:59

标签: multithreading vulkan

vkMapMemory州:

  

vkMapMemory在返回主机可访问指针之前不检查设备内存当前是否正在使用。应用程序必须保证在主机读取或写入该范围之前已完成写入此范围的任何先前提交的命令,并且在主机写入该区域之前已完成从该范围读取的任何先前提交的命令

它链接到this site,但遗憾的是它似乎尚不存在。我想知道如何同步这个?

基本上我需要担心两件事

  • 只有1个线程同时访问相同的范围
  • Gpu目前没有尝试阅读范围

我看到同步的唯一真正方法是使用线程安全列表。每次要写入/读取该缓冲区时,都必须添加当前尝试读取或写入该线程安全列表的内存范围。

这意味着当您想要访问该缓冲区时,您需要锁定该列表并搜索您尝试访问的范围。

你是如何同步vkMapMemory还是有其他方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

gpu尝试访问映射内存的唯一时间是提交访问该内存的命令缓冲区。

表示相关的vkFence将被使用

一个完全通用的解决方案是跟踪gpu的每个内存访问,并用开始/结束对围绕每个CPU映射的内存访问,该开始/结束对将在适当的围栏上等待并根据需要调用flush / invalidate。这是很多状态跟踪和大量可能阻塞的呼叫。

但是对于持久性网格/纹理数据,您只需要将内存写入临时缓冲区,然后复制到设备本地非主机可见缓冲区。你不应该经常需要这样一个围栏来跟踪它的副本是否在飞行中就足够了。或者对于仅需要存在于单个帧(每个对象变换)的数据,您可以使用环形缓冲区。回读GPU遮挡测试或计算结果,可以使用环形缓冲区。

我希望你能看到这种模式的出现。只使用一些映射的环形缓冲区,并且非常清楚它们何时被gpu使用,然后你只需要为每个环形缓冲区保留一小部分vkFence + offset + size,以确保不会发生数据危害。