---
title: Multi-GPU systems
framework: metal
role: collectionGroup
role_heading: API Collection
path: metal/multi-gpu-systems
---

# Multi-GPU systems

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

## Overview

Overview 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 Mac may have a Thunderbolt connection to an external GPU and its displays.

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

For more information about Mac configurations with GPUs and displays, see Assessing multi-GPU and multidisplay 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). Alternatively, you can locate a specific GPU that’s driving a display (see Getting the GPU that drives a view’s 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). 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 Selecting device objects for compute processing For more information about external GPU configurations, see Use an external graphics processor with your Mac. note: The system may gain or lose an external GPU at any time (see Handling external GPU additions and removals).

## Topics

### Locating GPUs

- [Finding multiple GPUs on an Intel-based Mac](metal/finding-multiple-gpus-on-an-intel-based-mac.md)
- [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)

### Selecting GPUs

- [Adjusting for GPU memory bandwidth tradeoffs](metal/adjusting-for-gpu-memory-bandwidth-tradeoffs.md)
- [Assessing multi-GPU and multidisplay setups on an Intel-based Mac](metal/assessing-multi-gpu-and-multi-display-setups-on-an-intel-based-mac.md)
- [Selecting device objects for graphics rendering](metal/selecting-device-objects-for-graphics-rendering.md)
- [Selecting device objects for compute processing](metal/selecting-device-objects-for-compute-processing.md)

### Working with external GPUs

- [Handling external GPU additions and removals](metal/handling-external-gpu-additions-and-removals.md)
- [Transferring data between connected GPUs](metal/transferring-data-between-connected-gpus.md)

## See Also

### Locating and inspecting a GPU device

- [Getting the default GPU](metal/getting-the-default-gpu.md)
- [Detecting GPU features and Metal software versions](metal/detecting-gpu-features-and-metal-software-versions.md)
- [MTLCreateSystemDefaultDevice()](metal/mtlcreatesystemdefaultdevice().md)
- [MTLDevice](metal/mtldevice.md)
