Course Meeting Times
Lectures: 2 sessions / week; 1.5 hours / session
Recitations: 1 session / week; 2 hours / session
Modern computing platforms provide unprecedented amounts of raw computational power. But with great power comes great complexity, to the point that making useful computations exploit even a fraction of the computing platform’s potential becomes a substantial challenge. Indeed, obtaining good performance requires a comprehensive understanding of all layers of the underlying platform, deep insight into the computation at hand, and the ingenuity and creativity required to obtain an effective mapping of the computation onto the machine. The reward for mastering these sophisticated and challenging topics is the ability to make computations that can process large amounts of data orders of magnitude more quickly and efficiently and to obtain results that are unavailable with standard practice.
6.172 is an 18-unit class that provides a hands-on, project-based introduction to building scalable and high-performance software systems. Topics include performance analysis, algorithmic techniques for high performance, instruction-level optimizations, caching optimizations, parallel programming, and building scalable systems. The course programming language is C.
There are no required textbooks for 6.172, however, Homework 5 refers to Chapter 27 of Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein (CLRS) (PDF).
Cormen, Thomas, Charles Leiserson, Ronald Rivest, and Clifford Stein. Introduction to Algorithms. MIT Press, 2009. ISBN: 9780262033848
You must complete all of the projects and all of the homeworks. Failure to turn in a project, or turning in a project that shows an insufficient attempt, is grounds for failing the class! Missing more than one recitation check-off or more than one homework assignment may also adversely affect your grade beyond the 0 you will receive on the missed work. TA’s are available at office hours to help you perform well. Please take advantage of the office hours.
There will be 10 homework assignments throughout the semester. These homeworks are intended to give hands-on experience with tools and other practical topics related to the lectures. These homeworks will help you prepare for your projects and evaluate your understanding of the course material. One part of each homework will typically need to be completed and checked-off in recitation.
There will be two in-class quizzes. Please mark the dates, and let us know early if you have a conflict. Job interviews do not constitute a reasonable excuse to miss a quiz or other work. Quality employers respect a student who understands priorities. The quizzes will be closed book and closed notes, but you will be permitted a handwritten, double-sided, 8.5x11 crib sheet. All material covered by the lectures, recitations, projects, homeworks, and prerequisite courses, as well as any other material indicated by course staff, is fair game for the quizzes. More details will be forthcoming as the quizzes approach.
The bulk of your out-of-class time will be spent completing four projects of increasing scope and complexity. The basic premise of each project is straightforward. You are given a correct but inefficient program, and your mission is to make it run as fast as possible. Each project involves a beta submission (two betas for Project 4), a design/code review, and a final submission. You will work in pairs to complete Projects 1–3, and you will work in teams of four to complete Project 4. The general structure of each assignment is described below.
- Project 1: This project will allow you to learn how to improve performance by using a performance monitoring tool and to experiment with word-level parallelism.
- Project 2: You will begin with a single-threaded physical simulation. You will optimize this simulation and then parallelize it using Cilk Plus, a language, compiler, library, and tool chain for developing multithreaded applications. This project will expose you to many of the issues associated with correctness and performance in a multithreaded application.
- Project 3: Project 3 will require you to examine the complex real-world problem of high-performance memory management. You will implement a serial library which provides the malloc, free, and realloc functions (that is, the C memorymanagement API) as efficiently as possible for several different plausible workloads. You will also use autotuning techniques to find configurations with high performance.
- Project 4: Unlike the previous projects, Project 4 involves two beta submissions, instead of just one, as well as a final submission. You will work to optimize a 4,500-line game engine, which plays a two-player board game. Unlike for the previous projects, we will provide relatively little direction. You will need to use everything you have learned during the course to identify performance bottlenecks and eliminate them. Higher performance programs should play better. Although we will grade your performance on an absolute scale independently from how others’ programs in the class perform, we will run exhibition tournaments among the programs for fun.
Punctuality and Extensions (i.e., late policy)
Each student will have a budget of 3 total late days to use as needed on homework assignments, weekly status reports, and project write-ups throughout the semester. (The final project’s final write-up cannot be extended.) Additionally, we allow 2-day extensions for project write-ups that are organized in conjunction with the EECS Communication Lab. No assignment may be handed in more than 2 days after the deadline. Moreover, late days are atomic and cannot be subdivided.
Late days may not be used for the beta submissions and final submissions of projects. We unfortunately have effectively no capacity for handling such late submissions, because this class has many tight deadlines and project code will be released immediately after the deadline. For beta submissions and final submissions, you should submit whatever you have by the deadline, and we will award partial credit as appropriate.
The EECS Communication Lab is a tool to help you improve the quality of your project writeups. Peer coaches will review your writing and advise on structure and style. To incentivize participation, we’re offering a 2-day extension on project write-ups (beta and final) for any group that meets with the Communication Lab. These do not count towards your late-day budget, and may be used on any and all project write-ups, except for the final project’s final write-up. Additionally, please come prepared to your appointment with either a draft of your write-up or an outline of the main points you will include in your write-up. This ensures that the advisor you meet with has material to review and give feedback on.
The course staff has recruited senior software engineers from industry to share with you their invaluable experience and give you concrete advice on your design and code. These Masters in the Practice of Software Systems Engineering (MITPOSSE) will review your code and comment on its design, structure, and style. Well-designed code is easier to performance engineer.
The course staff will not involve MITPOSSE “Deputies” in the grading process, but your participation in code and design reviews will be evaluated by the course staff to determine the MITPOSSE portion of your project grade. We want you to perform well in the class, and your Deputy’s expertise can help you produce better projects and a higher grade. Your assigned Deputy has agreed to volunteer a significant amount of their time to help you learn. We have hand-picked these volunteers from among the top software engineers. They know what they are talking about. All have extensive experience with real-world, on-the-job design reviews.
Please accord these Deputies your greatest respect, since they are volunteering their time to help you succeed in the class. You can learn a lot from them. Be punctual. Be prepared. Be gracious. Thank them!