高性能计算集群性能评估:HPL与HPCG基准测试实战指南
1. 项目概述为什么需要HPL与HPCG如果你在实验室、数据中心或者高性能计算HPC的圈子里待过一定对“Linpack”和“HPCG”这两个词不陌生。它们就像是计算集群的“体检报告”一个告诉你理论上的“肌肉力量”有多大另一个则告诉你在实际“负重工作”时的耐力如何。今天要聊的就是如何亲手给自家的计算集群做一次全面的“体检”——安装并运行HPLHigh Performance Linpack和HPCGHigh Performance Conjugate Gradient基准测试。HPL测试也就是我们常说的Linpack测试是TOP500超级计算机排行榜的官方指定“考题”。它通过求解一个大规模的稠密线性方程组来测试系统的双精度浮点峰值性能。简单来说它考验的是你的CPU以及GPU如果用了的话在理想状态下进行高强度科学计算比如流体力学、气候模拟时能跑多快。这个成绩就是大家津津乐道的“TFlops/s”每秒万亿次浮点运算。而HPCG测试则是近年来越来越受重视的“实战”测试。它模拟的是更贴近实际科学计算应用如偏微分方程求解、稀疏矩阵运算的场景对内存带宽、延迟和网络通信的敏感度远高于HPL。一个系统可能在HPL测试中拿到高分但在HPCG测试中表现平平这说明它的“偏科”严重理论峰值虽高但处理真实复杂问题时可能“有劲使不出”。所以同时安装和测试这两者意义就在于HPL告诉你系统的“天花板”在哪里而HPCG则告诉你这个“天花板”在实际应用中到底有多“好用”。这对于系统采购选型、性能调优、应用适配都至关重要。下面我就以一个典型的基于Intel CPU和MPI的Linux集群环境为例带你走一遍从零开始到拿到测试报告的完整流程。2. 环境准备与核心依赖解析在开始编译安装之前一个干净、一致且依赖完备的软件环境是成功的一半。很多人测试失败问题往往就出在环境准备这一步。2.1 系统与基础环境确认首先你需要一个Linux操作系统。CentOS/RHEL 7/8 或 Ubuntu 18.04/20.04 是HPC领域最常见的选择社区支持完善。确保你拥有系统的root权限或通过sudo可以安装软件。第一步更新系统并安装最基础的开发工具链# 对于CentOS/RHEL系列 sudo yum groupinstall -y Development Tools sudo yum install -y wget git cmake # 对于Ubuntu/Debian系列 sudo apt update sudo apt install -y build-essential wget git cmake这里的build-essential或Development Tools包含了gcc, g, make等编译核心工具。cmake是现代软件常用的构建工具后续会用到。2.2 数学库与并行环境选型这是整个测试的性能基石选型直接决定最终成绩。BLAS库HPL极度依赖基础线性代数子程序BLAS。绝对不要使用系统自带的参考实现如libblas性能极差。必须使用高度优化的实现Intel MKL在Intel CPU上性能最佳且安装集成方便。如果你是Intel平台这是首选。OpenBLAS开源免费在多种CPU架构上都有优秀表现是通用性最强的选择。BLIS另一个高性能开源BLAS库在某些架构上表现突出。MPI库用于在多节点、多核间进行并行计算。常见选择有OpenMPI功能全面社区活跃兼容性好。Intel MPI与Intel硬件和MKL结合更紧密在某些场景下性能可能略有优势。MPICH/MVAPICH2在InfiniBand等高速网络上可能有优化。我的选择与理由在本次演示中我选择OpenBLAS OpenMPI的组合。原因在于它们都是开源软件部署灵活不受特定厂商绑定且性能足以满足绝大多数测试和评估需求。如果你的集群是纯Intel环境且追求极限性能可以替换为Intel MKL Intel MPI。安装OpenBLAS和OpenMPI# 安装OpenBLAS (以源码编译为例获得最佳优化) wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.23.tar.gz tar -xzf v0.3.23.tar.gz cd OpenBLAS-0.3.23 make -j$(nproc) USE_OPENMP1 # 启用OpenMP支持充分利用多核编译 sudo make PREFIX/opt/OpenBLAS install # 将库路径添加到系统环境 echo /opt/OpenBLAS/lib | sudo tee /etc/ld.so.conf.d/openblas.conf sudo ldconfig # 安装OpenMPI (以源码编译为例) wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz tar -xzf openmpi-4.1.5.tar.gz cd openmpi-4.1.5 ./configure --prefix/opt/openmpi make -j$(nproc) all sudo make install # 将MPI路径添加到环境变量方便后续使用 echo export PATH/opt/openmpi/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/opt/openmpi/lib:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc注意编译OpenBLAS时USE_OPENMP1参数很重要它允许OpenBLAS内部使用多线程这对于在单节点多核上运行HPL测试至关重要。PREFIX指定了安装路径我习惯放在/opt下便于管理。3. HPL的编译、配置与实战测试HPL测试是重头戏配置过程较为繁琐但每一步都有其道理。3.1 获取源码与编译HPL的源码可以从Netlib官网获取。我建议使用一个稳定版本。wget http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz tar -xzf hpl-2.3.tar.gz cd hpl-2.3接下来是关键的编译配置环节。HPL使用setup目录下的模板文件来生成适合自己系统的Makefile。cp setup/Make.Linux_PII_CBLAS . # 复制一个最接近的模板 mv Make.Linux_PII_CBLAS Make.mycluster # 重命名为自己的配置现在用文本编辑器如vim打开Make.mycluster修改以下几个核心部分# 1. 指定架构和编译器 ARCH mycluster CC /opt/openmpi/bin/mpicc # 使用MPI包装的编译器 CCFLAGS $(HPL_DEFS) -O3 -marchnative -fomit-frame-pointer -funroll-loops -Wall -W -Wno-unused-parameter # -O3激进优化-marchnative针对当前CPU微架构优化这是性能关键。 # 2. 链接器设置 LINKER /opt/openmpi/bin/mpif77 # 使用MPI包装的Fortran编译器 LINKFLAGS $(CCFLAGS) # 3. 最重要的数学库路径 LAlib -L/opt/OpenBLAS/lib -lopenblas -lpthread -lm # 链接OpenBLAS库-lpthread用于线程-lm是数学库。 # 4. 顶层目录 TOPdir $(HOME)/hpl-2.3 INCdir $(TOPdir)/include BINdir $(TOPdir)/bin/$(ARCH) LIBdir $(TOPdir)/lib/$(ARCH)保存退出后开始编译make archmycluster编译成功后会在bin/mycluster/目录下生成可执行文件xhpl。3.2 HPL.dat参数配置详解这是HPL测试的“考题”参数设置决定了问题规模、如何划分数据、运行多久直接影响性能和结果的有效性。一个典型的HPL.dat文件如下我们逐行解析HPLinpack benchmark input file Innovative Computing Laboratory, University of Tennessee HPL.out output file name (if any) 6 device out (6stdout,7stderr,file) 1 # of problems sizes (N) 100000 Ns 1 # of NBs 256 NBs 0 PMAP process mapping (0Row-,1Column-major) 1 # of process grids (P x Q) 2 Ps 2 Qs 16.0 threshold 1 # of panel fact 2 PFACTs (0left, 1Crout, 2Right) 1 # of recursive stopping criterium 4 NBMINs ( 1) 1 # of panels in recursion 2 NDIVs 1 # of recursive panel fact. 1 RFACTs (0left, 1Crout, 2Right) 1 # of broadcast 1 BCASTs (01rg,11rM,22rg,32rM,4Lng,5LnM) 1 # of lookahead depth 1 DEPTHs (0) 2 SWAP (0bin-exch,1long,2mix) 64 swapping threshold 0 L1 in (0transposed,1no-transposed) form 0 U in (0transposed,1no-transposed) form 1 Equilibration (0no,1yes) 8 memory alignment in double ( 0)关键参数解析Ns (问题规模 N)这是线性方程组系数矩阵的阶数。N的大小必须保证总内存占用超过系统可用内存的80%以上否则测试的是缓存性能而非真实内存带宽。一个估算公式内存占用(字节) ≈ 8 * N²。例如N100000内存约需 8 * 100000² ≈ 74.5 GB。你需要根据测试节点的总内存来调整N。NBs (分块大小 NB)算法将大矩阵划分为NB x NB的小块进行处理。NB的大小对性能影响巨大它应该与CPU缓存大小、TLB等硬件特性匹配。通常需要尝试多个值如192, 224, 256, 384来寻找性能最优值。对于现代多核CPU256是一个不错的起点。Ps, Qs (进程网格 P x Q)指定如何将MPI进程排列成P行Q列的网格。必须满足P x Q 总的MPI进程数。例如如果你用4个节点每个节点16个核总进程数64那么P8Q8或P4Q16都是可能的组合。通常P和Q越接近即网格越方通信效率往往越高。PFACTs (面板分解算法)和RFACTs (递归面板分解)这些是算法内部实现选择。对于大多数系统使用2(Right-looking) 和1(Crout) 是稳健的选择。BCASTs (广播算法)数据分发的算法。1(1rM) 或5(LnM) 是常用选择与网络拓扑有关。配置心得第一次测试时可以先设置一个较小的N如5000和单节点快速验证环境和配置是否正确。正式测试时务必根据总内存计算N并系统地扫描NB和PxQ的组合以找到最佳性能点。这个过程可以写一个简单的shell脚本来自动化。3.3 单节点与多节点测试执行单节点测试共享内存 假设你的节点有32个物理核心。cd bin/mycluster # 使用32个MPI进程每个进程绑定一个物理核心 mpirun -np 32 --bind-to core --map-by core ./xhpl--bind-to core和--map-by core参数将每个MPI进程绑定到独立的CPU核心上避免操作系统调度带来的性能抖动这对获得稳定、可重复的结果至关重要。多节点集群测试 你需要准备一个主机文件如hostfile列出所有参与测试的节点及其可用槽位数通常为核心数。node01 slots32 node02 slots32 node03 slots32 node04 slots32然后使用MPI运行mpirun --hostfile hostfile -np 128 --bind-to core --map-by core ./xhpl重要提示确保所有节点间可以通过SSH无密码登录并且xhpl可执行文件、HPL.dat配置文件以及所依赖的库如OpenBLAS在所有节点上的路径完全一致。通常使用共享存储如NFS或同步脚本实现。4. HPCG的编译、配置与实战测试HPCG的安装测试流程与HPL类似但关注点不同。4.1 获取源码与编译HPCG通常也通过源码编译。wget http://www.hpcg-benchmark.org/downloads/hpcg-3.1.tar.gz tar -xzf hpcg-3.1.tar.gz cd hpcg-3.1HPCG使用CMake构建更加现代化。创建一个构建目录并配置mkdir build cd build cmake .. \ -DCMAKE_C_COMPILER/opt/openmpi/bin/mpicc \ -DCMAKE_CXX_COMPILER/opt/openmpi/bin/mpicxx \ -DCMAKE_Fortran_COMPILER/opt/openmpi/bin/mpif90 \ -DHPCG_WITH_MPION \ -DBUILD_SHARED_LIBSOFF \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/opt/hpcg这里明确指定了MPI编译器并开启了MPI支持。编译并安装make -j$(nproc) sudo make install编译后在/opt/hpcg/bin下会生成可执行文件xhpcg。4.2 HPCG参数配置与运行HPCG的运行参数主要通过命令行参数或环境变量指定比HPL的配置文件更灵活。一个典型的运行命令如下cd /opt/hpcg/bin mpirun -np 64 ./xhpcg --nx256 --ny256 --nz128 --rt3600参数解析--nx, --ny, --nz定义三维问题网格在每个维度上的大小。这三个数的乘积决定了问题的总规模。与HPL类似总规模需要足够大以占用大部分系统内存。通常建议设置nxnynz或接近且每个维度的值最好是8的倍数。--rt以秒为单位的目标运行时间。HPCG会迭代运行直到达到这个时间。官方推荐至少运行1800秒30分钟以上以获得稳定、有统计意义的结果。3600秒1小时是更稳妥的选择。-npMPI进程总数。HPCG同样支持OpenMP多线程。你可以结合MPI进程和OpenMP线程进行混合并行以更好地利用现代多核CPU的层次化并行架构。例如在4个节点、每个节点64核的系统中可以启动4个MPI进程每个节点1个每个MPI进程内部使用16个OpenMP线程。export OMP_NUM_THREADS16 mpirun -np 4 --map-by node:pe16 ./xhpcg --nx512 --ny512 --nz256 --rt3600--map-by node:pe16告诉OpenMPI每个节点启动一个MPI进程并为每个进程分配16个处理单元Processing Element这通常与OMP_NUM_THREADS配合使用。4.3 结果解读与性能指标HPCG运行结束后会在当前目录生成一个HPCG-*.txt的结果文件。文件中最重要的指标是HPCG GFlops/s。你需要将这个数值与系统的理论峰值性能HPL测出的或根据CPU型号计算的进行对比。HPL性能代表理想化、高度规则化计算下的极限速度。HPCG性能代表更真实、内存访问不规则、通信密集场景下的实际速度。HPCG效率 (HPCG GFlops / HPL GFlops) * 100%。这个百分比是衡量系统“实际可用性”的关键。一个均衡的HPC系统HPCG效率通常在5%到15%之间。如果效率过低如2%说明系统架构可能是内存带宽、网络延迟或拓扑存在瓶颈不适合运行类似风格的现实应用。5. 常见问题、性能调优与深度排查在实际操作中你几乎一定会遇到各种问题。这里记录了一些典型坑点和调优思路。5.1 编译与链接问题问题编译HPL时出现undefined reference to ‘ATL_*’或cannot find -lblas。排查这绝对是链接库路径问题。首先确认Make.mycluster中的LAlib设置是否正确指向了你安装的优化BLAS库如/opt/OpenBLAS/lib。然后使用ldd bin/mycluster/xhpl检查可执行文件依赖的库是否能被正确找到。如果库在非标准路径确保LD_LIBRARY_PATH环境变量已设置或已通过/etc/ld.so.conf.d/配置文件使其生效并执行了sudo ldconfig。问题运行mpirun时报错提示找不到命令或无法启动进程。排查首先确认OpenMPI已正确安装且其bin目录如/opt/openmpi/bin已加入PATH环境变量通过echo $PATH检查。其次在多节点运行时确保所有节点都安装了相同版本的MPI并且主节点能通过SSH无密码连接到所有计算节点。使用mpirun --hostfile hostfile -np 1 hostname进行简单测试。5.2 运行时报错与性能低下问题HPL运行立即崩溃或报“Segmentation fault”。排查内存不足检查你设置的N是否过大超过了所有节点物理内存总和。用free -h查看可用内存。确保N的设置使得总内存需求略小于可用内存。参数不合法检查P x Q是否等于总MPI进程数-np。检查NB是否为正整数且通常建议是2的幂或某些特定值如256。进程绑定冲突如果使用了--bind-to core但进程数超过了物理核心数会导致绑定失败。使用lscpu确认物理核心数。问题HPL测试性能远低于预期例如不到理论峰值的50%。调优思路扫描NB值这是提升HPL性能最有效的手段。写一个脚本让NB从64开始以32或64为步长递增到512或更大分别运行短测试小N记录性能。绘制性能随NB变化的曲线找到峰值点。优化进程网格PxQ在总进程数固定时尝试不同的P、Q组合。对于非均匀网络如NUMA架构可能需要让P或Q与NUMA节点数成倍数关系。检查CPU频率与功耗策略在Linux下使用cpupower frequency-info和cpupower frequency-set -g performance确保CPU运行在最高性能模式而不是节能模式。使用硬件性能计数器借助perf或vtune工具分析程序运行时的CPICycles Per Instruction、缓存命中率等定位瓶颈是在计算单元、内存还是前端。问题HPCG运行时间极长或性能异常低。排查与调优问题规模太小HPCG对内存带宽极度敏感。如果问题规模nxnynz太小数据完全在缓存中则测试的是缓存带宽而非内存带宽结果会虚高且不具代表性。务必确保总数据量远超最后一级缓存LLC的大小。内存分配不均在NUMA系统中如果进程的内存不是分配在其本地NUMA节点上会导致远程内存访问性能急剧下降。使用numactl命令或MPI的--map-by和--bind-to选项进行精细控制确保内存本地性。网络通信瓶颈HPCG的通信模式比HPL更复杂。确保集群使用了高性能网络如InfiniBand并且MPI库针对该网络进行了优化编译例如OpenMPI配置时启用了UCX支持。使用mpirun的--report-bindings参数查看进程与核心的绑定情况优化绑定策略以减少跨Socket或跨节点的通信。5.3 结果验证与报告生成HPL结果有效性验证HPL输出的最后会给出||Ax-b||_oo / ( eps * ||A||_1 * N )这个残差。这个值必须小于16.0通常远小于1.0才能证明计算结果是正确的。如果残差过大说明计算过程出现了数值不稳定结果不可信需要检查配置尤其是NB和算法参数或系统稳定性如内存错误。生成测试报告一份专业的测试报告应包含系统硬件配置CPU型号、核数、内存容量与通道数、网络类型。软件环境操作系统、编译器版本、MPI版本、数学库版本及关键编译选项。HPL和HPCG的详细配置参数完整的HPL.dat和命令行。最佳性能结果HPL GFlops HPCG GFlops及对应的参数组合。系统理论峰值根据CPU频率和FMA指令计算。HPL效率实测/理论峰值和HPCG效率HPCG/HPL。运行时的系统监控摘要如平均CPU利用率、内存占用、网络流量。完成这一整套从环境搭建、编译、配置、测试到调优和报告的过程你不仅得到了一组性能数据更重要的是深入理解了影响高性能计算系统实际表现的各种因素。这比单纯跑一个分价值要大得多。