如何测量 Metal 上的 GPU 时间?
How do I measure GPU time on Metal?
我想以编程方式我的应用程序的一部分在 macOS 和 iOS 上消耗了多少 GPU 时间。在 OpenGL 和 D3D 上,我可以使用 GPU 计时器查询对象。我进行了搜索,但找不到任何与 Metal 类似的东西。如何在不使用 Instruments 等的情况下测量 Metal 上的 GPU 时间。我正在使用 Objective-C.
您可以将预定和完成的处理程序块添加到命令缓冲区。您可以在每个时间戳中进行比较。有一些延迟,因为块是在 CPU 上执行的,但它应该让你接近。
在 Metal 2.1 中,Metal 现在提供 "events",这更像是其他 API 中的栅栏。 (名称 MTLFence
已用于同步共享堆内容。)特别是,使用 MTLSharedEvent
,您可以对命令进行编码以修改命令缓冲区中特定点的事件值。然后,您可以让事件具有该值,或者请求在事件达到目标值时异步执行块。
这仍然存在延迟等问题(如 Ian Ollmann 所述),但比命令缓冲区调度和完成更细粒度。特别是,正如 Klaas 在评论中提到的那样,正在调度的命令缓冲区并不表示它已经开始执行。您可以在命令序列的开头和结尾放置命令来设置事件的值(使用不同的值),这些命令只会在实际执行时通知。
最后,在 iOS 10.3+ 而不是 macOS 上,MTLCommandBuffer
有两个属性,GPUStartTime
和 GPUEndTime
,您可以使用它们来确定命令的运行时间缓冲区在 GPU 上执行。这不应像其他技术一样受到延迟的影响。
这种方法有几个问题:
1) 你真的想知道大多数时候命令缓冲区内的 GPU 端延迟是多少,而不是到 CPU 的往返。这更好地衡量为 运行ning 20 个着色器实例和 10 个着色器实例之间的时间差。但是,该方法会增加噪声,因为误差是与两次测量相关的误差之和。
2) 等待完成会导致 GPU 在停止执行时降频。当它再次启动时,时钟处于低功耗状态,可能需要很长时间才能再次启动,从而影响您的结果。这可能是一个严重的问题,可能会将您在基准测试中的表现与实际表现低估两倍或更多倍。
3) 如果您按计划启动时钟并在完成时停止,但 GPU 正忙于 运行 其他工作,那么您的运行时间包括花在其他工作负载上的时间。如果 GPU 不忙,则会出现 (2) 中描述的时钟下降问题。
这个问题比我处理过的大多数基准测试案例要难得多,而且我已经做了很多性能测量。
衡量这些事情的最好方法是在设备上使用性能监视器计数器,因为它可以直接衡量正在发生的事情,使用机器自己的时间概念。我赞成那些报告挂钟时间周期的报告,因为这往往会消除时钟摆动,但对此并没有达成普遍共识。 (并非硬件的所有部分 运行 都处于相同的频率等)我会在开发人员工具中寻找基于 PMC 的测量方法,如果您找不到它们,请询问它们。
我想以编程方式我的应用程序的一部分在 macOS 和 iOS 上消耗了多少 GPU 时间。在 OpenGL 和 D3D 上,我可以使用 GPU 计时器查询对象。我进行了搜索,但找不到任何与 Metal 类似的东西。如何在不使用 Instruments 等的情况下测量 Metal 上的 GPU 时间。我正在使用 Objective-C.
您可以将预定和完成的处理程序块添加到命令缓冲区。您可以在每个时间戳中进行比较。有一些延迟,因为块是在 CPU 上执行的,但它应该让你接近。
在 Metal 2.1 中,Metal 现在提供 "events",这更像是其他 API 中的栅栏。 (名称 MTLFence
已用于同步共享堆内容。)特别是,使用 MTLSharedEvent
,您可以对命令进行编码以修改命令缓冲区中特定点的事件值。然后,您可以让事件具有该值,或者请求在事件达到目标值时异步执行块。
这仍然存在延迟等问题(如 Ian Ollmann 所述),但比命令缓冲区调度和完成更细粒度。特别是,正如 Klaas 在评论中提到的那样,正在调度的命令缓冲区并不表示它已经开始执行。您可以在命令序列的开头和结尾放置命令来设置事件的值(使用不同的值),这些命令只会在实际执行时通知。
最后,在 iOS 10.3+ 而不是 macOS 上,MTLCommandBuffer
有两个属性,GPUStartTime
和 GPUEndTime
,您可以使用它们来确定命令的运行时间缓冲区在 GPU 上执行。这不应像其他技术一样受到延迟的影响。
这种方法有几个问题:
1) 你真的想知道大多数时候命令缓冲区内的 GPU 端延迟是多少,而不是到 CPU 的往返。这更好地衡量为 运行ning 20 个着色器实例和 10 个着色器实例之间的时间差。但是,该方法会增加噪声,因为误差是与两次测量相关的误差之和。
2) 等待完成会导致 GPU 在停止执行时降频。当它再次启动时,时钟处于低功耗状态,可能需要很长时间才能再次启动,从而影响您的结果。这可能是一个严重的问题,可能会将您在基准测试中的表现与实际表现低估两倍或更多倍。
3) 如果您按计划启动时钟并在完成时停止,但 GPU 正忙于 运行 其他工作,那么您的运行时间包括花在其他工作负载上的时间。如果 GPU 不忙,则会出现 (2) 中描述的时钟下降问题。
这个问题比我处理过的大多数基准测试案例要难得多,而且我已经做了很多性能测量。
衡量这些事情的最好方法是在设备上使用性能监视器计数器,因为它可以直接衡量正在发生的事情,使用机器自己的时间概念。我赞成那些报告挂钟时间周期的报告,因为这往往会消除时钟摆动,但对此并没有达成普遍共识。 (并非硬件的所有部分 运行 都处于相同的频率等)我会在开发人员工具中寻找基于 PMC 的测量方法,如果您找不到它们,请询问它们。