I disagree with most of the formal prerequisites for this course. I think it’s perfect for anyone who has never taken a computer organization course before and the amount of assembly and C++ knowledge that you need is minimal.
While lecture material was fantastic, the logistics and organization of the class can be borderline awful. The criticisms of this class are all fair: there is an annoying amount of errata, the projects are more annoying than educational, the pacing is poor, the practice problem sets from the course developer are poorly put together, and the tests are stressful. Thankfully, a historically stellar TA staff mostly mitigates these issues. Without proper expectations and knowledge of some potential gotchas, this class can easily become very frustrating. So in particular, you will enjoy the class much more by following these practical tips.
I took this in the summer semester where the timeline is tight, so this advice probably will not apply in the fall or spring — it is a front heavy class. For those taking the class that are weak on the suggested prerequisites, there is a “module 0” that walks through that knowledge in good detail. However it takes a good couple hours and is not listed in the syllabus schedule, so be sure to factor that in. Then in the first half of the course, you will have two projects, a midterm, and a third project due a week after. The latter half is much more relaxed with a single project before the final. I am a huge advocate for classes that release all of their assignments from the start — this class does not do that and because of it, causes some unnecessary stress.
The official project write-up instructions are vague in parts and even have errors in them. The TA will send an official Piazza FAQ post about that project that is almost required reading before you start the project (and can be frustrating if they don’t post it at the same time the project is released).
The code base is definitely intimidating at first, but don’t be fooled. The FAQ post should have lots of helpful info to navigate the code. In particular, there is very little C++ specific knowledge that you need in order to complete the projects. You will need to understand how header files are organized, and maybe google how templates work. You should also use the STL library and will maybe need to read up on C++ iterators if you have not seen them before (creating and searching through sets and vectors are not as trivial as other languages). Specifically, you will only need to write a couple dozen lines spread across a couple methods in a couple files. If you are writing many lines of code on many different pages, and reading and trying to understand large parts of the codebase, then you are doing it wrong.
Get a partner for projects 2 and 3. This can be frustrating if you’re just picking someone randomly (I had a partner drop the class and had to get a new one). You can work together though time differences and logistics can be difficult. So in my case, we just did the projects separately and compared answers in the end. It ended up working really well since he caught a major error in my project 2, and I did the same for his project 3.
It’s in the FAQ, but is worth repeating — comparing benchmarks is the best way to know your code is working. And be sure to compare against multiple benchmarks. I saw that one of my benchmarks matched the class and didn’t check the others, only to find out later I had a major flaw in my code that could have been caught by checking all the benchmarks.
Sometimes the simulations can be time consuming to run. Budget accordingly.
Most people find the midterm very stressful. And for good reason since it is calculation heavy and an error early on in your calculation can mess up the work you do afterwards (though the staff does their best to give you partial credit given your early mistakes). And there is a bit of a time crunch — if you struggle with any one part for too long, you will run out of time. On the other hand, the final has plenty of time and is much more based on conceptual knowledge than calculation.
Because I knew all that going in, I actually had the opposite problem. Studying for the midterm was straightforward for me. I focused on all the material that had calculations, redid the lecture quizzes, and did the practice problems (which are all calculation heavy). That strategy worked remarkably well — I thought the midterm was very straightforward and finished with plenty of time to check my work. In fact, I lost the most points on the one problem whose material was based on a lecture I did not review because there weren’t any calculations in it! That one was all true/false questions that tested conceptual knowledge.
Similarly, I had a more difficult time with the final because it required a much wider understanding of the material. It had many more true/false questions and really tested all parts of the material. None of it was unreasonable; it just requires traditional study techniques and putting the time to learn the material.
You’re allowed handwritten and printed notes during the test. These are much more useful for the conceptual type questions since you should be comfortable jumping right in for the calculation type questions (aside from maybe having the equations you’re going to use written down). I did not do this, but I think printing the lecture video transcript if that’s out there somewhere would probably be the most helpful. I did not ever read the book, but I don’t think there’s much value in having the book in front of you.
- The sample midterm that’s taken through canvas is the most bang-for-your-buck study material. It’s a couple questions long, but the actual midterm will have very very similar questions to it. So if you know how to do these questions well, it’s a guaranteed 50 or 60 points on the real midterm.
- Definitely be comfortable calculating CPI, calculating speedups, scheduling instructions using Tomasulo’s algorithms (and knowing all the reasons an instruction may stall given the limitations in the problem specifications), spotting data dependencies, counting branch mispredictions with all the different types of branch predictors, and reading MIPS assembly instructions (be familiar with all the instruction types you have seen in class).
- Do and redo the in-lecture quizzes.
- Do the problem sets, but take them with a grain of salt. The problem set questions are very different in style and tone to questions you’ll get from the professor. So they can be helpful, but are often significantly more difficult and vague than anything you will get on the midterm.
- You’re allowed an on-screen calculator and I highly recommend SpeedCrunch.
- There is no sample final in Canvas, which is one reason I found the final to be more difficult than the midterm.
- Definitely be comfortable with the MOESI coherence protocol and how to break up an address into its tag, index, and offset bits.
- It is significantly less calculation heavy. I never used my on-screen calculator.
- I’m not sure there’s any special tricks for the final besides good ol’ fashioned time spent studying and understanding all of the material. Having good notes in front of you can be much more beneficial for the final than the midterm.
- Notably, I think there is less value in studying the in-lecture quizzes and much less value in doing the problem sets in great detail.
- The final is cumulative but will focus much more heavily on the post midterm material. It may be worth your time to refresh yourself with some of the midterm questions and be comfortable answering questions like them.