---
title: GPU devices and work submission
framework: Metal
role: collectionGroup
role_heading: API Collection
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

Overview You can use any available GPU’s MTLDevice instance in addition to the default instance that MTLCreateSystemDefaultDevice() returns. For each device instance, get its MTLCommandQueue instance, and create one or more MTLCommandBuffer 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 for more information.

## Topics

### 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)
- [Multi-GPU systems](metal/multi-gpu-systems.md)

### Submitting work to a GPU with Metal 4

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

### Submitting work to a GPU with Metal

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

### Suspending work on a GPU

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