---
title: GPU devices and work submission
framework: Metal
role: collectionGroup
role_heading: API Collection
platforms: []
path: metal/gpu_devices_and_work_submission
---

# GPU devices and work submission

Find any available GPU, submit work to it with command buffers, suspend work, and coordinate between multiple GPUs.

## Overview

You can use any available GPU’s [MTLDevice](mtldevice.md) instance in addition to the default instance that [MTLCreateSystemDefaultDevice()](mtlcreatesystemdefaultdevice().md) returns. For each device instance, get its [MTLCommandQueue](mtlcommandqueue.md) instance, and create one or more [MTLCommandBuffer](mtlcommandbuffer.md) instances to send work to the GPU.

When the system suspends your app, use the command queue to finish command buffers already in progress. See [Preparing your Metal app to run in the background](preparing-your-metal-app-to-run-in-the-background.md) for more information.

## Topics

### Locating and inspecting a GPU device

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

### Submitting work to a GPU with Metal 4

- [MTL4CommandQueue](mtl4commandqueue.md)
- [MTL4CommandQueueDescriptor](mtl4commandqueuedescriptor.md)
- [MTL4CommandQueueError](mtl4commandqueueerror-swift.struct.md)
- [MTL4CommandQueueError.Code](mtl4commandqueueerror-swift.struct/code.md)
- [MTL4CommandQueueErrorDomain](mtl4commandqueueerrordomain.md)
- [MTL4CommandBuffer](mtl4commandbuffer.md)
- [MTL4CommandBufferOptions](mtl4commandbufferoptions.md)
- [MTL4CommandEncoder](mtl4commandencoder.md)
- [MTL4RenderEncoderOptions](mtl4renderencoderoptions.md)
- [MTL4ArgumentTable](mtl4argumenttable.md)
- [MTL4ArgumentTableDescriptor](mtl4argumenttabledescriptor.md)
- [MTL4CommandAllocator](mtl4commandallocator.md)
- [MTL4CommandAllocatorDescriptor](mtl4commandallocatordescriptor.md)
- [MTL4CommitOptions](mtl4commitoptions.md)
- [MTL4CommitFeedback](mtl4commitfeedback.md)
- [MTL4CommitFeedbackHandler](mtl4commitfeedbackhandler.md)
- [MTL4CounterHeap](mtl4counterheap.md)
- [MTL4CounterHeapDescriptor](mtl4counterheapdescriptor.md)
- [MTL4CounterHeapType](mtl4counterheaptype.md)
- [MTL4TimestampHeapEntry](mtl4timestampheapentry.md)
- [MTL4TimestampGranularity](mtl4timestampgranularity.md)

### Submitting work to a GPU with Metal

- [Setting up a command structure](setting-up-a-command-structure.md)
- [MTLCommandQueue](mtlcommandqueue.md)
- [MTLCommandQueueDescriptor](mtlcommandqueuedescriptor.md)
- [MTLCommandBuffer](mtlcommandbuffer.md)
- [MTLCommandBufferDescriptor](mtlcommandbufferdescriptor.md)
- [MTLCommandBufferError](mtlcommandbuffererror-swift.struct.md)
- [MTLCommandEncoder](mtlcommandencoder.md)

### Suspending work on a GPU

- [Preparing your Metal app to run in the background](preparing-your-metal-app-to-run-in-the-background.md)
