This course will focus on the challenges in developing correct and scalable concurrent programs. We will discuss the types of errors that we make while writing concurrent programs, and techniques and tools to debug them. We will learn about techniques and abstractions that help write correct concurrent programs, for example, synchronization primitives and transactional memory. We will also discuss testing of concurrent programs, and ideas to avoid common performance bottlenecks.
The course will include programming assignments and a course project.
The course will primarily focus on the following topics.
- Concurrency Bugs: data races, atomicity violations, and deadlocks
- Shared Memory Synchronization: locks, monitors, semaphores, flags, barriers, condition variables
- Concurrent programming paradigms: shared-memory, message-passing, partitioned global address space
- Transactional Memory
- Memory Consistency Models
- Concurrent Data Structures
- Testing of Concurrent Programs
- Performance Challenges: PAPI counters, performance analysis tools, false sharing
- We might add new, drop existing, or reorder topics depending on progress and class feedback.
- The course may also involve reading and critiquing related research papers.