This course is intended for students whose current or future coursework or research involves computational science (e.g. computational fluid dynamics, genomics, finite element analysis, economics simulations, computational linguistics, physics, etc). The class will help students learn the principles of operating in a typical scientific computing environment. Topics include typical Linux shells and commands, hardware (CPU, memory , network, etc), storage management, batch job scheduling, code and workflow optimization, code management, results verification, and programming. A semester-long project will help students apply the principles that are taught in class.

The class is designed to cover a broad range of topics, exposing you to the landscape of High-Performance Computing (HPC) and imbuing you with an understanding of what’s possible. That breadth comes at the expense of depth: we don’t have the time to make you a master of MPI or GPU programming, but will provide enough of an introduction that you know what to continue learning when faced with supercomputing-related challenges.

As a graduate-level course, this class affords more independence than most undergraduate classes. Assignments and projects usually involve more decision-making; you are given specs and expected to find your own path to fulfill them, which may involve searching language and library documentation and difficult high-level design choices. If you haven’t done much open-ended programming, this will help you mature as a programmer–expect some growing pains to accompany your progression.

Prerequisites

Prior to taking the class, students must know how to program in at least one language, including knowing how to write conditionals, loops, and functions. Experience with only the R programming language has been found to be insufficient preparation; prior C++ experience is preferred. No particular course is required as a prerequisite. A computer science background is not necessary except for the programming skills requirement. The first phase of the project serves as a good litmus test–if you struggle with it, the course will seriously challenge you since subsequent assignments increase in difficulty.

Getting Help

Help is readily available during business hours; send an email or a Slack message and we’ll help you out, over email or chat for simple problems or video conference for more complicated questions. When you do ask for help, it’s expected that your code is clean and understandable–if you come to us with spaghetti code, you’ll be asked to untangle it and come back.

If you run into confusing material, typos, syntax errors, or similar, you can get extra credit by letting us know. You can also leave feedback anonymously.

Grading

The standard grading scale is used–A for 93% or more, A- for 90%-93%, B+ for 87%-90%, etc. Enough extra credit is offered that we don’t round up. The semester-long project accounts for about 55% of your grade, quizzes and tests for 25%, and everything else for 20%.

For assignments and projects, there is a 20% penalty for the first day late, then an additional 10% penalty for each subsequent day late with a maximum penalty of 80%. For quizzes, tests, and presentations, there is a 20% penalty per day late, with no credit after 4 days late. The final can’t be taken after the end of the semester.

Project rubrics aren’t iron-clad–we may award more points than indicated in some cases. For example, if your program fails to compile and would thus receive 5 points according to the assignment’s rubric, but fixing a single, obvious typo results in a correct program, you may actually receive significantly more points.

Contact us if you have exceptional circumstances.