Programming for High Performance An Introduction Many interesting problems in science and technology require massive computational power to investigate them. Gene analysis, weather prediction, and wind tunnel simulations are popular examples. High performance computing facilities are located in computing centers of universities and research laboratories and are not as easily accessible and usable as workstations. The concepts of how to use them efficiently are therefore not common knowledge. This lecture will give an introduction into programming for high performance. We will at first look at the hardware aspects of modern supercomputers and classify their architectural characteristics. Second, paradigms of parallelization will be discussed. The concrete way to bring a program to a parallel computer depends on the architecture of the machine, the structure of the problem, and the programming concept chosen. Usually, the first two factors are fixed and we are free to select our favorite programming concept in dependence of both of them. Therefore, we will discuss programming concepts in detail. We can distinguish message passing based programming, shared memory based programming and the data-parallel programming model. The lecture will give an introduction into all three of them and compare their applicability. At the end of the lecture the student should be able to answer the following question: I have a given problem and my computing center has a high performance computer. How do I write a program to use this resource efficiently? The lecture is oriented towards computer scientists and researchers in applied sciences who want to introduce high performance computing to their field. The presented material is also a good starting point for those who are interested in architectural aspects of parallel hardware and in aspects of parallel programming languages. Requirements: Basic programming capabilities. Slides will be available for printing.