如何在macOS上检测外部GPU(eGPU)连接和断开连接?

时间:2019-04-30 02:29:16

标签: macos gpu metal iokit

我想编写一个macOS应用,该应用可以检测您何时通过Disconnect "GPU Name" Extra菜单断开外部GPU的连接,然后采取一些措施。

  • 我使用什么API来检测GPU的存在?

  • 当GPU断开连接并随后插入时,我会收到通知吗?

1 个答案:

答案 0 :(得分:6)

来自Apple的Metal docs

  

注册外部GPU通知

     

调用MTLCopyAllDevicesWithObserver函数以获取列表   可用于系统的所有金属设备中,并注册   每当此列表更改(或可能由于更改而更改)时调用的观察者   到安全的断开连接请求)。

id <NSObject> deviceObserver  = nil;
NSArray<id<MTLDevice>> *deviceList = nil;
deviceList = MTLCopyAllDevicesWithObserver(&deviceObserver,
                                           ^(id<MTLDevice> device, MTLDeviceNotificationName name) {
                                               [self handleExternalGPUEventsForDevice:device notification:name];
                                           });
_deviceObserver = deviceObserver;
_deviceList = deviceList;
     

要注销观察者的注册,请致电MTLRemoveDeviceObserver   功能。

     

响应外部GPU通知

     

Metal将这些外部GPU事件通知您的应用:

     
      
  • MTLDeviceWasAddedNotification。当将外部GPU添加到系统时,Metal将发布此通知。评估   更新了设备列表,并考虑使用新添加的设备。

  •   
  • MTLDeviceRemovalRequestedNotification。当用户启动安全断开连接请求时,Metal将发布此通知。   外部GPU。您的应用大约需要一秒钟的时间来迁移工作   关闭设备并删除对其的所有引用。如果您的应用无法   这样做,macOS会通知用户您的应用阻止了安全   断开请求。

  •   
  • MTLDeviceWasRemovedNotification。当系统中移除了外部GPU时,Metal将发布此通知   应用仍然具有对该设备的引用。如果用户安全   断开了外部GPU的连接,Metal在发布此通知后   发布MTLDeviceRemovalRequestedNotification通知。如果   用户意外断开了外部GPU的连接,Metal发布了此信息   通知而无需先发布   MTLDeviceRemovalRequestedNotification通知。之后   移除了外部GPU,为该设备排队的所有命令缓冲区都是   出现错误,并且引用了   设备因错误而失败。

  •   
     

设置一种方法来响应通知,并传递此方法   到MTLCopyAllDevicesWithObserver的handler参数   功能。

- (void)handleExternalGPUEventsForDevice:(id<MTLDevice>)device notification:(MTLDeviceNotificationName)notification
{
    if (notification == MTLDeviceWasAddedNotification) {  }
    else if (notification == MTLDeviceRemovalRequestedNotification) {  }
    else if (notification == MTLDeviceWasRemovedNotification) {  }
}