HPC application development: C++

If you want to develop HPC applications in C++, you can consider following the following training sessions.

graph TD Best_practices_for_scientific_computing[Best practices for scientific computing] --> Version_control_with_git[Version control with Git] Best_practices_for_scientific_computing --> Linux_intro[Linux introduction] Linux_intro --> HPC_intro[HPC introduction] HPC_intro --> Containers_on_HPC[Containers on HPC] Best_practices_for_scientific_computing --> Scientific_Cpp[Scientific C++] Scientific_Cpp --> Cpp_software_engineering[C++ software engineering] Cpp_software_engineering --> Parallel_programming_with_STL_and_TBB[Parallel programming with STL and TBB] Cpp_software_engineering --> Parallel_programming_with_OpenMP[Parallel programming with OpenMP] Parallel_programming_with_OpenMP --> Parallel_programming_with_MPI[Parallel programming with MPI] Parallel_programming_with_STL_and_TBB --> Defensive_programming_and_debugging[Defensive programming and debugging] Parallel_programming_with_OpenMP --> Defensive_programming_and_debugging Parallel_programming_with_MPI --> Defensive_programming_and_debugging Defensive_programming_and_debugging --> Code_optimization[Code optimization] Parallel_programming_with_OpenMP -. optional .-> GPU_offloading_with_OpenMP[GPU offloading with OpenMP] Cpp_software_engineering -. optional .-> Kokkos[Kokkos] classDef optional fill:#f7f7f7,stroke:#777,stroke-dasharray: 4 4,color:#333 class GPU_offloading_with_OpenMP,Kokkos optional click Best_practices_for_scientific_computing "https://gjbex.github.io/Best-practices-for-scientific-computing/" "Best practices for scientific computing" click Version_control_with_git "https://gjbex.github.io/Version-control-with-git" "Version control with Git" click Linux_intro "https://gjbex.github.io/Training-sessions/linux_intro" "Linux introduction" click HPC_intro "https://gjbex.github.io/Training-sessions/hpc_intro" "HPC introduction" click Containers_on_HPC "https://gjbex.github.io/Containers-for-HPC/" "Containers on HPC" click Scientific_Cpp "https://gjbex.github.io/Scientific-C-plus-plus/" "Scientific C++" click Cpp_software_engineering "https://gjbex.github.io/C-plus-plus-software-engineering/" "C++ software engineering" click Defensive_programming_and_debugging "https://gjbex.github.io/Defensive-programming-and-debugging/" "Defensive programming and debugging" click Parallel_programming_with_STL_and_TBB "https://gjbex.github.io/Training-sessions/parallel_programming_with_stl_and_tbb" "Parallel programming with STL and TBB" click Parallel_programming_with_OpenMP "https://gjbex.github.io/Training-sessions/parallel_programming_with_openmp" "Parallel programming with OpenMP" click Parallel_programming_with_MPI "https://gjbex.github.io/Training-sessions/parallel_programming_with_mpi" "Parallel programming with MPI" click GPU_offloading_with_OpenMP "https://gjbex.github.io/OpenMP-GPU-offloading/" "GPU offloading with OpenMP" click Kokkos "https://gjbex.github.io/Heterogeneous-programming-with-Kokkos/" "Kokkos" click Code_optimization "https://gjbex.github.io/Code-optimization/" "Code optimization"

Dashed arrows indicate optional branches.

Start with the shared scientific-computing, Linux and HPC foundations if these are new to you. Then follow "Scientific C++" and "C++ software engineering" to build a maintainable application or library.

For parallelism, choose "Parallel programming with STL and TBB" for modern C++ shared-memory patterns, "Parallel programming with OpenMP" for directive-based shared-memory programming, and "Parallel programming with MPI" for distributed-memory systems.

For robust parallel development, continue with "Defensive programming and debugging" to learn how to test and debug shared-memory and MPI applications.

When accelerators are part of your target system, you can choose between "GPU offloading with OpenMP" and "Kokkos", depending on whether you prefer a directive-based approach or a C++ performance-portability library.

"Code optimization" is most useful after you have a correct CPU implementation, know which programming model you will use, and have the debugging skills to validate changes.