This course will bring the students competencies in assessing the applicability of parallelization of algorithms for solving a given problem, and to construct parallel algorithms that efficiently utilize the available logical cores of the underlying system.

The student will gain knowledge of:

• Key concepts associated with parallel programming, including data parallelism, task parallelism, task synchronization and pipelines.
• Requirements for parallelizing algorithms.
• Calculating the optimal performance gains that can be achieved through the parallelization of an algorithm.
• Key concepts associated with concurrent programming, including critical section, deadlock, starvation, and synchronization primitives used for synchronization.
• Asynchronous programming.

The student will be able to:

• Design and implement parallel algorithms for a given parallelizable problem in a concrete programming language.
• Use asynchronous programming for improved responsiveness of an application implemented in a concrete programming language.
• Use synchronization primitives for concurrent programming in a concrete programming language.