Computer systems have gone from being the exclusive domain of a few scientists and engineers who used them to speed up manual calculations, to being so common that they go practically unnoticed. Many applications that where thought of as impossible to perform, such as flow simulation around aircrafts, cellular video phones and digital movie characters, have now become things that we use or encounter every day. Many of these inventions where somewhat easy to imagine in theory, but to actually implement them required raw computer power of astronomical proportions at that time. A few years later, things that were impossible could actually be performed.
This is of course due to the rapid development of the computer hardware, but also, to a very high degree, due to developments in algorithms and their implementations on contemporary computers. Computer software are bound to different rules than computer hardware. First of all, the lifespan of many software products is much longer than the lifespan of most hardware. This fact puts software in a situation where a lot of effort is put into maintenace which require that the software product is well structured, modular, well documented and built on standards. Unfortunally these notions often give rise to program code that cannot exploit all the latest features found in computer hardware. So there is a tradeoff between nice structured programs and fast programs.
In this course we will try to understand how to do this tradeoff. How shall we build good, structured software that can compile into fast code for modern microprocessors? To be able to do this, we need first to learn how to identify actual and potential performance bottlenecks. Second, we need tools and knowledge to be able to do something with the code that helps. In brief the course will cover