Programmazione di processori massivamente paralleli: un approccio pratico
Questo corso offre un'introduzione completa al calcolo GPU e alla programmazione parallela utilizzando l'ambiente CUDA C. Copre le architetture GPU, il parallelismo dei dati, la gestione dei thread, l'ottimizzazione della memoria e considerazioni avanzate sulle prestazioni, illustrate attraverso casi di studio reali come la ricostruzione di immagini MRI e la visualizzazione molecolare.
Panoramica del corso
Riepilogo del contenuto
Questo corso offre un'introduzione completa al calcolo GPU e alla programmazione parallela tramite l'ambiente CUDA C. Copre le architetture GPU, il parallelismo dati, la gestione dei thread, l'ottimizzazione della memoria e considerazioni avanzate sulle prestazioni, illustrate attraverso casi reali come la ricostruzione di immagini MRI e la visualizzazione molecolare.
Padroneggia l'arte del calcolo parallelo ad alte prestazioni con una guida pratica e basata su esercitazioni per CUDA e le architetture GPU.
Autore: David B. Kirk, Wen-mei W. Hwu
Ringraziamenti: Ian Buck, John Nickolls, team NVIDIA DevTech, Jensen Huang, David Luebke, Bill Bean, Simon Green, Mark Harris, Manju Hedge, Nadeem Mohammad, Brent Oster, Peter Shirley, Eric Young e Cyril Zeller.
Obiettivi di apprendimento
- Distinguere tra filosofie progettuali e traiettorie di prestazioni di CPU multicore e GPU many-core.
- Identificare i componenti chiave di un'architettura GPU moderna, inclusi i Streaming Multiprocessors (SM) e le strutture di memoria.
- Applicare la legge di Amdahl per calcolare il guadagno teorico in velocità e identificare l'impatto dei colli di bottiglia sequenziali.
- Confrontare le differenze architetturali tra pipeline fisse e array di processori programmabili unificate.
- Spiegare il ruolo del "GPGPU" come passaggio intermedio e le limitazioni dei primi modelli di programmazione shader.
- Analizzare come funzionalità hardware come operazioni atomiche, sincronizzazione barriera e supporto a precisione doppia hanno permesso il passaggio al calcolo generico scalabile.
- Identificare e sfruttare il parallelismo dati all'interno degli algoritmi di moltiplicazione matrice-matrice.
- Implementare la gestione della memoria del dispositivo, inclusa l'allocazione, il trasferimento dei dati tra host e dispositivo e la deallocazione.
- Creare e lanciare kernel CUDA utilizzando indici thread appropriati e configurazioni di griglia/blocco.
- Progettare gerarchie di thread multidimensionali (griglie e blocchi) per mappare strutture dati complesse sull'hardware GPU.