Metal Resource Synchronization

  • Overview

  • 对齐 data buffer、texture以及其它 cpu 和 gpu share access 的资源内容

    Overview

    默认情况下,metal track MTLDevice 创建的资源(详见Resource Fundamentals)的write hazard 和同步,并直接将其绑定到 pipeline 上。然而,metal 默认情况下不 track 从 MTLHeap 分配的资源(详见Memory Heaps)。

    注意:你也可以从 Metal Device 创建一个资源,并将其设置为 MTLHazardTrackingModeUntracked。也可以从 Metal Heap 创建一个资源,并将其设置为 MTLHazardTrackingModeTracked。

    如果 metal 不 track 的话,需要在 app 中手动同步这些资源。可以通过以下机制来同步资源,它们是按范围升序排列的。

    • Memory barriers:强制一个 pass (比如 render or compute pass)中后面的command 等待前面的command 用完 memory。可以将memory barrier的范围限定在一个buffer、texture、render attachment或者 a combination
    • Memory fences: MTLFence 负责一个command buffer 的不同 pass 之间的一个或者多个 resource 的同步。fence 用于指定同一个 commandbuffer 中 inter-pass resource 的dependencies。
    • Metal events: MTLEvent 负责一个 MTLDevice 中一个或者多个 resource 的同步问题。你可以让 GPU 停止等待其他command signal an event,详见Synchronizing Events Within a Single Device(看上去是解决不同command queue之间的同步)
    • Metal shared events: MTLSharedEvent 负责不同 Metal device instance 或者 CPU 之间一个或者多个 resource 的同步问题。Share event 和普通的 event 类似,但是范围更大,可以覆盖到多个 GPU 以及 CPU。详见Synchronizing Events Between a GPU and the CPUSynchronizing Events Across Multiple Devices or Processes

    注意:为了更好的性能,使用尽可能小范围的同步机制

    本节教程就到此结束,希望大家继续阅读我之后的教程。

    谢谢大家,再见!


    原创技术文章,撰写不易,转载请注明出处:电子设备中的画家|王烁 于 2022 年 4 月 28 日发表,原文链接(http://geekfaner.com/shineengine/blog60_MetalResourceSynchronization.html)