首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测量GPU在金属上的时间?

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

Stack Overflow用户
提问于 2017-07-11 13:05:59
回答 3查看 1.7K关注 0票数 8

我希望看到programmatically,我的应用程序的一部分在macOS和iOS上消耗了多少GPU时间。在OpenGL和D3D上,我可以使用GPU计时器查询对象。我搜索了金属,却找不到类似的东西。如何在金属上不使用仪器、等测量GPU时间?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-12 00:05:11

可以向命令缓冲区中添加计划好的和已完成的处理程序块。您可以在每个时间戳和比较。有一些延迟,因为这些块是在CPU上执行的,但是它应该会使您接近。

现在,Metal2.1提供了“事件”,更像是其他API中的栅栏。(名称MTLFence已经用于同步共享堆内容。)特别是,使用MTLSharedEvent,您可以对命令进行编码,以便在命令缓冲区中的特定点修改事件的值。然后,您可以让事件具有该值,也可以在事件到达目标值时请求异步执行块。

这仍然存在延迟等问题(正如Ian所描述的),但它比命令缓冲区调度和完成更细粒度。特别是,Klaas在注释中提到,正在调度的命令缓冲区并不表示它已开始执行。您可以将命令放在开头设置事件的值,在命令序列的末尾设置事件的值(具有不同的值),这些命令只在实际执行时通知。

最后,在iOS 10.3+而不是macOS上,MTLCommandBuffer有两个属性,GPUStartTimeGPUEndTime,您可以用它们来确定命令缓冲区在GPU上执行所需的时间。这不应以与其他技术相同的方式受到延迟的影响。

票数 4
EN

Stack Overflow用户

发布于 2017-08-15 22:26:21

这种方法有几个问题:

1)您确实想知道命令缓冲区中的GPU侧延迟是什么,而不是往返CPU。这是更好的衡量时间之间的时间差异运行20个实例的着色器和10个实例的着色器。但是,这种方法可以增加噪声,因为误差是与两个度量相关联的误差之和。

2)等待完成会导致GPU在停止执行时按下时钟。当它再次启动时,时钟处于低功耗状态,可能需要很长一段时间才能再次出现,扭曲您的结果。这可能是一个严重的问题,并可能低估您的性能在基准和实际的两倍或更多的因素。

3)如果您按计划启动时钟,但GPU正在忙着运行其他工作,则您所花费的时间包括用于其他工作负载的时间。如果GPU不忙,那么您将得到(2)中描述的时钟下降问题。

这个问题要比我所用过的大多数基准测试案例更难解决,而且我做了很多性能度量。

衡量这些事情的最好方法是在设备性能监视器计数器上使用,因为它是对正在发生的事情的直接测量,使用机器自己的时间概念。我喜欢那些报告周期超过了时钟时间的人,因为这往往会清除掉时钟旋转,但在这方面还没有达成一致意见。(并非硬件的所有部分都以相同的频率运行,等等)我会在开发工具上寻找基于PMCs的度量方法,如果您找不到它们,就询问它们。

票数 5
EN

Stack Overflow用户

发布于 2022-08-29 20:03:38

作为肯上述评论的补充,GPUStartTimeGPUEndTime现在也可以在macOS (10.15+):https://developer.apple.com/documentation/metal/mtlcommandbuffer/1639926-gpuendtime?language=objc上找到

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45035470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档