<!--
{
  "documentType" : "article",
  "framework" : "Metal",
  "identifier" : "/documentation/Metal/multi-gpu-systems",
  "metadataVersion" : "0.1.0",
  "role" : "collectionGroup",
  "title" : "Multi-GPU systems"
}
-->

# Multi-GPU systems

Locate and work with internal and external GPUs and their displays, video memory, and performance tradeoffs.

## Discussion

Your app can submit work to any or all of the GPUs of a system that supports multiple GPUs. For example, every Mac notebook, such as a MacBook Pro, has an internal GPU, but some have two.

![A system diagram that shows two built-in GPUs within a MacBook Pro.](images/com.apple.metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac-3@2x.png)

A Mac may have a Thunderbolt connection to an external GPU and its displays.

![A system diagram that shows an external GPU that connects a MacBook Pro to an external display.](images/com.apple.metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac-6@2x.png)

Some systems may have even more complicated arrangements of internal and multiple external GPUs and displays.

![A system diagram that shows an iMac Pro connected to an external display, an external GPU, and another external GPU that’s also connected to two additional external displays.](images/com.apple.metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac-7@2x.png)

For more information about Mac configurations with GPUs and displays, see [Assessing multi-GPU and multidisplay setups on an Intel-based Mac](/documentation/Metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac).

Start by locating all GPUs in a system and identifying their types (see [Finding multiple GPUs on an Intel-based Mac](/documentation/Metal/finding-multiple-gpus-on-an-intel-based-mac)). Alternatively, you can locate a specific GPU that’s driving a display (see [Getting the GPU that drives a view’s display](/documentation/Metal/getting-the-gpu-that-drives-a-views-display)).

When selecting a GPU, consider its memory bandwidth and the storage mode options for its memory resources (see [Adjusting for GPU memory bandwidth tradeoffs](/documentation/Metal/adjusting-for-gpu-memory-bandwidth-tradeoffs)).

For examples of how to use external GPUs in your graphics rendering or compute processing workflows, see the following:

- [Selecting device objects for graphics rendering](/documentation/Metal/selecting-device-objects-for-graphics-rendering)
- [Selecting device objects for compute processing](/documentation/Metal/selecting-device-objects-for-compute-processing)

For more information about external GPU configurations, see [Use an external graphics processor with your Mac](https://support.apple.com/kb/HT208544).

> Note:
> The system may gain or lose an external GPU at any time (see <doc://com.apple.metal/documentation/Metal/handling-external-gpu-additions-and-removals>).

## Topics

### Locating GPUs

[Finding multiple GPUs on an Intel-based Mac](/documentation/Metal/finding-multiple-gpus-on-an-intel-based-mac)

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

[Getting the GPU that drives a view’s display](/documentation/Metal/getting-the-gpu-that-drives-a-views-display)

Keep up to date with the optimal device for your display.

[`MTLCopyAllDevices()`](/documentation/Metal/MTLCopyAllDevices())

Returns an array of all the Metal device instances in the system.

[`MTLCopyAllDevicesWithObserver(handler:)`](/documentation/Metal/MTLCopyAllDevicesWithObserver(handler:))

Returns an array of all the Metal GPU devices in the system and registers a notification handler that Metal calls when the device list changes.

[`MTLCopyAllDevicesWithObserver`](/documentation/Metal/MTLCopyAllDevicesWithObserver)

Returns an array of all the Metal GPU devices in the system and registers a notification handler that Metal calls when the device list changes.

[`MTLRemoveDeviceObserver(_:)`](/documentation/Metal/MTLRemoveDeviceObserver(_:))

Removes a registered observer of device notifications.

  <doc://com.apple.documentation/documentation/CoreGraphics/CGDirectDisplayCopyCurrentMetalDevice(_:)>

[`MTLDeviceNotificationHandler`](/documentation/Metal/MTLDeviceNotificationHandler)

A Swift closure or an Objective-C block that Metal calls
when the system adds or removes a GPU device.

[`MTLDeviceNotificationName`](/documentation/Metal/MTLDeviceNotificationName)

A notification that represents a change to a GPU device in the system.

### Selecting GPUs

[Adjusting for GPU memory bandwidth tradeoffs](/documentation/Metal/adjusting-for-gpu-memory-bandwidth-tradeoffs)

Choose a suitable GPU and memory storage mode for tasks based on that GPU’s memory bandwidth on a Mac.

[Assessing multi-GPU and multidisplay setups on an Intel-based Mac](/documentation/Metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac)

Learn the possible GPU and display configurations for a Mac and their limitations.

[Selecting device objects for graphics rendering](/documentation/Metal/selecting-device-objects-for-graphics-rendering)

Switch dynamically between multiple GPUs to efficiently render to a display.

[Selecting device objects for compute processing](/documentation/Metal/selecting-device-objects-for-compute-processing)

Switch dynamically between multiple GPUs to efficiently execute a compute-intensive simulation.

### Working with external GPUs

[Handling external GPU additions and removals](/documentation/Metal/handling-external-gpu-additions-and-removals)

Register and respond to external GPU notifications that a person initiates.

[Transferring data between connected GPUs](/documentation/Metal/transferring-data-between-connected-gpus)

Use high-speed connections between GPUs to transfer data quickly.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)