菜鸟教程小白 发表于 2022-12-12 12:00:43

iOS Metal : How to Capture GPU Frame properly?


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

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

<p>我希望发生的事情类似于 <a href="https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Art/xcode_gpu_overview_program_2x.png" rel="noreferrer noopener nofollow">this</a> – 即每个内核函数的执行持续时间概览,其中标明了执行各行内核函数所花费的时间百分比。</p>

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

<ul>
<li>没有显示“调试 GPU 帧”窗口——只有 XCode 的状态栏更改为“正在捕获 GPU 帧”并带有事件的微调器;插图 <a href="http://i.imgur.com/S7KEXDH.png" rel="noreferrer noopener nofollow">here</a> .</li>
<li>显示“调试 GPU 框架”窗口,但是没有显示编码命令,因此没有显示执行时间,也没有 GPU 对象浏览器(我指的对象是 MTLBuffers 和 MTLTextures);插图 <a href="http://i.imgur.com/OoQhiqG.png" rel="noreferrer noopener nofollow">here</a> .</li>
<li>弹出一个无标题的 XCode 窗口,提示“超时 (5)”,除此之外什么也没有发生;插图 <a href="http://i.imgur.com/ahIrbDv.png" rel="noreferrer noopener nofollow">here</a> .</li>
</ul>

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

<pre><code>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&#39;s set a breakpoint with the action &#34;Capture GPU Frame&#34;
      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
}

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在 iOS 11 中我们可以使用 <a href="https://developer.apple.com/documentation/metal/tools_profiling_and_debugging/metal_gpu_capture" rel="noreferrer noopener nofollow"><code>MTLCaptureManager</code></a>可靠地捕获计算内核的一次调用。</p>

<p>当您运行下面的示例时,它会开始捕获。您可以通过 Xcode 的“GPU 捕获按钮”(参见图像)或通过 <code>MTLCaptureManager</code> 的 <a href="https://developer.apple.com/documentation/metal/mtlcapturemanager/2869736-stopcapture" rel="noreferrer noopener nofollow"><code>stopCapture()</code></a> 以编程方式停止捕获。方法。</p>

<p> <a href="/image/2vDrH.png" rel="noreferrer noopener nofollow"><img src="/image/2vDrH.png" alt="GPU Capture button"/></a> </p>

<pre><code>// 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()
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iOSMetal: How to Capture GPU Frame properly?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39254332/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39254332/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS Metal : How to Capture GPU Frame properly?