Skip to content

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 调度

运行优化一定程度上是不断的尝试,探索在如何最大化利用硬件资源。