This is an algorithms course that teaches how to develop multi-threaded programs without using a mutex. It could also be called: High-Performance with Style!
The course is a perfect blend of High-Work and Low-Stress. It is about the best arranged course that I could imagine, with a heavy emphasis on projects over exams. The projects ramp up nicely and are usually made up of many small parts - so if you screw up one part you can still do well overall. Lab 0 is the best introductory lab I've ever done, and should be the warm-up for the whole of OMSCS. Working template code is provided for the other labs so it is very clear what your algorithm needs to do and what output it is expected to produce. The test data is thoughtfully designed to be "predictably random", making it much easier to chase down things like off-by-one errors. Getting each part working is then relatively easy, and you can spend as much time optimizing your code as you like. Getting 90% in a lab is achievable within "expected time". Getting 95% requires "exceeding expectations time", and 100% takes "insane superstar time".
An optional lab worth a bonus 10% of your overall grade is also provided. Only 10% to 20% of students attempt this lab, but I would recommend you try it. Our optional lab was released immediately after lab 2 (and before lab 3) so you should plan on finishing lab 2 a week early to give yourself time to complete it. It's a challenging lab with very little support, but completely doable. Unfortunately it is an all-or-nothing lab (average grade is 70%), so you could spend 40 hours on it and get 0% if something goes wrong with the hidden tests.
The course also does a fantastic job managing the roles and responsibilities of all the TA's. At the end of every other course I've taken, I've had very little to say in the CIOS survey about the TA's because they were largely anonymous and working behind the scenes. But in HPC, ownership of the labs and the papers was very clear, and the TA owners did a great job responding to student questions. As a result, you felt a real connection with the TA's, along with a great deal of appreciation of their expertise and thanks for their work.
I found the lecture material to be pretty theoretical (though thankfully not just a series of mathematical proofs). The professor does an outstanding job of slowly walking you through the theory, but unfortunately I personally found that the theory quickly degenerated into gobbledygook. When it came time to review my notes in preparation for the exam, absolutely nothing looked familiar. I had to convince myself that I really did, in fact, go through all the lectures the first time.
The course starts off from where the Graduate Algorithms course leaves off - taking serial algorithms and converting them into multi-threaded algorithms (which is not nearly as easy as you might have thought). The Graduate Algorithms course uses the textbook called "Introduction to Algorithms" (by Cormen, Leiserson, Rivest, and Stein). HPC continues using a single chapter from that same excellent book, and it is clear why that book has such a fanatical following. Unfortunately, that one chapter is all the book has to offer on the subject of multithreaded applications, and so we had to transition to a second book called "Introduction to Parallel Computing" (by Grama, Gupta, Karypis, and Kumar). While the content of this second book is good, the end-of-chapter problems are insane, and the (mostly lacking) answers completely unhelpful.
Unfortunately, the course exams are a roller-coaster and do not fit into the High-Work and Low-Stress model of the rest of the course. The practice exams handed out in advance are crazy-difficult. Given that only 30 minutes are allocated for every question, the practice questions would break down into: 25 minutes to understand what-the-hell the question is asking + 5 minutes to write an answer. Thankfully I found the real-world exam questions to be better than that. After the mid-term, we were told the average score was 36 out of 50 with a top score of 44. "Wow," I thought, "44 - I didn't find the midterm that bad - maybe I got the top score". Nope - I scored 38. So expect some sticker shock!
There were some curious explanations about the exams. We were told that: "Exams are hard because we want to give the top students a chance to show us what they can do". But this seems weird. The projects are designed to give the top students room to shine, so why also do this with the exams? And, besides, the top students are not showing us what they can do - they barely scored better than the rest of us!
In addition, we were told: "If you are scoring well on the projects and average on the exams then you've got nothing to worry about". But consider the translation: "If you screwed up a project or scored below average in the exam then now would be a good time to panic"!
So I think the exams remain an area of improvement, but the course is active and improvements are always in the works.
The course has traditionally had a reputation of High-Work High-Stress, but the workload has been eased off over the last few years. Several of the lectures are now marked as "optional" and there are now only 4+1 labs (including Lab 0 and the optional lab). In the old days, there were 6 mandatory labs with no time to study for the exams.
In terms of course preparation, you will be doing a lot of C, OpenMP and MPI in this course, with very little pthreads and C++. While something like AOS could prepare you for the OpenMP and MPI, you really don't need it. On the other hand, this course does require a lot of algorithm complexity analysis. So if you really wanted to be prepared, then do Graduate Algorithms before you do this course. I didn't and have never really done big-O analysis before, so I struggled. But with a little extra work you can figure this out.