Guida alla Programmazione CUDA
La risorsa ufficiale e completa per gli sviluppatori per imparare il modello di programmazione CUDA e come scrivere codice ad alte prestazioni che si esegue su GPU NVIDIA. Questa guida copre l'architettura della piattaforma, l'interfaccia di programmazione, le funzionalità hardware avanzate e le specifiche tecniche.
Lezioni
Panoramica del corso
📚 Riepilogo del contenuto
La risorsa ufficiale e completa per gli sviluppatori che desiderano apprendere il modello di programmazione CUDA e come scrivere codice ad alte prestazioni eseguito su GPU NVIDIA. Questa guida copre l'architettura della piattaforma, l'interfaccia di programmazione, le caratteristiche hardware avanzate e le specifiche tecniche.
Padroneggia l'arte del calcolo parallelo con la guida standard dell'industria per NVIDIA CUDA.
Autore: NVIDIA Corporation
Ringraziamenti: Copyright © 2007-2024 NVIDIA Corporation & affiliate. Tutti i diritti riservati.
🎯 Obiettivi didattici
- Definire i ruoli dell'host (CPU) e del dispositivo (GPU) all'interno di un sistema eterogeneo.
- Spiegare il modello di programmazione SIMT e l'organizzazione gerarchica di thread, blocchi e griglie.
- Distinguere tra PTX (Parallel Thread Execution) e codice binario (cubins) e spiegare come la compilazione Just-in-Time (JIT) faciliti la compatibilità.
- Sviluppare e compilare kernel CUDA: scrivere funzioni global, configurare l'esecuzione con la notazione a tripla freccia e gestire il flusso di compilazione NVCC.
- Ottimizzare la memoria e il movimento dei dati: distinguere tra modelli di memoria Unified, Esplicita e Mappata, e implementare la memoria host bloccata a pagina per trasferimenti efficienti.
- Gestire l'esecuzione parallela: utilizzare CUDA Streams, Eventi e Cooperative Groups per gestire compiti asincroni e sincronizzare operazioni CPU-GPU.
- Eseguire aritmetica di puntatori complessa e identificare i collo di bottiglia architettonici (von Neumann vs. Harvard).
- Implementare pattern di esecuzione CUDA avanzati, inclusi lanci kernel dipendenti dal programma e trasferimenti batch multipli eterogenei.
- Utilizzare funzionalità specifiche dell'hardware come Thread Scopes, Proxy asincroni e Pipeline per massimizzare la concorrenza.
- Configurare e ottimizzare le prestazioni della memoria Unified tramite prefetching, suggerimenti d'uso e gestione delle dimensioni delle pagine.
🔹 Lezione 1: Fondamenti CUDA e panoramica architetturale
Panoramica: Questa lezione introduce la piattaforma di calcolo parallelo CUDA e la sua architettura hardware sottostante. Esplora come i sistemi eterogenei utilizzano sia CPU che GPU, il modello di programmazione SIMT (Single Instruction, Multiple Threads) e l'organizzazione gerarchica di thread, blocchi e griglie. Inoltre, tratta il flusso di compilazione CUDA, compresi i ruoli di PTX, cubins e fatbins nel garantire compatibilità binaria e retroattiva.
Risultati dell'apprendimento:
- Definire i ruoli dell'host (CPU) e del dispositivo (GPU) all'interno di un sistema eterogeneo.
- Spiegare il modello di programmazione SIMT e l'organizzazione gerarchica di thread, blocchi e griglie.
- Distinguere tra PTX (Parallel Thread Execution) e codice binario (cubins) e spiegare come la compilazione Just-in-Time (JIT) faciliti la compatibilità.
🔹 Lezione 2: Programmazione di base GPU e gestione dell'esecuzione
Panoramica: Questa lezione affronta gli aspetti fondamentali e avanzati della programmazione GPU con CUDA C++. Passa dalla specifica di kernel di base e dal flusso di compilazione NVCC ai temi complessi di gestione dell'esecuzione, inclusi progetti kernel SIMT, conflitti di banche di memoria condivisa e esecuzione asincrona tramite stream ed eventi. Gli studenti impareranno a bilanciare i modelli di memoria (Unified vs. Esplicita) e ottimizzare l'occupazione hardware per il calcolo ad alte prestazioni.
Risultati dell'apprendimento:
- Sviluppare e compilare kernel CUDA: scrivere funzioni global, configurare l'esecuzione con la notazione a tripla freccia e gestire il flusso di compilazione NVCC.
- Ottimizzare la memoria e il movimento dei dati: distinguere tra modelli di memoria Unified, Esplicita e Mappata, e implementare la memoria host bloccata a pagina per trasferimenti efficienti.
- Gestire l'esecuzione parallela: utilizzare CUDA Streams, Eventi e Cooperative Groups per gestire compiti asincroni e sincronizzare operazioni CPU-GPU.
🔹 Lezione 3: Logica avanzata della memoria e sistemi multi-GPU
Panoramica: Questa lezione esplora il passaggio dalle architetture fondamentali della memoria e dalla logica dei puntatori alle tecniche avanzate di accelerazione GPU. Copre i modelli di esecuzione a livello hardware (SIMT, Independent Thread Scheduling), meccanismi di sincronizzazione sofisticati (Barriere asincrone, Atomics con ambito) e l'orchestrazione di sistemi multi-GPU usando sia le API Runtime che Driver.
Risultati dell'apprendimento:
- Eseguire aritmetica di puntatori complessa e identificare i collo di bottiglia architettonici (von Neumann vs. Harvard).
- Implementare pattern di esecuzione CUDA avanzati, inclusi lanci kernel dipendenti dal programma e trasferimenti batch multipli eterogenei.
- Utilizzare funzionalità specifiche dell'hardware come Thread Scopes, Proxy asincroni e Pipeline per massimizzare la concorrenza.
🔹 Lezione 4: Ottimizzazione, Graphs e acceleratori hardware
Panoramica: Questa lezione tratta tecniche di programmazione CUDA ad alte prestazioni, concentrandosi sull'ottimizzazione del movimento dei dati e del flusso di esecuzione. Esplora il passaggio dall'esecuzione basata su stream ai CUDA Graph persistenti, il controllo granulare della memoria Unified tramite prefetching e suggerimenti, e l'utilizzo di acceleratori hardware specifici come Tensor Memory Accelerator (TMA) e persistenza della cache L2. Inoltre, descrive schemi di sincronizzazione avanzati, partizione delle risorse tramite Green Contexts e interoperabilità tra API per il calcolo eterogeneo moderno.
Risultati dell'apprendimento:
- Configurare e ottimizzare le prestazioni della memoria Unified tramite prefetching, suggerimenti d'uso e gestione delle dimensioni delle pagine.
- Creare, aggiornare ed eseguire CUDA Graph, inclusi nodi di memoria e avvii sul dispositivo.
- Implementare sincronizzazione avanzata usando Barriere asincrone e il modello Produttore-Consumatore.
🔹 Lezione 5: Riferimento tecnico e estensioni del linguaggio
Panoramica: Questa lezione offre un'approfondita analisi tecnica delle specifiche di riferimento del modello di programmazione CUDA e delle estensioni del linguaggio C++. Tratta l'interfaccia hardware-software tramite capability di calcolo, le variabili d'ambiente per il controllo in fase di esecuzione e i requisiti sintattici specifici per scrivere codice device ad alte prestazioni utilizzando standard C++ moderni, cooperative groups e intrinseci hardware specializzati.
Risultati dell'apprendimento:
- Identificare vincoli hardware e insiemi di funzionalità in base alle versioni delle Compute Capability GPU.
- Configurare l'ambiente di esecuzione CUDA e la compilazione JIT tramite variabili d'ambiente a livello di sistema.
- Applicare estensioni del linguaggio C++ (annotazioni, lambdas e template) rispettando i vincoli del lato dispositivo.