As an organizational note: none of us have enough hours in a day, and you probably won’t read most of the references below. In order to help sort out the ones I most recommend, I split each subsection into a main recommendation and other recommendations, and deliberately stick to one main recommendation.

This page is a living document. If there are good sources you think I’ve missed, please do submit a pull request against the main repository.

There is no required class for the text, and I will teach primarily from my own notes and slide decks, as well as from papers. Nonetheless, it’s good to have a reference or two.

Main recommendation

Other recommendations

Main recommendation

The closest course to CS 5220 (apart from previous instances of the class) is Jim Demmel’s Applications of Computers (Berkeley CS 267), available here in online form.

Other recommendations

  • Argonne runs ATPESC every summer (Argonne Training Program on Extreme-Scale Computing). This covers many things from our class (plus some others) in about two weeks.
  • Alan Edelman at MIT teaches a different parallel programming course, with the most recent iterations based on Julia. Materials are available here on MIT OpenCourseWare].
  • Georgia Tech has two HPC courses; CSE 6220 and CSE 6230. Without exploring in detail, I think we’re closer to the latter.
  • Randy Leveque at UW has also been experimenting with a flipped classroom for their intro HPC class, AM583. You may also be interested in the MOOC version.
  • The NERSC docs have lots of good auxiliary references.

Intel has lots of existing curricular content and tutorials and references on Intel parallel technology, and these are worth a browse.

Though I expect students taking the class to have some programming proficiency, that doesn’t necessarily mean everyone will have seen a Unix command line or a version control system. I mostly won’t spend class time on this, so you should take some time to brush up on your own.

Main recommendation

Software Carpentry has good lessons on Unix shell and Git. If you’re unfamiliar with make, the lesson on Automation and Make may also be useful (though less immediately critical).

Other recommendations

  • Cornell’s Center for Advanced Computing (CAC) offers a number of online training modules, including a good Linux introduction.
  • GitHub has links to several good resources for learning about Git and GitHub. I was particularly amused by the interactive Try Git tutorial.
  • Atlassian (makers of BitBucket) have a good [set of Git tutorials as well][bitbucket-turorials].
  • ProGit is a freely available online book that covers the basics and much more.

As an aside: BitBucket is probably the primary competitor to Git. I recommend getting accounts on both GitHub and BitBucket; the latter provides unlimited private repositories for educational users, which is helpful for managing proposals, paper drafts, and other projects that you might want to keep initially private.

C background

You will need to have prior programming experience in some C family language (Java, C, C++, C#), but that doesn’t mean you will have done any C programming before. We’re going to use C as the lingua franca for most of the class, so it’s a good idea to do some reading if you don’t know the language already.

Main reference

The C Programming Language (Kernighan and Ritchie) is the bible of C programming. I like it both as a reference to the language and an example of how to write an effective manual.

Other references

Specifically, you will want to look at the lessons on the Unix shell and Git early on, and the lesson on Automation and Make fairly soon. For later in the class, you may want the lesson on Programming with Python.

C++ background

Modern C++ is a different language from modern C. It is a much bigger language, partly because it provides more abstractions (and more safe abstractions), making it a nice choice for large-scale software development in particular. At the same time, the language design is very wedded to maintaining C levels of performance – the C++ philosophy is to avoid paying extra costs for abstractions if possible (and particularly for abstractions that you are not using).

Main reference

  • For learning modern C++, learncpp is a good choice. If you are a confident C programmer already, you can skim past a lot.
  • For looking things up, cppreference is great.

Other references

  • Stroustrop’s A Tour of C++ is a good overview if you already are a confident programmer (and an excellent one if you already know some C++ programming)
  • For the same audience, Professional C++
  • The standard reference is [The C++ Programming Language][stroustrop4e]
  • If you prefer watching things, the CppCon Back to Basics come recommended (I prefer books)

Python background

Knowledge of Python is not strictly required for this class, but we will use Python in some of our work. We teach a Python course at Cornell (CS 1110) as our introductory course, but you are not the target audience for that class.

Main reference

CAC has instructional modules on Introduction to Python and Python for HPC that fit well with the perspectives of this course.

Other references