Best Practice in HPC Software Development
This course is designed for those with parallel programming experience who are embarking on a major software development project. The aim is to provide attendees with the skill-set to write efficient, robust and portable code, and the tools to assist in this process.
The course consists of the following elements:
- Hardware, Compilers and Optimization: To write efficient programs, we must have a good knowledge of the underlying computer architecture. We will discuss elements of computer architecture essential to the programmer, with an emphasis on the memory hierarchy and its effective use. We examine compiler usage and how to maximize its benefits. We will also look at ways to optimize your codes describing the key features that determine the performance of parallel codes.
- Tools for the Programmer: Here we will discuss two very important tools to help the HPC software development process. We will look at parallel debuggers, including the use of TotalView. Once your code is giving the correct result you need to analyze its performance to see where you should concentrate your optimization efforts. Following on we discuss how to profile your code and interpret the results.
- Parallel I/O Input and Output: (I/O) is often an under-considered part of a code but can severely limit its scalability. We will present MPI-IO, which allows a program to read and write to a single file from multiple processes. We will briefly look at the parallel I/O libraries NetCDF and HDF5. We also include a number of case studies to help illuminate the process.
- Testing and Benchmarking: Here the principles and requirements of the testing and benchmarking processes will be described. We discuss the theory of testing and how to benchmark your code. Particular attention will be paid to the construction and application of appropriate test cases for parallel codes.
- Portability and Maintainability: Firstly, we give guidance on how to ensure your code is portable. We will define portability, discuss useful tools and describe how to test for portability. Secondly, we address the issues of software maintenance and support. We cover source code control, build systems, validation and documentation.
- Practical Exercises: All elements of the course have hands on tutorial exercises. Attendees will also have the opportunity to work on their own codes.
Those who have experience of parallel programming and who are undertaking a major software development project.
Attendees should already be familiar with MPI programming. In particular they must have knowledge of the material covered by the Introduction to MPI course, i.e. with the use of point-to-point and collective communication in MPI and much of the content of the Advanced MPI course, specifically, MPI derived datatypes and MPI groups.
Attendees should be able to program in either Fortran or C and be familiar with working in a Linux/Unix environment (i.e., you should be able to connect to a machine remotely, use basic Linux/Unix commands, edit a source file and understand the elementary steps in compiling object files and creating executables).
After Course Attendees Will:
Attendees will be equipped with the knowledge and tools to be able embark on a large-scale parallel code development.
Please email us if you would like to attend this course.