---
title: Finding multiple GPUs on an Intel-based Mac
framework: metal
role: article
role_heading: Article
path: metal/finding-multiple-gpus-on-an-intel-based-mac
---

# Finding multiple GPUs on an Intel-based Mac

Locate, identify, and choose suitable GPUs for your app.

## Overview

Overview Your app can use multiple GPUs on an Intel-based Mac, including any built-in and external GPUs. Start by getting a list of all the system’s available GPUs, and then submit workloads to those appropriate for your app’s tasks. note: Mac computers with Apple silicon have a single, high-performance, and energy-efficient GPU. Get a list of GPU devices Your app can get an array of MTLDevice instances, each of which represents an available GPU, by calling the MTLCopyAllDevices() function. However, that function provides a list of GPUs that are available at that moment in time. To get the current list and register for device update notifications, provide a handler to Metal by calling the MTLCopyAllDevicesWithObserver function. Metal calls your handler to tell your app when the system adds or removes an MTLDevice from the system. note: Metal calls your app’s handler when a device may change its state in the future, such as when a person makes a safe disconnect request. For more information, see Handling external GPU additions and removals. Your app can deregister its observer when it no longer needs GPU device updates from the system by calling the MTLRemoveDeviceObserver(_:) function. Identify each GPU by type Each GPU on a Mac computer’s system can be one of three types: integrated, discrete, or external. You can identify each MTLDevice instance’s type by inspecting its isLowPower and isRemovable properties.  |  |   |  |   |  |   |  |  For example, you can use these properties to build a list of devices for each GPU type. Some external or discrete GPUs can also be headless, which means they aren’t connected to a display. Your app can identify whether a GPU is headless by checking a device instance’s isHeadless property. Select the GPUs suitable for your workloads Each GPU type has its advantages for certain tasks or workloads that you can consider for a system with multiple GPUs.  |  |   |  |   |  |   |  |  In general, start with an integrated GPU (if the system has one) to conserve power and extend the device’s battery life. If your app needs additional graphics or compute processing, consider moving some workloads to a discrete GPU, if the system has one. tip: Your app could let a person choose which GPU your app uses for its workloads, especially if they attach an external GPU to their system. External GPUs typically have significant processing power but lower bandwidth compared to internal GPUs, which makes them a good choice for tasks that don’t require much memory bandwidth for each frame, including the following: Rendering high-complexity graphics scenes Rendering high-resolution graphics content Processing compute workloads in tandem with rendering graphics Processing compute workloads that use a high arithmetic-logic unit (ALU) complexity For more information about GPU memory bandwidth, see Adjusting for GPU memory bandwidth tradeoffs. note: A headless GPU is more suitable for compute processing than rendering graphics for a display because the GPU isn’t connected to a display.

## See Also

### Locating GPUs

- [Getting the GPU that drives a view’s display](metal/getting-the-gpu-that-drives-a-views-display.md)
- [MTLCopyAllDevices()](metal/mtlcopyalldevices().md)
- [MTLCopyAllDevicesWithObserver(handler:)](metal/mtlcopyalldeviceswithobserver(handler:).md)
- [MTLRemoveDeviceObserver(_:)](metal/mtlremovedeviceobserver(_:).md)
- [CGDirectDisplayCopyCurrentMetalDevice(_:)](coregraphics/cgdirectdisplaycopycurrentmetaldevice(_:).md)
- [MTLDeviceNotificationHandler](metal/mtldevicenotificationhandler.md)
- [MTLDeviceNotificationName](metal/mtldevicenotificationname.md)
