This course aims to cover state-of-the-art methods in modern parallel computing on Graphics Processing Unit (GPU), supercomputing and code development with applications to natural sciences and engineering.
Learning objective
When quantitative assessment of physical processes governing natural and engineered systems relies on numerically solving differential equations, fast and accurate solutions require performant algorithms leveraging parallel hardware. The goal of this course is to offer a practical approach to solve systems of differential equations in parallel on GPUs using the Julia language. Julia combines high-level language conciseness to low-level language performance which enables efficient code development.
The course will be taught in a hands-on fashion, putting emphasis on you writing code and completing exercises; lecturing will be kept at a minimum. In a final project you will solve a solid mechanics or fluid dynamics problem of your interest, such as the shallow water equation, the shallow ice equation, acoustic wave propagation, nonlinear diffusion, viscous flow, elastic deformation, viscous or elastic poromechanics, frictional heating, and more. Your Julia GPU application will be hosted on a git-platform and implement modern software development practices.
Content
Part 1 - Discovering a modern parallel computing ecosystem - Learn the basics of the Julia language; - Learn how to solve diffusion, wave propagation and advection processes; - Implement efficient iterative algorithms; - Get started with software development tools: git, version control.
Part 2 - Developing your own parallel algorithms on GPUs - Implement wave propagation and porous convection; - Apply spatial and temporal discretisation (finite-differences, various time-stepper); - Understand the practical challenges of parallel computing: GPUs, multi-core CPUs; - Learn about main simulation performance limiters; - Implement software development tooling: unit tests, continuous integration (CI).
Part 3 - Multi-GPU computing projects - Understand the practical challenges of distributed parallel computing on multi-GPUs; - Implement shared (on CPU and GPU) and distributed memory parallelisation (multi-GPUs/CPUs); - Automatise the software tooling using remote runners.
Final projects - Apply your new skills in a final project; - Implement advanced physical processes (solid and fluid dynamic - elastic and viscous solutions).
Lecture notes
Digital lecture notes, interactive Julia notebooks, online material.
Literature
Links to relevant literature will be provided during classes.
Prerequisites / Notice
Completed BSc studies. Interest in and basic knowledge of numerics, applied mathematics, and physics/engineering sciences. Basic programming skills (in e.g. Matlab, Python, Julia); advanced programming skills are a plus.