Grazie per aver inviato la tua richiesta! Uno dei nostri team membri ti contatterà a breve.
Grazie per aver inviato il tuo prenotazione! Uno dei nostri team membri ti contatterà a breve.
Struttura del corso
Introduzione
- Cos’è CUDA?
- CUDA rispetto a OpenCL e SYCL
- Panoramica delle caratteristiche e dell'architettura di CUDA
- Configurazione dell'ambiente di sviluppo
Primi passi
- Crea un nuovo progetto CUDA utilizzando Visual Studio Code.
- Esplora la struttura e i file del progetto.
- Compila ed esegui il programma.
- Visualizza l'output tramite printf e fprintf.
API di CUDA
- Ruolo dell’API CUDA nel codice host.
- Ottenere informazioni sul dispositivo tramite l’API CUDA.
- Allocare e liberare memoria del device usando l’API.
- Trasferire dati tra host e device tramite l’API.
- Avviare i kernel e sincronizzare i thread con l’API.
- Gestione degli errori ed eccezioni tramite l’API.
Linguaggio CUDA C/C++
- Ruolo di CUDA C/C++ nel codice device.
- Scrivere kernel in CUDA C/C++ da eseguire sulla GPU e manipolare i dati.
- Utilizzare tipi di dati, qualificatori, operatori ed espressioni previsti dal linguaggio.
- Impiegare funzioni integrate come math, atomiche o relative ai warp.
- Sfruttare le variabili predefinite – threadIdx, blockIdx, blockDim ecc. – per il controllo dei dati.
- Integrare librerie specifiche come cuBLAS, cuFFT e cuRAND nel codice.
Modello di memoria di CUDA
- Differenze tra i modelli di memoria host e device.
- Impiego degli spazi di memoria – globale, condivisa, costante e locale – per l’ottimizzazione delle operazioni.
- Gestione di oggetti come puntatori, array, texture e superfici in contesto di memoria.
- Impostare modalità d'accesso predefinite (lettura solo, scrittura sola ecc.).
- Rispettare il modello di coerenza della memoria e i meccanismi sincronizzanti previsti da CUDA.
Modello di esecuzione di CUDA
- Differenze tra l'esecuzione su host e device.
- Definire la parallelizzazione tramite thread, blocchi e griglie.
- Gestire le funzioni relative ai thread – threadIdx, blockIdx ecc. – per il coordinamento dei dati.
- Riconoscere funzioni di blocco quali __syncthreads e __threadfence_block.
- Utilizzare elementi di tipo griglia come gridDim o cooperative groups nel programma.
Debugging
- Identificare errori tipici e problemi comuni nei codici CUDA.
- Usare il debugger integrato in Visual Studio Code per analizzare variabili, impostare breakpoint ed esaminare lo stack delle chiamate.
- Sfruttare CUDA-GDB per diagnosticare i problemi dei programmi su Linux.
- Utilizzare CUDA-MEMCHECK al fine di individuare errori e perdite di memoria indesiderate.
- Impiegare NVIDIA Nsight durante l'analisi e il debug di applicazioni Windows.
Ottimizzazione
- Comprendere i fattori che influenzano le prestazioni dei programmi scritti in CUDA.
- Sfruttare la coalescing per incrementare il flusso dati verso la memoria.
- Migliorare le prestazioni tramite l’impiego di tecniche di caching e prefetching che riducano i tempi di latenza.
- Impiegare in modo mirato la memoria condivisa e locale per ottimizzare accessi e larghezza di banda disponibile.
- Valutare e migliorare il comportamento runtime e l’impiego delle risorse tramite profiler dedicati.
Sintesi finale e prossimi passi
Requisiti
- Conoscenza del linguaggio C/C++ e dei concetti fondamentali della programmazione parallela
- Nozioni di base sull'architettura informatica e sulla gerarchia della memoria
- Esperienza nell'utilizzo di strumenti a riga di comando e editor di codice
Destinatari del corso
- Sviluppatori interessati ad apprendere come impiegare CUDA per programmare le GPU NVIDIA e sfruttarne il parallelismo.
- Programmatori che desiderano realizzare codice ad alte prestazioni e scalabile, idoneo all'esecuzione su diversi dispositivi compatibili con CUDA.
- Persone interessate a approfondire gli aspetti più tecnici della programmazione delle GPU e ad ottimizzare le prestazioni dei propri programmi.
28 ore