ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

HPL与HPCG基准测试:从理论峰值到实际应用性能的完整评估指南

HPL与HPCG基准测试:从理论峰值到实际应用性能的完整评估指南 1. 项目概述为什么需要HPL与HPCG如果你在折腾高性能计算HPC或者刚拿到一台新服务器想摸摸它的“底”那你大概率听说过这两个名字HPL和HPCG。它们就像是给超级计算机做体检的“血压计”和“心电图”一个测峰值性能一个测实际应用潜力。HPL全称High-Performance Linpack是衡量系统理论浮点计算能力的黄金标准TOP500榜单就靠它排名。而HPCG全称High-Performance Conjugate Gradient则更贴近真实科学计算应用中的稀疏矩阵求解性能能反映出内存带宽、延迟对实际算力的影响。光跑一个HPL你看到的可能是一个漂亮的、理论上的“天花板”分数。但加上HPCG你才能知道这台机器在应对更复杂、数据访问模式更不规则的现实问题时到底能发挥出几成功力。对于系统管理员、HPC应用开发者甚至是采购硬件的决策者同时安装并测试这两者是评估系统综合性能、发现潜在瓶颈比如内存墙、通信效率的必备操作。这不仅仅是跑个分那么简单它关乎你后续所有计算任务的效率预估和资源调优。2. 环境准备与依赖解析在开始编译安装之前一个干净、一致且依赖完备的基础环境是成功的一半。很多人卡在编译错误上根源往往就是依赖没装全或者版本冲突。2.1 系统环境与基础工具首先确保你在一个典型的Linux HPC环境上操作比如CentOS/RHEL 7/8、Rocky Linux、Ubuntu 20.04/22.04 LTS等。你需要拥有sudo权限来安装系统级的开发包。核心的基础工具链必须就位编译器GCC建议7.3以上或Intel编译器套件icc/icpc/ifort。对于追求极致性能尤其是Intel平台后者通常是首选但GCC更通用。本文将以GCC为例兼顾通用性。MPI库消息传递接口用于多节点并行计算。主流选择有OpenMPI、MPICH和Intel MPI。OpenMPI因易用性和特性丰富更受欢迎。数学库这是性能的关键。BLAS基础线性代数子程序和LAPACK线性代数包的实现。强烈推荐使用高度优化的数学库如OpenBLAS、Intel MKL或AMD的AOCL。自行编译的Netlib BLAS/LAPACK性能会差好几个数量级。2.2 依赖包的安装不同的Linux发行版安装命令略有不同。以下分别给出基于YUMRHEL/CentOS/Rocky和APTUbuntu/Debian的示例。对于RHEL系系统sudo yum groupinstall -y Development Tools sudo yum install -y epel-release sudo yum install -y wget git make cmake gcc-c environment-modules sudo yum install -y openmpi-devel openblas-devel lapack-devel对于Ubuntu/Debian系系统sudo apt update sudo apt install -y build-essential wget git cmake sudo apt install -y libopenmpi-dev openmpi-bin libopenblas-dev liblapack-dev注意environment-modules或lmod包用于管理环境模块在大型HPC集群中管理多版本软件非常方便。如果是单机测试可以暂不安装但了解它是有益的。安装完成后建议进行快速验证which mpicc # 应返回MPI C编译器的路径如 /usr/bin/mpicc gcc --version # 查看GCC版本 mpirun --version # 查看OpenMPI版本2.3 数学库的选择与配置要点这里重点讲一下数学库。OpenBLAS是一个优秀的开源选择通过yum install openblas-devel或apt install libopenblas-dev安装后其库文件通常位于/usr/lib64/libopenblas.so或/usr/lib/libopenblas.so。你可以使用find /usr -name \libopenblas*.so*\来定位。如果你使用的是Intel处理器并安装了Intel oneAPI基础工具包那么MKL是性能更优的选择。你需要source MKL的环境变量脚本例如source /opt/intel/oneapi/setvars.sh。之后MKL的链接选项通常更复杂但可以通过mkl-link-line工具获取。为了简化我们后续示例将使用OpenBLAS因为它配置简单且性能足够好。记住数学库的路径在编译HPL和HPCG时会用到。3. HPL的安装与配置实战HPL的安装过程主要是下载、解压、根据你的系统架构和软件环境编写配置文件Makefile然后编译。3.1 获取源码与解压官方源码可以从Netlib获取但为了方便我们通常使用预打包的版本。cd ~ wget http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz tar -zxvf hpl-2.3.tar.gz cd hpl-2.33.2 详解Makefile的配置HPL的编译精髓全在setup目录下的模板Makefile里。我们需要复制一个模板并修改它。cp setup/Make.Linux_PII_CBLAS . mv Make.Linux_PII_CBLAS Make.myconfig现在用文本编辑器如vim或nano打开Make.myconfig。你需要修改以下几个关键部分1. 指定架构和编译器ARCH Linux_PII_CBLAS # 这部分通常不用大改它主要是一个标识符。2. 设置顶层目录TOPdir /home/your_username/hpl-2.3 # 确保这里是你解压HPL的绝对路径。3. 配置MPI库MPdir /usr/lib64/openmpi # MPI库的安装路径。如果你的OpenMPI库路径不同请修改。 # 可以使用 find /usr -name \mpi.h\ 来定位include目录其上级lib目录通常就是MPdir。 MPinc -I$(MPdir)/include MPlib $(MPdir)/lib/libmpi.so4. 配置数学库最关键的一步LAdir /usr/lib64 # OpenBLAS库的路径。如果库文件在/usr/lib则改为 /usr/lib。 LAinc # OpenBLAS通常不提供独立的头文件其接口通过CBLAS标准这里可以留空或指向/usr/include。 LAlib -L$(LAdir) -lopenblas -lm # -lopenblas 链接OpenBLAS -lm 链接数学库。5. 调整编译器与编译选项CC mpicc CCFLAGS $(HPL_DEFS) -O3 -marchnative -fomit-frame-pointer -funroll-loops -Wall # -O3 激进优化-marchnative 针对当前CPU微架构优化-funroll-loops 循环展开。 LINKER mpicc LINKFLAGS $(CCFLAGS)实操心得-marchnative是一个双刃剑。它能为你的当前CPU生成最优代码但编译出的二进制可能无法在其他不同型号的CPU上运行。如果你需要在异构集群上分发可执行文件应将其替换为更通用的选项如-msse4.2 -mavx2根据你的集群所有节点共有的指令集来定。3.3 编译与验证配置完成后保存文件开始编译make archmyconfig # 注意这里的‘arch’参数对应你配置文件的‘Linux_PII_CBLAS’部分但实际使用的是我们重命名的Make.myconfig。 # 更规范的做法是创建一个以‘Make.’开头的文件如‘Make.Linux_MyPC’然后执行 make archLinux_MyPC。如果一切顺利你将在bin/myconfig/目录下找到编译好的可执行文件xhpl。你可以先在一个小规模配置下快速测试它是否能运行cd bin/myconfig/ mpirun -np 4 ./xhpl # 使用4个MPI进程运行如果没有HPL.dat配置文件它会报错并退出这至少说明可执行文件是好的。4. HPCG的安装与配置实战HPCG的安装流程与HPL类似但它的配置更现代化通常使用CMake。4.1 获取源码HPCG的源码托管在GitHub上。cd ~ git clone https://github.com/hpcg-benchmark/hpcg.git cd hpcg4.2 使用CMake进行配置与编译HPCG推荐使用CMake进行跨平台构建。创建一个构建目录并进入mkdir build cd build接下来是关键的CMake配置命令。你需要指定MPI编译器、数学库和优化级别。cmake .. \ -DCMAKE_C_COMPILERmpicc \ -DCMAKE_CXX_COMPILERmpicxx \ -DCMAKE_Fortran_COMPILERmpif90 \ -DHPCG_ENABLE_MPION \ -DHPCG_WITH_BLASON \ -DBLAS_LIBRARIES/usr/lib64/libopenblas.so \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_CXX_FLAGS\-O3 -marchnative\ \ -DCMAKE_C_FLAGS\-O3 -marchnative\参数解析-DCMAKE_*_COMPILER明确告诉CMake使用MPI包装器作为编译器。-DHPCG_ENABLE_MPION启用MPI并行。-DHPCG_WITH_BLASON和-DBLAS_LIBRARIES链接BLAS库。这里直接指定了OpenBLAS库的完整路径。-DCMAKE_BUILD_TYPERelease启用Release级别的优化。-DCMAKE_*_FLAGS传递额外的优化编译选项。执行CMake后如果配置成功会生成Makefile。然后进行编译make -j$(nproc) # 使用所有CPU核心并行编译加快速度。编译完成后在build/bin/目录下会生成hpcg可执行文件。4.3 为HPCG生成问题规模配置文件HPCG需要一个输入文件来定义问题规模、运行时间等参数。源码中提供了示例cd ~/hpcg cp setup/sample-hpcg.dat ./hpcg.dat你需要编辑这个hpcg.dat文件。关键参数有LocalDomainDimensions x y z: 每个MPI进程处理的局部三维网格大小。x*y*z决定了单进程内存消耗。例如104 104 104总网格点约112万。Runtime: 期望的基准测试运行时间秒。HPCG会迭代运行直到达到这个时间。建议设置为60-300秒太短可能热身不充分太长则耗时。NumThreads: 如果编译时启用了OpenMP这里可以设置线程数。我们目前未启用设为1。一个适用于单节点、内存适中的配置示例HPCG benchmark input file Sandia National Laboratories; University of Tennessee, Knoxville 104 104 104 605. 测试执行与结果分析安装完成真正的挑战在于如何设计测试并正确解读结果。5.1 HPL测试配置与运行HPL的行为由HPL.dat文件控制。在bin/myconfig/目录下创建一个新的HPL.dat。你可以从源码的setup目录下复制一个例子来修改。cd ~/hpl-2.3/bin/myconfig cp ../../setup/HPL.dat .编辑HPL.dat以下是一个针对单节点比如有16个物理核心的简化配置示例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) 20000 Ns 1 # of NBs 256 NBs 0 PMAP process mapping (0Row-,1Column-major) 1 # of process grids (P x Q) 2 Ps 8 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的大小决定了测试的强度和内存占用。一个经验法则是总内存占用约为8 * N^2字节双精度。对于一台有64GB内存的服务器可以尝试设置N使得8*N^2接近但不超过0.8倍总内存。例如N20000时内存约8*20000^2 ≈ 3.2GB这显然太小无法压测出峰值。你需要不断增大N直到运行时间合理几分钟到一小时且系统内存使用率较高。可以尝试N50000, 80000等。NBs: 分块大小。通常设置为256或更大是缓存友好的一个值。P x Q: 进程网格。P * Q应等于你使用的MPI进程总数。例如你用16个进程可以设置为2 8或4 4。不同的网格形状可能影响通信效率可以稍作尝试。运行测试假设使用16个MPI进程mpirun -np 16 ./xhpl程序会输出详细的迭代过程最终在末尾给出性能结果核心是这一行WR11C2R4 20000 256 2 8 60.70 2.199e02其中2.199e02就是性能单位是Gflops每秒十亿次浮点运算。将其乘以1000就是Tflops。5.2 HPCG测试运行HPCG的运行相对简单因为它会自动适应进程数。进入构建目录运行cd ~/hpcg/build/bin mpirun -np 16 ./hpcg程序会读取当前目录下的hpcg.dat配置文件开始迭代计算。运行结束后它会在标准输出和生成的HPCG-Result-*.txt文件中报告结果。关注的核心指标是HPCG Gflops。这个值会远低于HPL的峰值。一个健康的系统HPCG性能通常能达到HPL峰值的1%到10%之间。比例越高说明系统在应对不规则内存访问时效率越好。5.3 结果解读与性能瓶颈初判将两个测试结果放在一起看HPL Tflops: 代表了你的系统在理想、规整、计算密集型任务下的理论峰值能力。它受CPU主频、核心数、AVX指令集利用率影响最大。HPCG Gflops: 代表了系统在更真实、数据访问密集型任务下的实际可持续性能。它极度依赖内存带宽和延迟。对比分析如果HPCG/GFLOP与HPL/TFLOP的比值非常低比如0.5%这可能是一个强烈的“内存墙”信号。意味着你的CPU计算单元经常在等待数据从内存中送来。可能的原因包括内存频率低、通道数未满配比如该用四通道只插了两条、或者NUMA架构下进程绑核不佳导致跨NUMA节点访问内存。如果HPL本身跑分就远低于预期根据CPU型号的理论峰值估算则可能问题出在编译器优化选项不对、数学库未正确链接或版本不佳、进程绑核导致缓存失效、或者BIOS里能效模式未关闭如关闭了Turbo Boost或运行在低功耗模式。6. 常见问题排查与性能调优技巧在实际操作中你几乎一定会遇到各种问题。这里记录一些典型的坑和解决方法。6.1 编译与链接错误问题1编译HPL时找不到cblas.h或blas.h。原因与解决这通常是因为LAinc路径没设对或者系统安装的OpenBLAS不提供独立的CBLAS头文件。OpenBLAS的符号通常直接包含在libopenblas.so里。可以尝试在Make.myconfig中将LAinc设为-I/usr/include/openblas如果该目录存在。更常见的方法是安装openblas-devel或libopenblas-dev包它通常会提供头文件。然后使用find /usr -name \cblas.h\定位并将路径填入LAinc。如果实在找不到可以注释掉HPL源码中include的cblas.h行不推荐或者从Netlib下载标准CBLAS头文件放到本地目录并包含。问题2运行xhpl或hpcg时提示libopenblas.so.0: cannot open shared object file。原因与解决动态链接库路径未找到。解决# 临时添加库路径到当前shell export LD_LIBRARY_PATH/usr/lib64:$LD_LIBRARY_PATH # 或者永久添加将上行写入 ~/.bashrc更根本的办法是检查/etc/ld.so.conf.d/下的配置文件确保包含OpenBLAS库的路径然后运行sudo ldconfig更新缓存。6.2 运行时错误与性能低下问题3MPI运行时错误如ORTE was unable to reliably start one or more daemons。原因与解决常见于OpenMPI环境。可能的原因和尝试方案SSH免密登录未配置在多节点运行时主节点必须能免密SSH到所有计算节点。单节点运行时也可能需要本地免密。主机名解析问题确保/etc/hosts文件正确包含了本机的主机名和IP映射。使用--allow-run-as-root在docker容器或某些环境下可能需要mpirun --allow-run-as-root -np ...。指定主机文件单机测试可以显式指定mpirun --host localhost:16 -np 16 ./xhpl。问题4HPL运行速度慢得离谱远低于预期。排查思路检查N的大小N太小问题规模完全在CPU缓存内无法体现内存带宽且启动开销占比高。逐步增加N观察Gflops是否上升并趋于稳定。检查进程绑定如果不做绑核操作系统可能会在核心间迁移进程破坏缓存局部性。使用mpirun的绑定参数例如对于OpenMPImpirun -np 16 --bind-to core --map-by core ./xhpl。检查CPU频率运行watch -n 1 \cat /proc/cpuinfo | grep MHz\观察所有核心是否运行在标称的高频Turbo Boost下。如果在BIOS或OS中设置了节能模式性能会大打折扣。在BIOS中关闭节能选项如C-States, P-States在Linux中使用performance调速器sudo cpupower frequency-set -g performance。检查数学库确认xhpl链接的是高性能数学库。使用ldd xhpl | grep blas查看。如果链接的是libblas.so.3Netlib的参考实现性能会极差。问题5HPCG运行报错或结果异常。排查思路内存不足HPCG对内存需求较高。确保LocalDomainDimensions三个数的乘积乘以8双精度再乘以进程数不超过系统可用物理内存的80%。可以从小规模开始测试。运行时间太短Runtime设置太短如10秒程序可能刚热身就结束了结果不稳定。建议至少60秒。MPI进程数与网格大小不匹配HPCG对进程数有要求最好是2的幂次方并且三维网格在每个维度上的划分要合理。如果进程数不能很好地被网格大小整除可能会出错或性能极差。参考官方文档调整LocalDomainDimensions。6.3 进阶调优建议当你完成了基本测试想要挖掘最后10%的性能时可以考虑NUMA控制在多路CPU多NUMA节点的服务器上默认的内存分配策略可能导致进程访问远程内存。使用numactl进行绑核绑内存。例如对于双路系统可以尝试让一半进程绑定到第一个CPU和它的内存另一半绑定到第二个。# 假设有2个NUMA节点每个节点16核 mpirun -np 16 numactl --cpunodebind0 --membind0 ./xhpl : -np 16 numactl --cpunodebind1 --membind1 ./xhpl这需要根据你的具体硬件拓扑来设计。尝试不同的数学库和编译器用Intel MKL替换OpenBLAS并用Intel编译器重新编译在Intel CPU上通常能获得最佳性能。对于AMD CPU则可以尝试AMD的AOCL库。调整HPL的NB、P、Q参数进行一个参数扫描的小实验。固定N尝试不同的NB128, 192, 256, 384, 512和不同的PxQ网格组合保持P*Q总进程数记录性能找到最优组合。这个过程可以写个简单的shell脚本自动化。安装和测试HPL/HPCG的过程本身就是对HPC系统软硬件栈的一次深度遍历。从编译器、MPI、数学库的配置到操作系统内核参数、BIOS设置的了解再到最后对性能数据的解读每一步都藏着学问。我第一次跑通HPL看到那个Tflops数字时感觉只是开始。后来对比了HPCG的结果才真正意识到内存子系统对实际应用的影响有多大。调优的过程更像是在解一个多维度的方程每一个参数都可能牵一发而动全身。我的建议是做好实验记录每次只改变一个变量耐心地对比你对你手中系统的理解会越来越透彻。
返回列表