GROMACS 2026.3 移植对比报告

某国产超算集群 (测试集群) · 海光 Z100 DCU (gfx906) · 超算互联网 · 收官版
测试日期: 2026-08-16  |  操作者: <USER>  |  对比基线: GROMACS 2023.2 (CUDA 翻译版)

摘要

典型场景全胜
7 / 7
HIP 2026.3 全部快于 CUDA 翻译版 2023.2
最大加速
3.20×
villin(小蛋白 NVT)
最小加速
1.26×
stmv(百万原子病毒 NVT)
waterbox8 (原问题场景)
1.62× 快
67.64 vs 41.66 ns/day,从「慢 2.7×」反转
✅ 验收判定:「不比老版本差」达标,且全面反超。上一版「waterbox8 NPT 慢 2.7×」 是节点 CPU 争用污染造成的假象(见第三节)。

一、性能对比(干净节点,每项 3 次重复)

场景体系原子数系综HIP 2026.3
(ns/day)
CUDA 2023.2
(ns/day)
HIP / 老版本
villin小蛋白~40KNVT323.49101.183.20×
rnase_cubic可溶蛋白24,040NVT147.9466.932.21×
waterbox8纯水50,859NPT67.6441.661.62×
adh_dodec膜蛋白95,561NVT26.0918.891.38×
aqp_ensemble水通道蛋白~80KNVT13.5810.621.28×
ion_channel离子通道~50KNVT20.1715.871.27×
stmv大病毒衣壳~百万NVT2.301.831.26×

测量方法:gmx_bench.slurm(每个 backend×system 各 3 次重复, -notunepme -resetstep N/2 保证计时口径一致,报告 mean±sd;所有重复 sd < 2%)。 规律:体系越小、加速比越大——小体系 GPU 吃不饱,原生 HIP 内核更低的启动/调度开销优势更明显。

二、waterbox8 反转:从「慢 2.7×」到「快 1.62×」

上一版报告里 waterbox8 NPT 是 15.31 vs 41.22(慢 2.7×),这是唯一一个 「HIP 变慢」的证据,也是整个 NPT 优化课题的起点。干净节点重测后:

污染节点干净节点
HIP 2026.315.31(假象)67.64
CUDA 2023.241.2241.66

根因:HIP 后端对节点 CPU 争抢极敏感。同一争抢节点上,HIP 从 148 掉到 9.4 (15× 恶化),而 CUDA 翻译版几乎不动(稳定在 66.8)。上一版的 waterbox8 HIP 数字恰好落在 争抢节点上。由此,「waterbox8 NPT 慢」这一整条优化课题(virial 回退、DPP 归约、寄存器/占用率) 都是在追这个测量假象,详见第四节死胡同记录。

三、正确性验证

对每个场景对比 run.log 的 Energies 段,主能量项(LJ SR / Coulomb SR / Potential / 总能量) 全部一致到 ~0.01–0.05%,温度均落在目标值(~300 K),压强在系综波动范围内, 无 NaN/Inf。这个量级差异是「不同舍入顺序 → 数千步轨迹微发散」的正常水平,不是物理错误。

waterbox8 NPT 100 ps(50000 步)长跑:总能量 -5.718×10⁵ kJ/mol、 温度 299.88 K、压强 -1.8 bar,全程无漂移、无异常终止,与短跑一致的 67.5 ns/day。

四、踩过的坑

4.1 编译期真坑(必踩,静默失败)

gfx90a→gfx906 探针坑:GROMACS 的 gmxManageHipccConfig.cmake--offload-arch=gfx90a 去探测 hipcc 是否支持各优化 flag,但 DTK 26.04 没有 gfx90a 设备库——每个探测都失败,于是所有优化 flag 被静默丢弃,性能掉到 ~17 ns/day 且 不报任何错误。修复:把探针架构 gfx90a 改成 gfx906(并补 -mcpu=gfx906、去掉 gfx906 不认的 -fno-gpu-rdc / -fno-slp-vectorize)。 这是影响最大的一处编译改动。

4.2 性能死胡同(都证伪了,避免后人重踩)

假线索实验结论
deviceStream.synchronize() 是同步开销大头移除同步点重建对照零变化,不是根因
virial 步 CPU 力归约回退(useGpuFBufferOpscomputeVirial 步退回 CPU)源码坐实该回退存在机制真实,但干净节点下不是净瓶颈(被 GPU 整体更快盖过)
DPP 归约的动态 lane 转置 → ds_bpermute → 12.8× LDS改成原子归约对照零变化,归约不是瓶颈
minBlocksPerMp=8→14 压 vgpr 提占用率实测 vgpr 不降反升(32→36)__launch_bounds__ 在这版 hipcc 上不按预期生效,收益 ~1%,已回退
⚠ 这四条的共同教训:先拿到干净、可信的基线,再谈优化。在污染数据上做 「kernel 级优化」,所有方向都是错的。

五、预检提示(跑 benchmark 前必读)

⚠ 确认节点干净 / 独占。HIP 后端对 CPU 争抢极敏感(可达 4× 掉速), CUDA 翻译版相对稳。建议:① squeue 确认节点无其他作业或 --exclusive 独占; ② 每点 3 次重复,sd > 2% 就判污染、重跑gmx_bench.slurm 已内置); ③ 跨节点对比时务必在同一批干净节点上对跑两个后端。

六、编译方法(完整复现)

工具链:DTK 26.04(HIP 6.3.26113 / clang 17)+ GCC 12.2.0 + CMake 3.28.6 + OpenMPI 4.1.5。

# 0. 恢复 cmake_minimum_required 到 3.28(撤销任何 3.25 降级补丁)
cd $SRC
sed -i 's/cmake_minimum_required(VERSION 3\.25)/cmake_minimum_required(VERSION 3.28)/g' CMakeLists.txt
find . -name CMakeLists.txt -exec sed -i 's/cmake_minimum_required *(VERSION 3\.25)/cmake_minimum_required(VERSION 3.28)/g' {} \;

# 1. gfx906 架构探针补丁(关键,见 4.1)
cd $SRC/cmake
sed -i 's/--offload-arch=gfx90a/--offload-arch=gfx906/g' gmxManageHipccConfig.cmake
sed -i 's/gmx_hip_check_single_flag("-fno-gpu-rdc")/# REMOVED for gfx906: gmx_hip_check_single_flag("-fno-gpu-rdc")/' gmxManageHipccConfig.cmake
sed -i 's/gmx_hip_check_single_flag("-fno-slp-vectorize")/# REMOVED for gfx906: gmx_hip_check_single_flag("-fno-slp-vectorize")/' gmxManageHipccConfig.cmake
sed -i '/gmx_hip_check_single_flag("-ffast-math")/a\    gmx_hip_check_single_flag("-mcpu=gfx906")' gmxManageHipccConfig.cmake

# 2. 环境
module purge
module load mpi/openmpi/gcc-9.3.0/4.1.5
source <DTK_ROOT>/env.sh
export PATH=<GCC_ROOT>/bin:$PATH
export LD_LIBRARY_PATH=<GCC_ROOT>/lib64:$LD_LIBRARY_PATH
export amd_comgr_DIR=<DTK_ROOT>/lib64/cmake/amd_comgr

# 3. HIP clang wrapper(补 AMD GPU 优化标志)
cat > $BUILD/hip_wrapper.sh << 'EOF'
#!/bin/bash
exec <DTK_ROOT>/llvm/bin/clang++ \
  --gcc-toolchain=<GCC_ROOT> \
  -mllvm -amdgpu-early-inline-all=true \
  -mllvm -amdgpu-function-calls=false \
  "$@"
EOF
chmod +x $BUILD/hip_wrapper.sh

# 4. CMake 配置 + 编译
$CMAKE $SRC \
  -DGMX_BUILD_OWN_FFTW=ON -DGMX_GPU=HIP -DGMX_MPI=ON \
  -DCMAKE_C_COMPILER=$GCC_HOME/bin/gcc -DCMAKE_CXX_COMPILER=$GCC_HOME/bin/g++ \
  -DCMAKE_HIP_COMPILER=$BUILD/hip_wrapper.sh \
  -DCMAKE_PREFIX_PATH=<DTK_ROOT> \
  -Damd_comgr_DIR=<DTK_ROOT>/lib64/cmake/amd_comgr \
  -DGMX_SIMD=AVX2_256 -DGMX_GPU_FFT_LIBRARY=rocFFT \
  -DGMX_GPU_NB_DISABLE_CLUSTER_PAIR_SPLIT=ON \
  -DGMX_GPU_NB_NUM_CLUSTER_PER_CELL_X=1 -DGMX_GPU_NB_NUM_CLUSTER_PER_CELL_Y=1 -DGMX_GPU_NB_NUM_CLUSTER_PER_CELL_Z=1 \
  -DGMX_HIP_TARGET_ARCH=gfx906 -DAMDGPU_TARGETS=gfx906 -DGPU_TARGETS=gfx906 \
  -DCMAKE_BUILD_TYPE=Release
make -j8

完整脚本:<USER_HOME>/scripts/gromacs_cmake28_build.slurm(可直接 sbatch 复现)。

七、可执行文件包

当前最优产物在 <USER_HOME>/softwares/gromacs/build_cmake28/

文件大小说明
bin/gmx_mpi113 KB主可执行文件(薄封装,动态链接库)
lib/libgromacs_mpi.so.11.0.045 MB真正的计算库(含所有 HIP kernel)

运行方式(需与编译时一致的 DTK 运行时):

module purge
module load mpi/openmpi/gcc-9.3.0/4.1.5
source <DTK_ROOT>/env.sh
export LD_LIBRARY_PATH=<GCC_ROOT>/lib64:$LD_LIBRARY_PATH

/path/to/build_cmake28/bin/gmx_mpi mdrun -s case.tpr -nb gpu -pme gpu ...

注意:GROMACS 2026.3 写的 tpr 是 version 138,集群预编译的 2023.2 读不了;反过来 2026.3 能读旧 tpr。跨版本对跑时各自用各自版本生成的 tpr。

八、功能增益:GROMACS 2023.2 → 2026.3