如何测量Metal

时间:2019-09-06 09:53:03

标签: xcode gpgpu instruments metal

我们一直在将一些CPU管道移植到Metal上,以成功加快一些最慢的部分的速度。但是,由于它只是其中的一部分,因此我们正在将数据来回传输到GPU,我想知道这实际上需要多少时间。

使用XCode中的帧捕获,它告诉我内核每个大约花费5-20毫秒,总共149.5毫秒(全部编码在同一命令缓冲区中)。 XCode performance metrics

使用乐器,我看到一些完全不同的数字: Instruments trace 整个事情操作需要1.62秒(点-代码1)。 MTLTexture replaceRegion占用前180毫秒,随后CPU在MTLCommandBuffer waitUntilCompleted(突出显示的区域)停顿了下660毫秒,然后最后800毫秒在MTLTexture getBytes中耗尽,这最大那个CPU线程。

使用Metal仪器,我得到了一些测量值,“计算命令0”为46毫秒,“命令缓冲区0”为460毫秒,“分页”为210毫秒。但是我看不到这与工作量有什么关系。

我能找到与“ Page off”的解释最接近的东西是

  

纹理页面关闭数据(非AGP)

     

为纹理分页操作传输的字节数。在大多数情况下,纹理不会被分页,而是会被丢弃,因为系统内存中存在备份。通常,当VRAM压力迫使仅在VRAM中具有有效数据的纹理(例如使用glCopyTexImage函数创建的纹理或使用glCopyTexSubImage或glTexSubImage函数修改的纹理)的页面关闭时,纹理页面关闭流量就会发生。

Source: XCode 6 - OpenGL Driver Monitor Parameters

这使我认为这可能是从GPU复制内存的部分,但是没有理由getBytes花费那么长时间。而且我看不到XCode的149.5毫秒应该适合Instruments的数据。

问题

  1. 何时准确传输数据?如果不能从我所做的测量中推断出这一点,我该如何获取这些信息?
  2. GPU代码实际上只需要149.5毫秒来执行,还是XCode对我说谎?如果没有,那么剩余的660-149.5毫秒在哪里使用?

0 个答案:

没有答案