Fundamental techniques for programming computer systems, with an emphasis on obtaining good performance. Topics covered include: how to measure and understand program and execution and behaviour, how to get the most out of an optimizing compiler, how memory is allocated and managed, and how to exploit caches and the memory hierarchy. Furthermore, current trends in multicore, multithreaded and data parallel hardware, and how to exploit parallelism in their programs will be covered.