CUDA: modello di programmazione per GPU NVIDIA

CUDA come modello di programmazione SIMT per GPU NVIDIA: grid, block, thread, warp, gerarchia di memoria, streaming multiprocessor. Toolkit (NVCC, PTX, SASS), librerie (cuBLAS, cuDNN, NCCL, TensorRT). Evoluzione da CUDA 1.0 (2007) a CUDA 12.0 (8 dicembre 2022).

R&DAIHardware CUDANVIDIAGPUSIMTPTXcuDNNcuBLASNCCLTensorRTHardwareAI

Origine: Tesla e CUDA 1.0 (2007)

CUDA (Compute Unified Device Architecture) è il modello di programmazione e il runtime introdotti da NVIDIA con l’architettura Tesla (GPU G80, GeForce 8800 GTX, novembre 2006) e rilasciati pubblicamente come CUDA 1.0 a giugno 2007. L’obiettivo dichiarato era esporre la GPU come dispositivo di calcolo general-purpose parallelo, con linguaggio derivato da C e semantica esplicita del parallelismo.

Il modello adottato è SIMT (Single Instruction, Multiple Threads): istruzioni scalari replicate su gruppi di thread (warp di 32 thread in hardware), con divergenza gestita a livello di warp.

Grid, block, thread

Un programma CUDA è composto da kernel, funzioni __global__ eseguite sul device (GPU). Ogni invocazione di kernel specifica:

  • una grid di block (1D/2D/3D)
  • per ciascun block, un numero di thread (fino a 1024)

Block e thread hanno indici (blockIdx, threadIdx) usati per mappare il calcolo sui dati. L’hardware assegna interi block a uno Streaming Multiprocessor (SM) — unità con registri, shared memory, scheduler warp. I block non comunicano fra loro se non via memoria globale, mentre i thread di un block condividono la shared memory on-chip.

__global__ void saxpy(int n, float a, const float* x, float* y) {
  int i = blockIdx.x * blockDim.x + threadIdx.x;
  if (i < n) y[i] = a * x[i] + y[i];
}

Gerarchia di memoria

  • Registers — per thread, più veloci
  • Shared memory — per block, ~100 KB per SM, banda ~TB/s
  • L1/L2 cache — gestite dall’hardware
  • Global memory — HBM/GDDR, centinaia di GB/s ÷ TB/s, latenza alta
  • Constant e texture memory — letture ottimizzate con caching

Il tuning CUDA consiste in larga parte nell’allocare bene i dati tra questi livelli e nel garantire accessi coalesced alla memoria globale.

Toolkit e librerie

Il CUDA Toolkit comprende:

  • NVCC — compilatore C/C++ che separa codice host e device, genera PTX (Parallel Thread Execution, ISA virtuale intermedia) e SASS (ISA reale della GPU target)
  • NVRTC — compilazione a runtime di sorgenti CUDA
  • cuBLAS, cuSPARSE, cuFFT, cuSOLVER — algebra lineare, FFT, risolutori sparsi/densi
  • cuDNN — primitive per reti neurali (convoluzioni, attention, batchnorm)
  • NCCLcollective communication multi-GPU/multi-nodo (all-reduce, broadcast)
  • TensorRT — ottimizzatore e runtime di inferenza (quantizzazione INT8/FP8, fusion, kernel autotuning)
  • Nsight Systems/Compute — profiling

Sopra il toolkit si appoggiano gli ecosistemi PyTorch, TensorFlow, JAX, RAPIDS (cuDF, cuML per data science), Triton (OpenAI, DSL Python per kernel), llama.cpp / vLLM / TensorRT-LLM per LLM.

Compute capability e versioni

Ogni GPU NVIDIA espone una compute capability (es. 7.0 per Volta, 8.0 per Ampere A100, 9.0 per Hopper H100, 10.0 per Blackwell) che determina istruzioni supportate, limiti hardware e feature disponibili. PTX funge da livello intermedio: un binario PTX compilato per una capability può essere JIT-compilato dal driver per GPU più recenti, preservando compatibilità in avanti.

Le versioni principali:

  • CUDA 1.0 (2007) — G80, primo rilascio pubblico
  • CUDA 4.0 (2011) — unified virtual addressing, accesso peer-to-peer tra GPU
  • CUDA 6.0 (2014) — unified memory (pointer unico host/device)
  • CUDA 9.0 (2017) — supporto Volta, cooperative groups
  • CUDA 11.0 (2020) — supporto Ampere, TF32, MIG
  • CUDA 12.0 (8 dicembre 2022) — supporto Hopper, lazy loading, requisito minimo driver 525.60.13, supporto C++20 parziale nel device code, rimossa compute capability < 3.5

CUDA come lock-in e alternative

CUDA è proprietario NVIDIA: binari compilati per GPU NVIDIA non girano su AMD/Intel. Le alternative open (OpenCL, SYCL, HIP/ROCm di AMD, oneAPI di Intel) coprono casi d’uso sovrapposti ma, al 2024, l’ecosistema di librerie AI di riferimento (cuDNN, NCCL, TensorRT) rimane CUDA-first. HIP di AMD adotta intenzionalmente una sintassi quasi identica a CUDA per agevolare il porting.

Contesto noze

noze sviluppa stack AI on-premise in ambito sanitario e R&D: training e inferenza di LLM (Llama, Mistral, BioMistral, Meditron), pipeline di imaging (MONAI, nnU-Net), sistemi RAG. CUDA è il livello comune di tutti questi stack. L’uso di Docker NGC e immagini ready-made (es. pytorch:24.x-py3, tritonserver:24.x) permette deployment riproducibili e version-pinned del runtime CUDA, requisito stabile per percorsi MDR e audit EU AI Act.


Riferimenti: CUDA introdotta con architettura Tesla (G80, GeForce 8800 GTX, 8 novembre 2006). CUDA 1.0 disponibilità pubblica giugno 2007. CUDA 12.0 rilascio generale 8 dicembre 2022 (NVIDIA release notes, developer.nvidia.com/cuda-toolkit-archive). Licenza: proprietaria NVIDIA (CUDA Toolkit EULA). Sorgenti primarie: CUDA C++ Programming Guide, PTX ISA documentation, whitepapers di architettura GPU.

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