Mulțumim pentru trimiterea solicitării! Un membru al echipei noastre vă va contacta în curând.
Mulțumim pentru trimiterea rezervării! Un membru al echipei noastre vă va contacta în curând.
Durata 28 ore
Schița de curs
Introducere
- Ce este OpenCL?
- OpenCL vs CUDA vs SYCL
- Prezentare generală a funcțiilor și arhitecturii OpenCL
- Configurarea mediului de dezvoltare
Începutul
- Crearea unui nou proiect OpenCL folosind Visual Studio Code
- Explorarea structurii proiectului și a fișierelor
- Compilarea și rularea programului
- Afișarea ieșirii folosind printf și fprintf
OpenCL API
- Înțelegerea rolului OpenCL API în programul host
- Utilizarea OpenCL API pentru a interoga informațiile despre dispozitiv și capacitățile sale
- Utilizarea OpenCL API pentru a crea contexte, cozi de comenzi, buffere, kernere și evenimente
- Utilizarea OpenCL API pentru a pune în coadă comenzi, cum ar fi read, write, copy, map, unmap, execute și wait
- Utilizarea OpenCL API pentru a gestiona erorile și excepțiile
OpenCL C
- Înțelegerea rolului OpenCL C în programul dispozitiv
- Utilizarea OpenCL C pentru a scrie kernere care se execută pe dispozitiv și manipulează datele
- Utilizarea tipurilor de date, calificatorilor, operatorilor și expresiilor OpenCL C
- Utilizarea funcțiilor încorporate OpenCL C, cum ar fi cele matematice, geometrice, relaționale etc.
- Utilizarea extensiilor și bibliotecilor OpenCL C, cum ar fi atomic, image, cl_khr_fp16 etc.
Modelul de memorie OpenCL
- Înțelegerea diferenței dintre modelele de memorie pentru host și pentru dispozitiv
- Utilizarea spațiilor de memorie OpenCL, cum ar fi global, local, constant și privat
- Utilizarea obiectelor de memorie OpenCL, cum ar fi bufferele, imaginile și pipe-urile
- Utilizarea modurilor de acces la memorie OpenCL, cum ar fi read-only, write-only, read-write etc.
- Utilizarea modelului de consistență a memoriei OpenCL și a mecanismelor de sincronizare
Modelul de execuție OpenCL
- Înțelegerea diferenței dintre modelele de execuție pentru host și pentru dispozitiv
- Utilizarea work-items, work-groups și ND-ranges OpenCL pentru a defini paralelismul
- Utilizarea funcțiilor work-item OpenCL, cum ar fi get_global_id, get_local_id, get_group_id etc.
- Utilizarea funcțiilor work-group OpenCL, cum ar fi barrier, work_group_reduce, work_group_scan etc.
- Utilizarea funcțiilor de dispozitiv OpenCL, cum ar fi get_num_groups, get_global_size, get_local_size etc.
Debugging
- Înțelegerea erorilor și a bug-urilor comune din programele OpenCL
- Utilizarea debugger-ului din Visual Studio Code pentru a inspecta variabilele, punctele de întrerupere, call stack-ul etc.
- Utilizarea CodeXL pentru a depista și analiza erorile din programele OpenCL pe dispozitive AMD
- Utilizarea Intel VTune pentru a depista și analiza erorile din programele OpenCL pe dispozitive Intel
- Utilizarea NVIDIA Nsight pentru a depista și analiza erorile din programele OpenCL pe dispozitive NVIDIA
Optimizare
- Înțelegerea factorilor care afectează performanța programelor OpenCL
- Utilizarea tipurilor de date vectoriale OpenCL și a tehnicilor de vectorizare pentru a îmbunătăți randamentul aritmetic
- Utilizarea tehnicilor de loop unrolling și loop tiling OpenCL pentru a reduce overhead-ul de control și a crește localitatea
- Utilizarea memoriei locale OpenCL și a funcțiilor de memorie locală pentru a optimiza accesul la memorie și lățimea de bandă
- Utilizarea profiling-ului OpenCL și a instrumentelor de profiling pentru a măsura și îmbunătăți timpul de execuție și utilizarea resurselor
Cerințe
- O înțelegere a limbajului C/C++ și a conceptelor de programare paralelă;
- Cunoștințe de bază despre arhitectura calculatorului și ierarhia memoriei;
- Experiență cu instrumentele de linie de comandă și editoarele de cod.
Public Țintă
- Dezvoltatori care doresc să învețe cum să folosească OpenCL pentru programarea dispozitivelor heterogene și a exploata paralelismul acestora;
- Dezvoltatori care doresc să scrie cod portabil și scalabil care se poate rula pe platforme și dispozitive diferite;
- Programatori care doresc să exploreze aspectele de nivel scăzut ale programării heterogene și să optimizeze performanța codului.