Torna ai corsi
AI021 Professional

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.

5.0
30.0h
1762 studenti
1 mi piace
Intelligenza Artificiale
Inizia ad imparare

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

  1. Definire i ruoli dell'host (CPU) e del dispositivo (GPU) all'interno di un sistema eterogeneo.
  2. Spiegare il modello di programmazione SIMT e l'organizzazione gerarchica di thread, blocchi e griglie.
  3. Distinguere tra PTX (Parallel Thread Execution) e codice binario (cubins) e spiegare come la compilazione Just-in-Time (JIT) faciliti la compatibilità.
  4. Sviluppare e compilare kernel CUDA: scrivere funzioni global, configurare l'esecuzione con la notazione a tripla freccia e gestire il flusso di compilazione NVCC.
  5. 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.
  6. Gestire l'esecuzione parallela: utilizzare CUDA Streams, Eventi e Cooperative Groups per gestire compiti asincroni e sincronizzare operazioni CPU-GPU.
  7. Eseguire aritmetica di puntatori complessa e identificare i collo di bottiglia architettonici (von Neumann vs. Harvard).
  8. Implementare pattern di esecuzione CUDA avanzati, inclusi lanci kernel dipendenti dal programma e trasferimenti batch multipli eterogenei.
  9. Utilizzare funzionalità specifiche dell'hardware come Thread Scopes, Proxy asincroni e Pipeline per massimizzare la concorrenza.
  10. 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.