CP2K GPU准确性:相同输入的能量与力对照
用正式重复结果核对P100/V100和不同卡数的能量、96原子全部力,解释后端一致性与科学收敛的区别。
阅读本篇目录
GPU后端比较应固定物理输入与收敛条件,再逐项读取能量和力。本篇使用GPU专题的同输入数据,比较P100、V100 16GB及卡数变化;这组数据不包含新的CPU参考。
1. 复算读取与图表#
下载CP2K GPU输入、实际输出、CSV与绘图资料包,保存为example.zip:
python3 -m zipfile -e example.zip .
cd cp2k-gpu-practical-data
bash results.sh
bash read.sh
bash plot.sh
资料来自2026年10月22日实际Slurm计算;本次复用结果,不重新跑性能任务。data/是逐次数据,reference-results/保存原生输出,figures/为可重画图片。

每个模型以P100单卡第1次正式运行为参考。36行比较包含两个参考自身,因此是34个非自身比较,不能称为36个独立算例。图中为零的差值不画在对数轴上,数据表保留原值。
2. 实际比较到什么#
| 模型 | 比较范围 | 本次最大差 |
|---|---|---|
| 96原子PBE32 | 同输入总能量按原子数归一 | 约1.874×10⁻¹² Ha/原子 |
| 96原子PBE32 | 每次全部96×3力分量 | 约1.0×10⁻¹⁰ Ha/Bohr |
| 9原子HF3 | 同输入能量 | 数据见CSV;未做本批杂化力/应力比较 |
这些差值表示同一个有限基组、网格和算法输入在不同GPU配置下的一致性,不能据此宣称真实材料性质具有相同数量级的绝对精度。
3. 检查操作#
python3 read-one.py reference-results/p100/pbe32-1g-r1
head data/CP2K-GPU-energy-force-comparisons.csv
head data/CP2K-GPU-PBE32-force-components.csv
read-one.py检查单个输出的正常结束、SCF与有限能量;完整read.sh再对照输入哈希和逐分量数值。原比较要求每原子能量差小于1E-7 Ha、最大力分量差小于1E-6 Ha/Bohr,本次数据都在这个预设范围内。
4. 复现并比较自己的结果#
先在新解压目录选择与账号资源相符的提交脚本,例如P100单卡或V100 16GB单卡:
sbatch p100-pbe32-1g.slurm
或:
sbatch v100-pbe32-1g.slurm
这是核时GPU分区的示例脚本。套餐账号应使用yskit中对应账号、平台的CP2K模板,并保持本例MPI/OMP与GPU申请匹配。每个作业只跑一个配置,先预热一次,再正式运行三次;不会自动提交全部配置。新结果可以这样读取:
python3 read-one.py work/p100-pbe32-1g/r1
完整历史比较仍用bash read.sh。不要把Slurm脚本直接改成在登录节点执行,也不要把P100模块用于V100任务。
先保证相同输入、相同物理方法和足够SCF收敛,保存所有原子力,而不仅比较最后一个总能量。若是自己的结构、泛函、磁性、电荷或HF截断势,还应检查相应网格、基组、筛选与目标性质。
本例HF3使用SCF 1E-9与Schwarz 1E-10,只比较9原子模型能量;没有把它扩展成杂化力、应力、几何优化或长MD的全面精度结论。ADMM改变辅助基组与近似定义,不能把不同设置的绝对能量差直接解释成GPU数值误差。
5. 下一步做什么检查#
实际生产任务先做小规模单点或短流程:确认SCF、E/F、GPU后端和资源,再测试目标相对能、几何、频率或短NVE等。重复运行只能观察数值与计时稳定性,不能代替科学参数收敛。