CILJ KOLEGIJA:
U početnom periodu razvoja računalne tehnike svaka nova generacija računala bila je značajno brža od prethodne. Taj je trend završio oko 2005. godine i od tada je povećanje efikasnosti programa moguće uglavnom korištenjem paralelnog izvršavanja na više procesora, odnosno procesorskih jezgri. Time paralelno programiranje postaje centralna tema svih računarskih kurikuluma. Paralelizam se u računalnom sustavu pojavljuje na više razina: unutar svake pojedine jezgre mikroprocesora (vektorske operacije), unutar višejezgrenog procesora, zbog prisutnosti akceleratora u sustavu (na primjer grafičke kartice) te konačno u klasterima računala. Svakom tipu paralelizama unutar sklopovlja odgovara određen tip razvoja paralelnih programa i pripadnih biblioteka za podršku. Cilj ovog kolegija je upoznati studente s osnovnim modelima razvoja paralelnog koda i pripadnim softverskim alatima. Studenti trebaju svladati generiranje vektorskog koda, paralelno programiranje s programskim nitima, paralelno programiranje s dijeljenjem poruka i programiranje heterogenih sustava koji (danas) uključuju centralnu procesorsku jedinicu i grafičku karticu. Softverski alati koji će biti korišteni u područje vektorskog, višedretvenog i višeprocesorskog programiranja su prilično stabilni (OpenMP, C++ programske niti, MPI i slično), što nije slučaj kod programiranja na grafičkim karticama i drugim akceleratorima. Tamo imamo mogućnosti korištenja CUDA, HIP ili OpenCL programskih jezika te OpenMP, OpenACC, SYCL programskih sučelja, kao i programskih modela na višoj razini apstrakcije, kao što su Kokkos i Raja. Ciljevi kolegija u tom dijelu će se mijenjati ovisno o pozicioniranju ovih alata na tržištu.
NASTAVNI SADRŽAJI:
1. Vektorsko programiranje za superskalarne procesore. Autovektorizacija putem prevodioca, korištenje intrinzičnih naredbi te posebnih programskih biblioteka.
2. Paralelno programiranje s dijeljenom memorijom. Korištenje OpenMP direktiva i C++ sustava programskih niti/POSIX niti u jeziku C. Sinkronizacija programskih niti, implementacija dijeljenih struktura podatak i paralelnih algoritama. Memorijski model OpenMP sustava i programskog jezika C++. Atomske operacije i programiranje bez zaključavanja.
3. Paralelno programiranje s distribuiranom memorijom. Primjena MPI sustava, individualne i kolektivne operacije, paralelni ulaz i izlaz, topologije.
4. Programiranje paralelnih algoritama na grafičkim karticama (i eventualno drugim akceleratorima). Programiranje pomoću direktiva (OpenAcc i OpenMP) i primjena CUDA/OpenCL/SYCL programskih jezika/okolina.
|
-
Parallel and High Performance Computing, R.Robey, Y. Zamora, Manning, 2021.
-
Using MPI, treće izdanje, W. Gropp, E. Lusk, A. Skjellum, MIT, 2014.
-
C++ Concurrency in Action, drugo izdanje, A. Williams, Manning, 2019.
-
The Art of Writing Efficient Programs, F.G. Pikus, Packt, 2021.
-
Parallel Programming with MPI, P.S. Pacheco, Morgan Kaufmann Publishers, 1997.
-
Using OpenMP, B. Chapman, G. Jost, R. Van der Pas, MIT, 2008.
-
Programming Massively Parallel Processors, A Hands-on Approach, treće izdanje, D.B. Kirk, Wen-mei W. Hwu, Morgan Kaufman, 2017.
-
OpenCL in Action, M. Scarpino, Manning, 2012.
-
Dokumentacija biblioteke NVIDIA CUDA, https://docs.nvidia.com/cuda/.
-
Specifikacija programskog sučelja OpenACC, https://www.openacc.org.
-
Specifikacija programskog sučelja OpenMP, https://www.openmp.org.
-
Dokumentacija C++ programskog modela Kokkos, https://github.com/kokkos/kokkos-tutorials.
-
Dokumentacija softverske biblioteke RAJA, https://raja.readthedocs.io/en/develop/.
|