示例 18:报错排查练习、版本迁移与并行性能测试¶
配套教程:第18章 常见错误排查、性能调优与版本迁移
目的¶
- 排查练习:
broken_scf.inp故意放了 6 个常见错误(A–F),按报错顺序逐个修正,最终得到broken_scf_fixed.inp; - 版本迁移:一对可
diff的输入(2025 写法 / 2026.2 写法)、一个按文本扫描旧语法的脚本,以及一份迁移清单; - 性能调优:在一个整节点上比较多种 MPI×OpenMP 组合的耗时。
文件说明¶
| 文件 | 说明 |
|---|---|
broken_scf.inp |
故意出错的 fcc Cu(4 原子惯用胞,k 点 8×8×8)输入,错误用 (A)–(F) 标注 |
broken_scf_fixed.inp |
修正版:UZH q11 基组/赝势、对角化 + Broyden + Fermi–Dirac 展宽 + ADDED_MOS;DOS 输出用 NEWDOS 变量在新旧语法间切换 |
legacy_si_cellopt_2025.inp |
Si 8 原子晶胞优化,2025 写法(CELL_OPT TYPE、&PRINT &PDOS),在 2026.2 上会报错 |
si_cellopt_2026_2.inp |
同一计算的 2026.2 写法 |
check_migration.sh |
文本扫描:找出 2026.2 删除/改动的关键字(不展开 @INCLUDE,@IF 块内的发现只作 INFO) |
migrate_2025_to_2026_2.md |
2025.x → 2026.2 迁移清单(输入、构建、Python 工具) |
job_mpi_omp_hybrid.sh |
Slurm 整节点基准:依次运行若干 MPI×OpenMP 组合,汇总到 bench_summary.dat |
运行步骤¶
1. 排查练习¶
cd CP2K/examples/18-troubleshooting
export CP2K_DATA_DIR=/path/to/cp2k/data
cp2k.psmp -c broken_scf.inp # 第 1 轮:语法检查
bash check_migration.sh broken_scf.inp # 文本扫描(与 CP2K 版本无关)
# 修一处、跑一次:
cp2k.psmp -i broken_scf.inp -o broken_scf.out; tail -25 broken_scf.out
在 CP2K 2026.2 上,错误按下面的顺序出现(每修好一个,下一个才会暴露):
| 顺序 | 标记 | 阶段 | 典型报错(节选) | 修正 |
|---|---|---|---|---|
| 1 | A | 解析输入 | found an unknown keyword TYPE in section CELL_OPT |
删除 TYPE;本例是单点计算,整个 &MOTION 都可以删 |
| 2 | B | 解析输入 | unknown subsection PDOS of section PRINT |
改用 &PRINT &DOS &PDOS(2026.2)或删除 |
| 3 | C | 读取基组 | The requested basis set <DZVP-MOLOPT-SR-GTH> for element <Cu> was not found in the basis set files BASIS_MOLOPT_UZH |
改成文件中真实存在的名字 DZVP-MOLOPT-PBE-GTH-q11 |
| 4 | D | SCF 初始化 | OT not possible with kpoint calculations |
删除 &OT,改用对角化 |
| 5 | E | 无报错 | ——(CP2K 不会按名字里的 -qN 去核对基组与赝势) |
把 GTH-PBE-q1 改成 GTH-PBE-q11,并在输出中核对电子数 |
| 6 | F | SCF 迭代 | 很可能出现 SCF run NOT converged(或收敛到错误的整数占据态) |
加 &SMEAR(显式 METHOD)、ADDED_MOS、Broyden 混合、MAX_SCF 100 |
在 2026.1 及更早版本上,A 和 B 不是错误,练习从 C 开始。
修正版的运行:
cp2k.psmp -i broken_scf_fixed.inp -o fixed.out # CP2K >= 2026.2
cp2k.psmp -E NEWDOS=0 -i broken_scf_fixed.inp -o fixed.out # CP2K <= 2026.1
grep "Number of electrons" fixed.out | head -2 # q11: 4 x 11 = 44
grep -E "SCF run converged|Fermi energy" fixed.out | tail -2
ls cu_fixed*.pdos cu_fixed-RESTART.kp
2. 版本迁移¶
diff legacy_si_cellopt_2025.inp si_cellopt_2026_2.inp
bash check_migration.sh legacy_si_cellopt_2025.inp si_cellopt_2026_2.inp
cp2k.psmp -c si_cellopt_2026_2.inp # 2026.2
cp2k.psmp -c legacy_si_cellopt_2025.inp # 2025.x / 2026.1
3. MPI × OpenMP 基准¶
sbatch job_mpi_omp_hybrid.sh # 默认用 broken_scf_fixed.inp,自动按节点核数生成组合
sbatch job_mpi_omp_hybrid.sh si_cellopt_2026_2.inp "32x1 16x2 8x4"
cat bench_summary.dat
预期结果 / 如何检查¶
- 修正版:输出中
Number of electrons为 44,SCF 在MAX_SCF以内收敛,打印Fermi energy与Electronic entropic energy;生成cu_fixed-RESTART.kp(k 点计算写.kp); check_migration.sh legacy_si_cellopt_2025.inp报告两个 ERROR(第 14 行TYPE、第 57 行&PDOS),对si_cellopt_2026_2.inp报告 0 个;bench_summary.dat每行一个组合;status一列若出现MPI_ranks_reported=1之类的标记,说明 MPI 环境错配(多个串行进程各自运行),见教程第 4 节。
本仓库没有附带参考输出;不同组合的快慢取决于硬件、MPI 库、编译选项和体系大小,没有通用的最优值。
注意事项¶
broken_scf.inp只用于练习,不要拿它的结果做任何分析;check_migration.sh是基于文本的启发式检查,可能漏报或误报;以目标版本的cp2k.psmp -c为准;- 基准测试请用与生产计算同体系、同参数的短任务(几个 SCF 或 MD 步),不要用玩具分子;记得把输入引用的坐标文件一起复制到
bench_*目录(脚本中有注释说明); - Cu 的晶格常数 3.615 Å 是室温实验值的近似,仅作示例;本例的 CUTOFF、k 点和展宽温度未经收敛测试。