我们一直在将一些CPU管道移植到Metal上,以成功加快一些最慢的部分的速度。但是,由于它只是其中的一部分,因此我们正在将数据来回传输到GPU,我想知道这实际上需要多少时间。
使用XCode中的帧捕获,它告诉我内核每个大约花费5-20毫秒,总共149.5毫秒(全部编码在同一命令缓冲区中)。
使用乐器,我看到一些完全不同的数字:
整个事情操作需要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的数据。
问题