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’è OpenCL?
- OpenCL vs CUDA vs SYCL
- Panoramica sulle funzionalità e sull’architettura di OpenCL
- Configurazione dell’ambiente di sviluppo
Primi passi
- Creazione di un nuovo progetto OpenCL con Visual Studio Code
- Analisi della struttura del progetto e dei file contenuti
- Compilazione ed esecuzione del programma
- Visualizzazione dell’output tramite printf e fprintf
API OpenCL
- Comprensione del ruolo dell’API OpenCL all’interno del programma host
- Utilizzo dell’API per ottenere informazioni e capacità dei dispositivi
- Creazione di contesti, code di comando, buffer, kernel ed eventi tramite l’API OpenCL
- Inserimento in coda di comandi quali lettura, scrittura, copia, mappatura, smappatura, esecuzione e attesa mediante l’API
- Gestione degli errori ed eccezioni tramite le funzionalità fornite dall’API
Linguaggio OpenCL C
- Ruolo del linguaggio OpenCL C nel contesto dei programmi eseguiti sui dispositivi
- Scrivere kernel in OpenCL C che operino sul dispositivo e manipolino i dati
- Utilizzo dei tipi di dati, qualificatori, operatori ed espressioni previsti da OpenCL C
- Impiego delle funzioni integrate di OpenCL C, come quelle matematiche e relazionali
- Integrazione di estensioni e librerie come atomic, image e cl_khr_fp16 all’interno del codice OpenCL C
Modello di memoria in OpenCL
- Differenze tra i modelli di memoria host e dispositivo
- Utilizzo degli spazi di memorizzazione forniti da OpenCL, come global, local, constant e private
- Lavorare con oggetti di memoria quali buffer, immagini e pipe
- Impostazione delle modalità di accesso alla memoria: solo lettura, solo scrittura, lettura-scrittura, ecc.
- Gestione del modello di coerenza della memoria e dei meccanismi di sincronizzazione previsti da OpenCL
Modello esecutivo in OpenCL
- Distinzioni tra modelli esecutivi host e dispositivo
- Definizione del parallelismo tramite elementi di lavoro, gruppi di lavoro ed intervalli ND
- Impiego delle funzioni dedicate agli elementi e ai gruppi di lavoro, come get_global_id, get_local_id, get_group_id, ecc.
- Utilizzo di funzioni specifiche per i dispositivi, quali get_num_groups, get_global_size e get_local_size
- Uso delle funzioni di gruppo lavoro come barrier, work_group_reduce e work_group_scan
Debugging
- Riconoscimento degli errori e dei bug più comuni nei programmi OpenCL
- Ispezione delle variabili, impostazione di punti di interruzione e analisi dello stack di chiamata tramite il debugger di Visual Studio Code
- Utilizzo di CodeXL per eseguire debug e analisi dei programmi OpenCL su dispositivi AMD
- Analisi approfondita dei programmi OpenCL tramite Intel VTune, strumento dedicato ai dispositivi Intel
- Debug e analisi di programmi OpenCL sui sistemi dotati di hardware NVIDIA grazie a NVIDIA Nsight
Ottimizzazione
- Identificazione dei fattori che influenzano le prestazioni dei programmi OpenCL
- Sfruttare i tipi di dati vettoriali e le tecniche di vettorizzazione per aumentare la velocità di elaborazione aritmetica
- Ridurre l’overhead legato al controllo dei cicli ricorrendo allo srotolamento e alla suddivisione in blocchi dello stesso
- Ottimizzare gli accessi alla memoria e la larghezza di banda utilizzando la memoria locale prevista da OpenCL
- Analisi approfondita delle prestazioni del programma tramite strumenti specifici per profilare il codice ed evidenziarne i colli di bottiglia
Conclusione e prossimi passi
Requisiti
- Buona padronanza del linguaggio C/C++ e dei concetti fondamentali della programmazione parallela
- Conoscenza di base dell’architettura dei computer e della gerarchia della memoria
- Esperienza nell’utilizzo di strumenti a riga di comando e editor di codice
Destinatari del corso
- Sviluppatori intenzionati ad apprendere l’utilizzo di OpenCL per programmare dispositivi eterogenei e sfruttarne il parallelismo
- Sviluppatori desiderosi di creare codice portabile e scalabile in grado di funzionare su molteplici piattaforme e dispositivi
- Programmatori interessati a esplorare gli aspetti più avanzati della programmazione eterogenea e ad ottimizzarne le prestazioni del codice
28 ore