本帖最后由 ggdh 于 2026-8-4 15:56 编辑
双路 AMD EPYC 9B45 上 CP2K 2026.2 编译与性能横评
10 种可用编译栈,5 种 MPI/OpenMP 布局,4 类负载,800 次直接实测
先说结论
1. 综合表现最好的通用版本是 G3:GCC 14.4 + Intel MPI 2021.18 + OpenBLAS 0.3.33,推荐从 64 MPI x 4 OpenMP 起步。
2. DBCSR 小矩阵稀疏乘法专项最快的是 A1:GCC 14.4 O3 + MPICH 5.0.1 + pure AOCL 5.3,最佳布局为 32 x 8。
3. 256 x 1 的纯 MPI 布局在本组测试中没有赢过;128 x 2 普遍好于 256 x 1,但多数完整 CP2K 负载继续减至 64 x 4 更快。
4. MKL 版本在本机并非普遍占优,尤其 DBCSR 明显落后;数学库优劣高度依赖具体负载。
5. ifx 编译的版本虽然能够正常退出并报告 SCF 收敛,但多线程 HFX 重复计算能量不稳定,因此没有进入性能排名。
一、测试目的与比较口径
这次测试的目标不是做严格的单因素因果分析,而是在同一台节点上寻找实际可用且最快的完整 CP2K 软件栈。因此编译器、MPI、数学库、优化级别和 MPI Fortran 接口允许同时变化。表中的结论可以说明“G3 这个完整版本比 N1 快”,但不能把全部差异单独归因于 Intel MPI、OpenBLAS 或某一个编译选项。
所有进入最终排名的版本均使用同一组输入、相同物理核心数、相同绑核原则、相同计时和重复策略,并先通过多线程 HFX 正确性门槛。
二、硬件与系统条件
| 项目 | 实测条件 | | 处理器 | 2 x AMD EPYC 9B45 128-Core Processor | | 核心与线程 | 每路 128 核,共 256 个物理核;SMT 关闭,Thread(s) per core = 1 | | NUMA | 2 个 NUMA node;CPU 0-127 属于 NUMA 0,CPU 128-255 属于 NUMA 1 | | 缓存 | L1d 12 MiB,L1i 8 MiB,L2 256 MiB,L3 1 GiB(lscpu 汇总值) | | 内存 | 754 GiB 可见内存,4 GiB swap;测试前无内存压力 | | 操作系统 | Rocky Linux 9.5,kernel 5.14.0-503.23.2.el9_5.x86_64 | | CPU 频率策略 | amd-pstate,governor = performance,boost enabled | | CP2K | CP2K 2026.2,source revision c92cc08 |
三、参与排名的十个完整软件栈
| ID | 编译器及优化 | MPI | 数学库 | 关键区别 | | G0 | GCC 11.5,O2,mtune=native | OpenMPI 5.0.10 | OpenBLAS 0.3.33 | 最初的 GNU 基线版本 | | G1 | GCC 14.4,O2,mtune=znver5 | OpenMPI 5.0.10 | OpenBLAS 0.3.33 | 升级 GCC 的 OpenMPI 版本 | | G2 | GCC 14.4,O2,mtune=znver5 | MPICH 5.0.1 | OpenBLAS 0.3.33 | 与 G1 主要区别为 MPI | | G3 | GCC 14.4,O2,mtune=znver5 | Intel MPI 2021.18 | OpenBLAS 0.3.33 | MPI_F08=OFF 兼容构建;综合冠军 | | G4 | GCC 14.4,O2,mtune=znver5 | MPICH 5.0.1 | AOCL 5.3 路线 | 运行时仍含 OpenBLAS,不是 pure AOCL | | G5 | GCC 14.4,O2,mtune=znver5 | MPICH 5.0.1 | Intel MKL 2026.1 | 早期 MKL 路线 | | N1 | GCC 14.4,O3,march/mtune=znver5 | MPICH 5.0.1 | OpenBLAS 0.3.33 | Binutils 2.46.1;受控 GNU 基线 | | A1 | GCC 14.4,O3,march/mtune=znver5 | MPICH 5.0.1 | pure AOCL 5.3 | 无 OpenBLAS 污染;DBCSR 冠军 | | M0 | GCC 14.4,O3,march/mtune=znver5 | MPICH 5.0.1 | OpenBLAS 0.3.33 | 与 N1 相近,但 MPI_F08=OFF | | K1 | GCC 14.4,O3,march/mtune=znver5 | MPICH 5.0.1 | Intel MKL 2026.1 | 受控 O3 MKL 版本 |
G1、G2、G4 和 G5 的有效编译 flags 是 O2 + mtune=znver5;N1、A1、M0 和 K1 使用 O3 + march=znver5 + mtune=znver5,并在私有构建环境中统一使用 GNU Binutils 2.46.1。这里按实际 toolchain.env 记录,而不是只根据安装目录名称推断。
四、测试负载
| 简称 | 输入与主要计算特征 | 主要压力 | | GGA | H2O-gga.inp;64 个水分子(192 原子),PBE/GPW,280 Ry,10 步 NVE MD | 常规 Quickstep DFT、SCF、FFT 和力计算 | | Hybrid | H2O-hyb.inp;64 个水分子,PBE0-like 25% HF,ADMM,截断 HFX,单点 ENERGY | 多线程精确交换、积分与通信 | | Diagonalization | diag_cu144_broy.inp;有效 144 个 Cu 原子,PBE+rVV10,标准对角化、Broyden mixing、电子展宽 | ScaLAPACK/ELPA、稠密线性代数与通信 | | DBCSR | dbcsr.inp;3 组 12800-13800 阶稀疏块矩阵乘法,稀疏度 0.70,每组循环 3 次 | DBCSR、小块矩阵 kernel 与线程并行 |
五、运行、绑核与统计方法
- 测试五种占满 256 个物理核的布局:256x1、128x2、64x4、32x8、16x16,其中前一数字为 MPI rank 数,后一数字为每 rank 的 OpenMP thread 数。
- 每个“负载 x 编译版本 x 布局”重复 4 次,并轮换版本运行顺序,降低固定顺序与温度漂移造成的偏差。
- 共 4 x 10 x 5 x 4 = 800 次有效运行,形成 200 个独立比较单元;每个单元均有 4 次有效值,无超时、异常退出或缺项。
- 表中报告 CP2K 自身计时器的中位数,单位为秒;wall time 同时留档但不用于主排名。
- 每次运行前要求节点 idle 不低于 95%,且没有其他 cp2k.psmp 进程;测试前后记录 Tctl。
- 数学库内部线程固定为 1,避免 BLAS 再嵌套开线程。
统一 OpenMP 和数学库环境:
- export OMP_NUM_THREADS=<threads>
- export OMP_PLACES=cores
- export OMP_PROC_BIND=close
- export OMP_STACKSIZE=512M
- export OPENBLAS_NUM_THREADS=1
- export BLIS_NUM_THREADS=1
- export MKL_NUM_THREADS=1
- export MKL_DYNAMIC=FALSE
- ulimit -s unlimited
- ulimit -n 65536
复制代码
MPI 外层绑定:
- # OpenMPI
- mpiexec -n <ranks> --map-by ppr:<ranks>:node:PE=<threads> --bind-to core
- # MPICH
- mpiexec -n <ranks> -bind-to core:<threads>
- # Intel MPI
- export I_MPI_PIN=1
- export I_MPI_PIN_DOMAIN=omp
- export I_MPI_PIN_ORDER=compact
- mpiexec -n <ranks> -ppn <ranks>
复制代码
三种 MPI 的命令语法不同,但在节点名称上已经验证为相同的无重叠物理核覆盖。以 64x4 为例,rank r 获得 CPU 4r 到 4r+3,四个 OpenMP worker 各自固定在其中一个单核 affinity mask;256 个线程合计覆盖 CPU 0-255,没有重复占核或迁移。
六、正确性门槛
性能测试前,所有候选版本先在 64x4 下重复运行 5 次 Hybrid 输入。要求 5 次均正常结束、SCF 收敛、能量重复跨度不超过 1e-10 Ha,同时相对 GNU 受控基准的最大偏差不超过 1e-7 Ha。十个入选版本全部通过。
| 检查项目 | 最终结果 | | 最终矩阵 GGA 能量总跨度 | 2.728e-12 Ha | | 最终矩阵 Hybrid 能量总跨度 | 5.642e-09 Ha,低于 1e-7 Ha 接受线 | | 最终矩阵 Diagonalization 能量总跨度 | 3.638e-12 Ha | | ifx I0,64x4 Hybrid 五次跨度 | 1.527e-3 Ha,拒绝 | | ifx I2(O3)五次跨度 | 3.291e-3 Ha,拒绝 | | ifx I3(Fortran O2)五次跨度 | 4.012e-4 Ha,拒绝 |
ifx 问题的范围目前限定为“该版本 CP2K 的多线程 HFX 路径”:单 OpenMP thread、GGA 和 diagonalization 可以稳定,但 KMP_DETERMINISTIC_REDUCTION=true 和把 Fortran 从 O3 降为 O2 都没有修复。由于程序会以 exit code 0 正常退出,这类问题如果只看运行是否结束会被漏掉。
七、完整性能矩阵
下列全部数字均为 4 次有效运行的 CP2K time 中位数,单位为秒。每张表的列顺序一致:256x1、128x2、64x4、32x8、16x16。红色粗体为该负载的全局最快值。
7.1 GGA:64 个水分子 PBE/GPW,10 步 MD
| 版本 | 256x1 | 128x2 | 64x4 | 32x8 | 16x16 | | G0 | 7.4265 | 6.2200 | 5.7185 | 6.8295 | 8.7195 | | G1 | 7.2460 | 6.2075 | 5.6845 | 6.8180 | 8.7245 | | G2 | 7.1275 | 6.4235 | 5.5530 | 6.9915 | 8.8370 | | G3 | 6.5075 | 5.9645 | 4.9080 | 5.9320 | 8.4870 | | G4 | 7.2010 | 6.4060 | 5.5520 | 7.0025 | 9.0000 | | G5 | 7.7110 | 6.9955 | 6.0655 | 7.4330 | 9.5530 | | N1 | 7.1935 | 6.3620 | 5.5700 | 6.9790 | 8.7975 | | A1 | 7.2120 | 6.3715 | 5.5310 | 7.0545 | 8.8920 | | M0 | 7.3045 | 6.3805 | 5.5420 | 6.9225 | 8.7810 | | K1 | 7.7510 | 7.0735 | 5.9955 | 7.4165 | 9.5400 |
7.2 Hybrid:64 个水分子,25% HF + ADMM
| 版本 | 256x1 | 128x2 | 64x4 | 32x8 | 16x16 | | G0 | 12.0915 | 11.4895 | 10.8670 | 10.9055 | 11.3650 | | G1 | 12.0670 | 11.4230 | 10.8190 | 10.8355 | 11.3875 | | G2 | 11.8300 | 11.2650 | 10.6235 | 10.7695 | 11.2540 | | G3 | 11.3905 | 11.0285 | 10.4620 | 10.5435 | 11.0565 | | G4 | 11.9180 | 11.2805 | 10.6650 | 10.7090 | 11.3460 | | G5 | 12.2435 | 11.5020 | 10.8740 | 10.9755 | 11.5650 | | N1 | 12.0690 | 11.2275 | 10.6070 | 10.7855 | 11.2940 | | A1 | 12.3095 | 11.2750 | 10.6635 | 10.8980 | 11.4230 | | M0 | 12.0690 | 11.1810 | 10.6775 | 10.7850 | 11.3165 | | K1 | 12.1055 | 11.2750 | 10.7045 | 10.8770 | 11.4535 |
7.3 Diagonalization:144 Cu,PBE+rVV10,标准对角化
| 版本 | 256x1 | 128x2 | 64x4 | 32x8 | 16x16 | | G0 | 8.6010 | 7.5480 | 7.5790 | 8.3150 | 12.0020 | | G1 | 9.2365 | 7.6205 | 7.7080 | 8.3975 | 12.3005 | | G2 | 9.8585 | 8.8160 | 8.3720 | 8.6035 | 12.8470 | | G3 | 11.1890 | 7.2585 | 6.6460 | 7.5685 | 11.3540 | | G4 | 9.7615 | 8.7050 | 8.4045 | 8.9225 | 13.5430 | | G5 | 10.4105 | 9.3770 | 9.4010 | 10.3375 | 15.4605 | | N1 | 9.9540 | 8.5685 | 8.1895 | 8.3355 | 12.5010 | | A1 | 9.6315 | 8.5235 | 8.2860 | 8.6530 | 13.2630 | | M0 | 9.6990 | 8.6095 | 8.1820 | 8.3010 | 12.4920 | | K1 | 10.3410 | 9.2810 | 9.3200 | 10.0515 | 15.1145 |
7.4 DBCSR:三组稀疏块矩阵乘法
| 版本 | 256x1 | 128x2 | 64x4 | 32x8 | 16x16 | | G0 | 2.3595 | 2.0645 | 1.7445 | 1.6930 | 1.9440 | | G1 | 2.3545 | 2.0685 | 1.7260 | 1.6705 | 1.9350 | | G2 | 2.2545 | 2.0485 | 1.7460 | 1.6835 | 1.9555 | | G3 | 2.8495 | 2.1730 | 1.7515 | 1.7355 | 1.9260 | | G4 | 2.2280 | 2.0170 | 1.7275 | 1.6525 | 1.8925 | | G5 | 2.9585 | 2.9050 | 2.5990 | 2.6975 | 2.9760 | | N1 | 2.2295 | 2.0135 | 1.7200 | 1.6520 | 1.9460 | | A1 | 2.2370 | 1.9990 | 1.7030 | 1.6310 | 1.8705 | | M0 | 2.2305 | 2.0135 | 1.7205 | 1.6455 | 1.9375 | | K1 | 2.9380 | 2.9090 | 2.5995 | 2.7355 | 2.9785 |
八、冠军、总体排名与结果解释
| 负载 | 最快组合 | 中位时间 | 第二名 | 相对第二名降时 | | GGA | G3,64x4 | 4.9080 s | A1,64x4,5.5310 s | 11.26% | | Hybrid | G3,64x4 | 10.4620 s | N1,64x4,10.6070 s | 1.37% | | Diagonalization | G3,64x4 | 6.6460 s | G0,128x2,7.5480 s | 11.95% | | DBCSR | A1,32x8 | 1.6310 s | M0,32x8,1.6455 s | 0.88% |
总体排名采用归一化几何平均:每个版本在每类负载中使用自己的最佳布局,再除以该负载的全局最快时间,最后对四个比值取几何平均。1.0 表示四类负载均达到各自全局最快。
| 排名 | 版本 | 归一化几何平均 | 高于逐负载理想值 | | 1 | G3 | 1.015647 | 1.56% | | 2 | G1 | 1.089040 | 8.90% | | 3 | G0 | 1.092916 | 9.29% | | 4 | M0 | 1.093805 | 9.38% | | 5 | A1 | 1.093937 | 9.39% | | 6 | N1 | 1.094701 | 9.47% | | 7 | G4 | 1.102510 | 10.25% | | 8 | G2 | 1.105544 | 10.55% | | 9 | K1 | 1.291474 | 29.15% | | 10 | G5 | 1.303611 | 30.36% |
- 并行布局:256x1 增加了 MPI 通信和同步开销;128x2 基本全面改善;64x4 对三类完整 CP2K 负载最合适;DBCSR 更偏好 32x8。
- MPI:三种 MPI 已验证具有等价的物理绑核结果,但通信实现、共享内存路径和集合通信算法仍不同,因此性能不必相同。
- 数学库:OpenBLAS 与 AOCL 在完整 CP2K 负载中总体接近;MKL 在本机这组 DBCSR 小块矩阵负载上明显较慢。这不是对所有体系或所有 BLAS 尺寸的普遍结论。
- 优化级别:O3 + march=znver5 并没有自动压倒 O2 版本;G3 的完整栈仍显著领先,说明最终性能是编译器、MPI、数学库、接口和负载共同作用的结果。
九、推荐启动方式
通用计算首选:G3,64 MPI x 4 OpenMP
- source /home/software/cp2k/2026.2-gcc144-intelmpi2021.18-openblas-znver5-mpif08off/cp2k-install/cp2k_env
- ulimit -s unlimited
- ulimit -n 65536
- export OMP_NUM_THREADS=4
- export OMP_PLACES=cores
- export OMP_PROC_BIND=close
- export OMP_STACKSIZE=512M
- export OPENBLAS_NUM_THREADS=1
- export I_MPI_PIN=1
- export I_MPI_PIN_DOMAIN=omp
- export I_MPI_PIN_ORDER=compact
- mpiexec -n 64 -ppn 64 cp2k.psmp -i input.inp -o output.out
复制代码
DBCSR 类负载专项:A1,32 MPI x 8 OpenMP
- source /home/software/cp2k/2026.2-gcc144-mpich501-aocl5.3-o3-znver5-pure/cp2k-install/cp2k_env
- ulimit -s unlimited
- ulimit -n 65536
- export OMP_NUM_THREADS=8
- export OMP_PLACES=cores
- export OMP_PROC_BIND=close
- export OMP_STACKSIZE=512M
- export BLIS_NUM_THREADS=1
- mpiexec -n 32 -bind-to core:8 cp2k.psmp -i input.inp -o output.out
复制代码
十、适用范围与局限
- 这是单节点、双路 Zen5、256 物理核条件下的结果,不能直接外推到多节点通信或其他 CPU 架构。
- 四个输入刻意控制在较短时间内,用于高重复数筛选。大体系、长 MD、不同基组、不同 SCF 算法或多节点任务可能改变最佳版本与布局。
- 比较对象是完整可执行栈,不是严格控制变量实验。若要回答“只更换 MPI 带来多少提升”,还需要专门的单因素矩阵。
- A1 曾在较早的四版本矩阵中出现一次 300 s diagonalization 卡顿,但相同条件立即重试 10 次均通过,最终 80 个正式 case 也全部通过。该事件未复现,但作为可靠性记录保留。
- G3 使用 MPI_F08=OFF,是为解决 GCC 14.4 无法读取 Intel MPI 所带 mpi_f08.mod 的兼容构建;其数值门槛、动态链接检查和绑核探针均通过。
十一、复现资料
附件“CP2K-2026.2-build-recipes-and-inputs.zip”中包含各版本的实际编译方法、关键 patch、安装前缀、有效 flags、动态链接验证、ifx 失败路线,以及本帖使用的四个原始输入文件:H2O-gga.inp、H2O-hyb.inp、diag_cu144_broy.inp 和 dbcsr.inp。本文正文只展示方法与结果,不把几十页编译命令和输入坐标直接塞进主帖。
大家后面测试的时候把本帖内容,和附件内容发给自己的agent,应该能省不少token,省下的token记得 请我喝奶茶!!!
欢迎交流不同 CPU、MPI、数学库和实际生产体系上的复现结果。
|