Description: Principles of concurrent and high performance programming. Multi-threading in C and Java for shared-memory programming. Distributed memory programming with Java. Introduction to cluster computing. A-F only.
Objectives
- Master concepts of program performance optimization, of multi-core architectures, and of concurrent programming.
- Become proficient in performance tuning of non-concurrent C programs.
- Become proficient in multi-threaded programming in C and in Java.
- Gain hands-on experience in debugging and performance tuning of multi-threaded programs on multi-core architectures.
- Gain exposure to advanced high-performance computing topics such as cluster computing and GPU programming.
- Be engaged in a final project in which all the knowledge acquired in the course is applied to optimizing the performance of real-world software.
Course Learning Outcomes: (See objectives)
Program Learning Outcomes
- b. Students can analyze a problem, and identify and define the computing requirements appropriate to its solution
- c. Students can design, implement, and evaluate a computer-based system, process, component, or program to meet desired needs
Prerequisites: 212 or consent.
Textbook(s): No textbook, only lecture notes.
Grading: Homework and programming assignments (60%)
Midterm (15%)
Final (25%)
Schedule
- Week 1: Review of processes and threads
- Week 2: Java threads and thread safety, Java Swing
- Week 3: Thread Synchronization with Locks and Condition Variables
- Week 4: Threads in C with Pthreads
- Week 5: Semaphores and Monitors
- Week 6, 7: Classic Concurrency Problems
- Week 7: The java.util.concurrent package
- Week 8: Measures of program performance and sequential program optimization
- Week 9: Concurrency and Performance
- Week 10: Multithreading with OpenMP
- Weeks 11, 12: Shared-memory programming for Performance
- Week 13: Identifying bottlenecks, profiling
- Week 14: Hardware and Concurrency
- Week 15: Distributed systems, final review