MacOS Metal:无法从命令行应用程序捕获 GPU 帧

Posted

技术标签:

【中文标题】MacOS Metal:无法从命令行应用程序捕获 GPU 帧【英文标题】:MacOS Metal: Failing to capture GPU Frame from command line app 【发布时间】:2020-09-02 14:36:45 【问题描述】:

我正在尝试在命令行应用程序中使用 MTLCaptureManager 以编程方式捕获 GPU 帧。

到目前为止,捕获管理器无法支持MTLCaptureDestinationGPUTraceDocument 目标。

我尝试使用 XCode 创建一个非常简单的复制案例:

#import <Foundation/Foundation.h>
#import <Metal/Metal.h>

int main(int argc, const char * argv[]) 
  @autoreleasepool 

      id<MTLDevice> device = MTLCreateSystemDefaultDevice();
      
      MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager];
      if (![captureManager supportsDestination:MTLCaptureDestinationGPUTraceDocument])
      
        NSLog(@"********** captureManager does not support MTLCaptureDestinationGPUTraceDocument ************");
      
      else
      
        NSLog(@"captureManager support is fine");
      
  
  return 0;

当使用 XCode 运行时,它似乎愿意工作:输出是:

2020-09-02 16:25:59.712217+0200 testMetalCapture[20095:416447] Metal GPU Frame Capture Enabled
2020-09-02 16:25:59.712503+0200 testMetalCapture[20095:416447] Metal API Validation Enabled
2020-09-02 16:26:00.669092+0200 testMetalCapture[20095:416447] captureManager support is fine
Program ended with exit code: 0

但是当我归档构建结果并从终端运行时,它会失败:

2020-09-02 16:32:57.607 testMetalCapture[20126:419837] ********** captureManager does not support MTLCaptureDestinationGPUTraceDocument ************

我可以在终端中重现任何运行时环境以使 MTLCaptureManager 正常工作吗?

(环境为 XCode 11.6 + MacOS 10.15 Catalina)

【问题讨论】:

【参考方案1】:

据我了解(我找不到任何官方文档):

MTLCaptureManager 需要来自 Info.plist 的授权:MetalCaptureEnabled 应设置为 YES正确的方法是将命令行应用程序与这样的 plist 捆绑在一起 这很复杂,例如见Building OSX App Bundle

我偶然发现MTLCaptureManager 在与命令行应用程序相同的目录中有Info.plist 也可以工作。

这个 Info.plist 几乎可以是空的,像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>MetalCaptureEnabled</key>
    <true/>
</dict>
</plist>

通过这个简单的设置,我可以运行我的测试程序(也可以运行我的真实程序)

% ./testMetalCapture
2020-10-02 15:53:08.507 testMetalCapture[28559:686864] Metal GPU Frame Capture Enabled
2020-10-02 15:53:08.523 testMetalCapture[28559:686864] captureManager support is fine

(我目前使用的是 MacOSX 10.15.6,以后可能会崩溃)

【讨论】:

以上是关于MacOS Metal:无法从命令行应用程序捕获 GPU 帧的主要内容,如果未能解决你的问题,请参考以下文章

将 Metal MTKView 实时捕获为电影?

何时在 Apple macOS 上使用 Metal 而不是 Accelerate API

markdown 从命令行界面创建可启动的macOS usb安装程序

tensorflow-macos tensorflow-metal 安装方法

tensorflow-macos tensorflow-metal 安装方法

tensorflow-macos tensorflow-metal 安装方法