【问题标题】:Transferring memory from GPU to CPU with Vulkan and vkInvalidateMappedMemoryRanges synchronization?使用 Vulkan 和 vkInvalidateMappedMemoryRanges 同步将内存从 GPU 传输到 CPU?
【发布时间】:2020-06-10 16:26:46
【问题描述】:

在 Vulkan 中,当我想将 GPU 的一些内存传输回 CPU 时,我认为最有效的方法是将数据写入具有标志 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT 的内存中。

问题 #1:这个假设正确吗?

(可用内存属性标志的完整列表可以在 Vulkan 的 VkMemoryPropertyFlagBits 文档中找到)

为了获取最新数据,我必须使用vkInvalidateMappedMemoryRanges 使内存无效,对吗?

问题 #2:vkInvalidateMappedMemoryRanges 期间发生了什么?这只是来自某个内部缓存的memcpy,还是可以是一个更长的过程?

问题#3:如果这可能需要更长的时间(即它不是一个简单的memcpy),那么我可能应该有一些可能与它的完成同步,对吧?但是,vkInvalidateMappedMemoryRanges 不提供任何同步参数。实际上,我的问题是:如果我必须同步它,我该如何同步它?

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    问题 #1:这个假设正确吗?

    可能不会,但是否支持替代方案取决于您的平台。对于 GPU->CPU 传输,实际上有三个选项:

    1。 HOST_VISIBLE

    该类型对主机可见并保证是一致的,但不会缓存在主机上。 CPU 读取会非常慢,但如果您只读取少量数据(并且可能比发出 vkInvalidateMappedMemoryRanges() 便宜,并且几乎没有点流数据进入 CPU缓存,如果你从没想过会在 CPU 上再次触摸它)。

    2。主机可见 | HOST_CACHED

    这种类型对主机可见并被缓存,但不保证是一致的(如果您不手动强制一致性,CPU 和 GPU 可能会在同一地址看到不同的东西)。对于这种类型的内存,您必须在 GPU 写入之后和 CPU 读取之前使用vkInvalidateMappedMemoryRanges()(或在另一个方向使用vkFlushMappedRange())以确保一个处理器可以看到另一个处理器写入的内容,否则您可能会读取陈旧的数据。

    在缓存中数据访问将很快,您可以从 CPU 端数据获取技巧(例如显式预加载和缓存预取)中受益,但您会为无效操作付出开销。

    3。主机可见 |主机缓存 | HOST_COHERENT

    最后,您拥有了主机缓存和一致的内存类型,如果您需要在 CPU 上进行高带宽读取,那么这两种方式都可以为您提供最好的选择。硬件自动提供一致性实现,因此无需无效,但不能保证在所有平台上都可用。对于 CPU 上的批量数据读取,我希望这在可用的情况下是最有效的。

    值得注意的是,所有分配都没有“最佳”内存设置。不要将主机缓存或主机一致性内存用于您从未期望传输回 CPU 的内容(内存一致性在功率或内存性能方面并不是免费的)。

    问题 #2:在 vkInvalidateMappedMemoryRanges 期间发生了什么?这只是来自某个内部缓存的 memcpy 还是可能是一个更长的过程?

    如果您有不连贯的记忆,那么它会尽一切努力使它们连贯。通常,这意味着使 CPU 缓存中可能包含数据的陈旧副本的缓存行无效(丢弃),以确保 CPU 的后续读取看到 GPU 实际写入的版本。

    问题 #3:如果这可能需要更长的时间(即它不是一个简单的 memcpy),那么我可能应该有一些可能与它的完成同步,对吧?

    没有。失效是 CPU 端的操作,因此需要 CPU 时间才能完成,并且在操作完成时 CPU 很忙。通常,您可以通过使用连贯记忆来完全避免这样做。

    【讨论】:

    • 这是一个非常有用的答案。谢谢你。还有一个问题:我注意到您在 1. HOST_VISIBLE 下写道,内存保证是连贯的。这是真的吗?这意味着VK_MEMORY_PROPERTY_HOST_VISIBLE_BITVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 具有相同的效果?!
    • 是的 - 如果您查看您在关于标志的问题中链接的页面,则会显示以下文本“对未缓存内存的主机内存访问速度比对缓存内存的访问速度要慢,但是未缓存内存始终是主机一致的。”
    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 2018-10-22
    • 2022-01-26
    • 1970-01-01
    • 2023-02-03
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多