Skip to main content


Course notes

Course notes are available through a virtual learning environment, the portal for which can be found here

Course overview

The Autumn Academy will cover the following courses. In addition there will be several small group activities designed to span these courses, and a series of plenary lectures from international experts that will illustrate HPC research in action.

Programming Languages (C or Fortran)

Parallel courses will be run in both Fortran and C; students will choose one stream. Teaching in other parts of the Academy will illustrate examples with both languages. The Fortran course is is a basic introduction to modern Fortran. At the end of the course, students should be able to write significant programs in Fortran, and to be able to work on existing programs written in modern Fortran (i.e. in the Fortran 90/95 style). It will not cover the superseded features of Fortran 77, or the newer or more advanced aspects.

Performance Programming

Designed to teach students to think about and explore factors that affect the performance of their code. Relevant factors include compiler, operating system, hardware architecture, and the interplay between them. Emphasis will be on the general principles of performance measurement, not the specific packages being used. Includes familiarisation with basic serial debugging and profiling tools

Parallel Architectures

This course will introduce shared-memory and distributed-memory HPC architectures and programming models and algorithms; basic parallel performance measurement and Amdahl’s law. It will also cover the concept of communicating parallel processes: synchronous/ asynchronous; blocking/ non-blocking. Basic concepts regarding data dependencies and data sharing between threads and processes will be introduced using pseudocode exercises and thought experiments


OpenMP model, initialisation, parallel regions and parallel loops; shared and private data; loop scheduling and synchronisation. By the end, students should be able to modify and run example programs on a multi-core system, and understand the performance characteristics of different loop scheduling options


This course covers almost all of the MPI features used in scientific applications, for C, C++ and Fortran. The topics include message- passing and MPI concepts, the use of MPI, MPI's datatypes, collective operations, blocking and non-blocking point-to-point messages, subsets of processes, practical guidelines and problem decomposition. By the end, students should be able to modify and run an example program on a distributed-memory system and understand its basic performance characteristics.

Practical Programming

This will review the material from the entire course, compare and contrast different programming approaches and place the course in the wider context of computational science as a research discipline. It will also outline other important areas in parallel software design and development that are beyond the scope of this initial academy. The course will include: comparison of parallel models and their suitability for different architectures; basics of parallel program design; use of packages and libraries; the HPC ecosystem in the UK, Europe and worldwide.

Numerical Analysis

Students will learn the fundamentals in algorithm design such as robustness, convergence, error testing and computational complexity, and also become aware of overflow and underflow. Specific algorithms will be introduced for linear systems and interpolation with polynomials, as well as splines and numerical solutions to ODEs. A short outlook on numerical methods for PDEs will be given.


An overview of how a computer operates at a hardware level will be presented, with the intention of making it clearer why certain programming techniques improve performance, often dramatically. This overview covers pipelined CPUs, cache memory, virtual memory, pages and TLBs, and the basic architecture of parallel computers.

Computer Arithmetic

This lecture will describe how computers store and process integers and floating point numbers (including complex numbers), and the exceptions that might arise, what they mean and what may happen. The intent is to explain how modern computers handle numbers, and how to get reliable answers for a reasonable amount of effort.

Software Design

This short course describes the software engineering principles and techniques needed to develop large or complex codes, or to write applications that will be used and worked on by other people or over a long time (years). It includes some of the design and coding techniques that can make debugging easier (sometimes even semi-automatic), and reduce the overall development and maintenance effort by spending more effort on design and coding.