Apple Metal: API grafica e di calcolo per iOS, macOS e Apple Silicon

Metal di Apple come API low-overhead grafica e di calcolo: annuncio WWDC 2014 (iOS 8), Metal 2 (2017), Metal 3 (WWDC 2022, macOS Ventura). Metal Shading Language, Metal Performance Shaders (MPS), MPSGraph, Core ML su GPU, memoria unificata Apple Silicon.

R&DAIHardware AppleMetalMSLMPSMPSGraphCore MLApple SiliconGPUmacOSiOS

Dal contesto: perché Metal

Fino al 2014 le piattaforme Apple usavano OpenGL/OpenGL ES per il rendering e OpenCL per il calcolo GPU — API pensate negli anni 90 con modelli di driver ad alto overhead, gestione degli stati implicita e submission seriali. Sulle GPU mobili dell’epoca, il costo di ogni draw call era significativo rispetto alle risorse disponibili.

Apple annuncia Metal alla WWDC 2014 (2 giugno 2014) come API grafica low-overhead per iOS 8 sugli A7/A8. L’obiettivo tecnico dichiarato: ridurre il costo CPU della submission, rendere esplicita la gestione di stato e resource, avvicinare il modello a quello di Vulkan e Direct3D 12 (poi rilasciati nel 2015-2016).

Architettura Metal

Metal espone un modello di programmazione basato su oggetti espliciti:

  • MTLDevice — la GPU
  • MTLCommandQueue / MTLCommandBuffer — coda e batch di comandi
  • MTLRenderCommandEncoder / MTLComputeCommandEncoder / MTLBlitCommandEncoder — encoder per i tre tipi di workload
  • MTLRenderPipelineState / MTLComputePipelineState — pipeline pre-compilate, immutabili
  • MTLBuffer / MTLTexture / MTLHeap — risorse con storage mode espliciti (shared, managed, private, memoryless)

La submission è esplicita: l’app costruisce command buffer, li commit alla queue, gestisce la sincronizzazione via fence, event, shared event. Niente driver che “indovina” stati.

Metal Shading Language (MSL)

MSL è il linguaggio per gli shader, derivato da C++14 con estensioni GPU. È lo stesso linguaggio per vertex, fragment, tile, compute e mesh shader (introdotti con Metal 3). Il compilatore è Metal Compiler (metal), basato su LLVM, che produce binari intermedi AIR (Apple Intermediate Representation) impacchettati in metallib. A runtime, il driver genera il codice macchina specifico della GPU target.

kernel void saxpy(
    device const float* x [[buffer(0)]],
    device float*       y [[buffer(1)]],
    constant float&     a [[buffer(2)]],
    uint                i [[thread_position_in_grid]])
{
    y[i] = a * x[i] + y[i];
}

Metal 2 (2017) e Metal 3 (2022)

  • Metal 2 — WWDC 2017 (macOS High Sierra, iOS 11). Aggiunge Argument Buffers (binding di grandi set di risorse in un singolo buffer), Raster Order Groups, supporto GPU esterne (eGPU) e integrazione con il Metal Performance Shaders framework.
  • Metal 3 — WWDC 6 giugno 2022 (macOS Ventura, iOS 16). Introduce MetalFX Upscaling (spatial e temporal, analogo a DLSS/FSR), mesh shaders, Fast Resource Loading (caricamento asincrono direttamente dal file system alle texture), Offline Shader Compilation per ridurre gli stutter al primo uso.

Metal Performance Shaders e MPSGraph

Metal Performance Shaders (MPS) è un framework di kernel di calcolo ottimizzati per ciascuna famiglia di GPU Apple: convoluzioni, matrici, FFT, filtri immagine, reti neurali. Sopra di esso, MPSGraph è un’API di calcolo basata su grafo, dedicata al machine learning — equivalente di alto livello a XLA o a cuDNN + TensorRT.

Lo stack ML Apple si appoggia a MPS/MPSGraph:

  • Core ML usa MPS come backend per l’esecuzione su GPU
  • PyTorch espone il device mps dal 2022 (collaborazione Apple + Meta), che mappa le operazioni su MPSGraph
  • TensorFlow ha un backend tensorflow-metal su MPS
  • JAX su Apple Silicon tramite IREE/MPS (sperimentale)

Compute e ML su Apple Silicon

Con il passaggio a Apple Silicon (M1 a novembre 2020, poi M2, M3, M4, più varianti Pro/Max/Ultra), la memoria è unificata: CPU, GPU e Neural Engine accedono allo stesso pool DRAM senza copie espliciti. In Metal, le risorse con storage mode shared risiedono in memoria unificata; private abilita copie in VRAM interna. La presenza del Neural Engine (NPU separata) crea una divisione del lavoro ML: kernel generici su GPU via MPS, kernel supportati nel Neural Engine via Core ML.

Per LLM a precisione ridotta (INT4/INT8, GGUF), llama.cpp ha un backend Metal dal 2023: su un M2/M3 Max con 64-128 GB di memoria unificata, è praticabile inferenza locale di modelli 30-70B quantizzati — caso d’uso di rilievo per laboratori e workstation AI senza GPU discreta.

Confronto con Vulkan e Direct3D 12

Metal condivide con Vulkan e Direct3D 12 la filosofia low-overhead e explicit state. Differenze pratiche:

  • Metal è platform-locked (solo Apple). Vulkan è cross-vendor su Linux, Android, Windows; D3D12 è Windows/Xbox.
  • MSL è più vicino a C++ standard di HLSL e GLSL/SPIR-V; però SPIR-V è IR binario interscambiabile.
  • La gestione sincronizzazione di Metal è considerata più ergonomica rispetto a Vulkan (più nascosta al dev).

Progetti come MoltenVK (KhronosGroup) e DXVK / D3DMetal traducono Vulkan e D3D12 su Metal in userspace, abilitando giochi Windows/Linux su macOS.

Contesto noze

noze valuta Apple Silicon come piattaforma di inferenza locale per modelli medi e come ambiente di sviluppo: la memoria unificata rende le workstation M2/M3 Max/Ultra adatte a prototipare pipeline LLM senza GPU discreta. In produzione sanitaria, tuttavia, lo stack di riferimento resta CUDA/NVIDIA: Apple non offre soluzioni server, il porting da CUDA a Metal richiede riscrittura dei kernel custom e non esistono GPU Apple in configurazioni data-center con InfiniBand o NVLink equivalenti.


Riferimenti: Metal annunciato alla WWDC del 2 giugno 2014 (iOS 8). Metal 2 annunciato WWDC 5 giugno 2017 (macOS High Sierra, iOS 11). Metal 3 annunciato WWDC 6 giugno 2022 (macOS Ventura, iOS 16). Apple M1 annunciato 10 novembre 2020. PyTorch con backend mps da PyTorch 1.12 (giugno 2022). Fonti: Apple Developer Documentation (Metal, Metal Shading Language, Metal Performance Shaders), keynote WWDC.

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi