Computation and simulation are increasingly important in all aspects of
science and engineering. At the same time writing efficient computer programs
to take full advantage of current computers is becoming increasingly difficult.
Even laptops now have 4 or more processors, but using them all to solve
a single problem faster often requires rethinking the algorithm to introduce
parallelism, and then programming in a language that can express this parallelism.
Writing efficient programs also requires some knowledge of machine arithmetic,
computer architecture, and memory hierarchies.
Although parallel computing will be covered, this is not a class
on the most advanced techniques for using supercomputers, which these days
have tens of thousands of processors and cost millions of dollars. Instead,
the goal is to teach tools that you can use immediately on your own laptop,
desktop, or a small cluster. Cloud computing will also be discussed, and
students who don't have a multiprocessor computer of their own will still
be able to do projects using Amazon Web Services at very low cost.
Along the way there will also be discussion of software engineering tools
such as debuggers, unit testing, Makefiles, and the use of version control
systems. After all, your time is more valuable than computer time, and
a program that runs fast is totally useless if it produces the wrong results.
High performance programming is also an important aspect of high
performance scientific computing, and so another main theme of the course
is the use of basic tools and techniques to improve your efficiency as
a computational scientist.