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/.
                                        
 
                                                                                                             
                                 |