HPC CookBook¶
这是 @bowling233 在学习高性能计算(High Performance Computing, HPC)过程中的一些笔记和心得。希望我的笔记既能够帮助新手快速入门,又能够让有经验的人快速找到自己需要的资料。
这本笔记的组织架构¶
mindmap
root((高性能计算<br/>HPC))
编译系统
文件格式
构建工具
包管理器
并行编程
进程级并行<br/>MPI
线程级并行
OpenMP
Pthreads
C++11 Threads
CUDA 编程
性能分析
体系结构
性能优化
竞赛
功耗控制
运维
硬件
集群管理
虚拟化
在我个人看来,HPC 的学习(和实际比赛)所需的知识点和技能可以构建和优化两个部分:
构建¶
项目的构建与管理或许不是 HPC 中最重要的部分,但一定是最烦人的部分。构建的方式极大依赖于平台环境和基础设施,需要不断在实操中积累经验。这一部分的工作会有点像 Linux 服务器运维。
- 基础设施
- 网络基础设施
- Infiband
- 存储基础设施
- NFS
- 资源管理
- Slurm
- 虚拟化方案
- Docker
- Singularity Container
- 网络基础设施
- 包管理器/构建工具
- 从源码编译构建
- Spack
- Conda
- GNU Autotools
- CMake
基础设施一般是开箱即用的,由集群管理员维护。HPC 程序向基础设施发起请求,由基础设施分配资源,我们只需要知道怎么为程序指定资源需求即可。包管理器/构建工具则是我们需要掌握的,需要理清楚
优化¶
优化是 HPC 中最重要的部分,也是最有挑战性的部分。这需要对几种并行编程模型有深入的理解,并且对自己使用的硬件架构有深入的了解,不同的实现和硬件架构可能需要采取不同的优化方案。优化主要在两个层面进行:代码层面和运行层面。
- 代码优化
- 三大并行编程模型
- MPI
- OpenMP
- CUDA
- 常见实现、编译器和工具链对应的优化策略
- GCC(OpenMPI)
- Intel(Intel MPI)
- NVIDIA(NVCC)
- 三大并行编程模型
代码优化的目标是编写具有可扩展性的代码。可扩展性是指,随着计算资源的增加,代码的性能也能够线性(甚至更好地增长)。在不考虑实现的阶段,我们需要按照对应编程模型的最佳实践编写代码。在考虑实现的阶段,我们需要根据实现的特点和硬件架构的特点,针对性地优化代码,比如采用特定的指令集等。
- 运行优化
- CPU 计算(MPI)
- 绑核
- 节点、进程、线程拓扑
- GPU 计算
- SM、Warp 调度
- CPU 计算(MPI)
运行优化一定程度上是不断的尝试,探索在如何最大化利用硬件资源。