代码之家  ›  专栏  ›  技术社区  ›  SurvivalMachine

如何在金属上测量GPU时间?

  •  8
  • SurvivalMachine  · 技术社区  · 7 年前

    我想看 以编程方式 不使用仪器 等等,我用的是Objective-C。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Ian Ollmann    7 年前

    这种方法有几个问题:

    1) 您真的想知道在大多数情况下,命令缓冲区内的GPU端延迟是多少,而不是CPU的往返时间。最好将其测量为运行20个着色器实例和10个着色器实例之间的时间差。然而,这种方法可能会增加噪声,因为误差是与两个测量值相关的误差之和。

    3) 如果您按计划启动时钟,并在完成时停止,但GPU正忙于运行其他工作,那么您所用的时间包括花费在其他工作负载上的时间。如果GPU不忙,则会出现(2)中描述的时钟下降问题。

    这个问题比我处理过的大多数基准测试案例要困难得多,我做了很多性能测量。

        2
  •  4
  •   Ken Thomases    6 年前

    您可以将已调度和已完成的处理程序块添加到命令缓冲区。您可以在每个中获取时间戳并进行比较。因为这些块是在CPU上执行的,所以会有一些延迟,但这应该会让你接近。

    在Metal 2.1中,Metal现在提供了“事件”,这更像是其他API中的围栏。(名称 MTLFence 已用于同步共享堆内容。)特别是 MTLSharedEvent

    这仍然存在延迟等问题(如Ian Ollmann所述),但比命令缓冲区调度和完成更细粒度。特别是,正如克拉斯在评论中提到的那样,正在调度的命令缓冲区并不表示它已经开始执行。您可以在命令序列的开始和结束(使用不同的值)放置命令来设置事件的值,这些命令只会在实际执行时发出通知。

    MTLCommandBuffer GPUStartTime GPUEndTime ,您可以使用它确定在GPU上执行命令缓冲区所需的时间。这不应该像其他技术那样受到延迟的影响。