• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS Metal : How to Capture GPU Frame properly?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 12:00:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试通过捕获 GPU 帧来分析 Metal 内核。在具有 Metal runloop 的应用程序中,我会单击调试区域中的“相机按钮”,但是我在每个应用程序生命周期中只分派(dispatch)一次内核,因此我无法单击“相机按钮”(它保持灰色)。

因此,我尝试通过在第一次调用 mQueue.insertDebugCaptureBoundary() 之前设置断点和“捕获 GPU 帧”操作来解决这个问题(参见下面的代码)。

我希望发生的事情类似于 this – 即每个内核函数的执行持续时间概览,其中标明了执行各行内核函数所花费的时间百分比。

实际发生的情况是:我很少得到所描述的预期分析概述。大多数时候(大约 95% 的时间)我没有得到这样的分析概述,而是在我构建并运行应用程序后发生以下情况之一:

  • 没有显示“调试 GPU 帧”窗口——只有 XCode 的状态栏更改为“正在捕获 GPU 帧”并带有事件的微调器;插图 here .
  • 显示“调试 GPU 框架”窗口,但是没有显示编码命令,因此没有显示执行时间,也没有 GPU 对象浏览器(我指的对象是 MTLBuffers 和 MTLTextures);插图 here .
  • 弹出一个无标题的 XCode 窗口,提示“超时 (5)”,除此之外什么也没有发生;插图 here .

下面的代码显示了我的问题的一个简化示例(如果您想知道;不,我在 ViewController 中没有计算逻辑 - 下面的代码只是一个玩具示例;))。

class ViewController : UIViewController {  
  // initialize Metal, create buffers, etc.  

  override func viewDidLoad() {  
    tick() // called exactly once – how to profile the the kernels?  
  }  

  func tick() {  
      // On this (empty) line, there's set a breakpoint with the action "Capture GPU Frame"  
      mQueue.insertDebugCaptureBoundary() // start frame capture here  
      let cmdBuff = mQueue.commandBuffer()  
      let compEnc = cmdBuff.computeCommandEncoder()  

      // ------- Dispatch several kernels -------  
      compEnc.setComputePipelineState(foo)  
      compEnc.setBuffer(..., offset: 0, atIndex: 0)  
      compEnc.setBuffer(..., offset: 0, atIndex: 1)  
      // ...  
      compEnc.dispatchThreadgroups(..., ...)  


      compEnc.setComputePipelineState(bar)  
      compEnc.setBuffer(..., offset: 0, atIndex: 0)  
      compEnc.setBuffer(..., offset: 0, atIndex: 1)  
      // ...  
      compEnc.dispatchThreadgroups(..., ...)  
      // ------- /Dispatch several kernels -------  

      compEnc.endEncoding()  
      cmdBuff.commit()  
      cmdBuff.waitUntilCompleted()  

      mQueue.insertDebugCaptureBoundary() // end the frame capture here  
  }  

}



Best Answer-推荐答案


在 iOS 11 中我们可以使用 MTLCaptureManager可靠地捕获计算内核的一次调用。

当您运行下面的示例时,它会开始捕获。您可以通过 Xcode 的“GPU 捕获按钮”(参见图像)或通过 MTLCaptureManagerstopCapture() 以编程方式停止捕获。方法。

GPU Capture button

// 1. First create the Metal device and command queue
let dev   = MTLCreateSystemDefaultDevice()!
let queue = dev.makeCommandQueue()!

// 2. Access the shared MTLCaptureManager and start capturing
let capManager = MTLCaptureManager.shared()
capManager.startCapture(commandQueue: queue)

// 3. Encode commands into the queue
let cmdbuff = queue.makeCommandBuffer()!
let enc     = cmdbuff.makeComputeCommandEncoder()!

// encode your kernel

enc.endEncoding()
cmdbuff.commit()

关于iOS Metal : How to Capture GPU Frame properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39254332/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap