multithreading - 如何同步 `vkMapMemory` ?

标签 multithreading vulkan

vkMapMemory状态:

vkMapMemory does not check whether the device memory is currently in use before returning the host-accessible pointer. The application must guarantee that any previously submitted command that writes to this range has completed before the host reads from or writes to that range, and that any previously submitted command that reads from that range has completed before the host writes to that region



它链接到 this site可悲的是,它似乎还不存在。我想知道我将如何同步这个?

基本上我需要担心两件事
  • 只有 1 个线程同时访问相同的范围
  • Gpu 当前未尝试读取范围

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

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

    这就是你要同步的方式vkMapMemory或者有其他方法可以做到这一点?

    最佳答案

    gpu 将尝试访问映射内存的唯一时间是在提交访问该内存的命令缓冲区时。该内存将一直使用,直到关联的 vkFence已发出信号。

    一个完全通用的解决方案是跟踪 gpu 的每个内存访问,并用一个开始/结束对包围每个 CPU 映射的内存访问,该对将在适当的栅栏上等待并根据需要调用刷新/无效。这是大量的状态跟踪和过多的潜在阻塞调用。

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

    我希望你能看到正在出现的模式。只使用几个映射的环形缓冲区,并非常注意 gpu 何时使用它们,然后你只需要为每个环形缓冲区保留一个 vkFence+offset+size 的小数组,以确保不会发生数据危险。

    关于multithreading - 如何同步 `vkMapMemory` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38845473/

    相关文章:

    .net - 从 CD/DVD 读取速度非常慢,枚举/线程

    c++ - Vulkan:延迟分配内存?

    java - 检查java中类的执行是否结束

    java - Spring + Hibernate + Redis 的分布式锁

    ios - 线程和 isExecuting 变量

    graphics - 为什么单个深度缓冲区足以满足这个 vulkan 交换链渲染循环?

    vulkan - 退化三角形片段生成

    python - 对于多平台 GPGPU 计算,是否有 OpenCL+PyOpenCL 的替代方案?

    android - 如何将 Android MediaCodec Surface 连接到 Vulkan

    c++ - Boost::Thread 函数导致嵌入式 ARM 上的段错误