COHP 计算中 SCF 后阶段阻塞问题的诊断与修复

May 19, 2026
Published in 计算化学

Abstract

在利用 ABINIT + LOBSTER 进行 $\mathrm{Al}(111)$ slab 吸附体系的 COHP 计算时,发现所有 24 个任务在 SCF 收敛后进入长达约 12 小时的静默阻塞状态,无任何输出写入日志文件。本文记录该问题的诊断过程与修复方案。

Keywords: ABINIT, COHP, LOBSTER, SCF, 高性能计算, MPI

问题描述

al28h1s-ta015-3co 为例,ABINIT 8.6.3 的 SCF 已在第 27 步收敛(toldfe 1.0d-6),stress tensor 也正常输出,但此后计算卡住约 12 小时,无任何新的输出写入 cohp.outcohp.log

关键观察:

指标状态
Job 25035616运行中(3 节点 sim[24-26],72 MPI tasks),已运行 ~29 小时
SCF 收敛第 27 步收敛,最终 $E_\mathrm{tot} = -59.478622$ Ha
cohp.out 最后更新2026-05-18 13:53(距发现问题约 12 小时)
cohp_oWFK 文件不存在
cohp_o* / cohp_tmp*均不存在
error_cohp空文件

所有 24 个 COHP 计算均使用相同参数,预计均会遇到同样问题。

原因分析

ABINIT SCF 后处理流程

SCF 收敛后,ABINIT 按如下顺序执行后处理:

  1. 计算力与应力张量(已完成)
  2. 计算 prtdos(投影态密度,四面体方法)
  3. 写入 WFK 波函数文件(prtwf 1

瓶颈定位:prtdos 3

原始 cohp.in 中设置了 prtdos 3(atom-projected partial DOS,四面体方法)。该计算的复杂度与以下因素成正比:

参数本体系取值说明
k-point 数72($6\times6\times2$,kptopt 3 全 BZ 无对称性约简)LOBSTER 要求
nband100
原子数29(28 Al + 1 吸附原子)
PAW projectorsAl: lmn_size=8, H: lmn_size=5
平面波数/k-point~66,292
WFK 预估大小~7.3 GBABINIT 输出

prtdos 3 需要将所有 $72 \times 100 = 7200$ 个波函数投影到每个原子的 PAW 部分波上,计算量为 $O(n_\mathrm{kpt} \times n_\mathrm{band} \times n_\mathrm{atom} \times n_\mathrm{pw})$。

与 LOBSTER 官方示例的对比

LOBSTER 5 附带的 ABINIT 示例(util/lobster-5/ABINIT/)中 prtdos 的用法:

示例原子数k-point 网格nbandprtdos
diamond2$7\times7\times7$83
gaas2$7\times7\times7$133
ti2$7\times7\times3$203
FeNi34$5\times5\times5$603
carbon-nanotube32$1\times1\times9$1281
fullerene60$1\times1\times1$2401

规律:小体系(2--4 原子)使用 prtdos 3;大体系(32--60 原子)改用 prtdos 1(total DOS)。本计算的 29 原子 + 72 k-point 组合远超示例中使用 prtdos 3 的体系规模。

核心结论

LOBSTER 不需要 ABINIT 的 DOS 输出。 LOBSTER 从 WFK 文件独立计算 COHP/COOP/DOS。prtdos 设置纯属 ABINIT 侧的附加计算,对 LOBSTER 工作流无任何贡献,却造成了严重的性能瓶颈。

MPI 死锁的可能性

prtdos 3 计算量过大外,12 小时完全无输出也符合 MPI 死锁的特征。

MPI 死锁是指多个 MPI 进程互相等待对方发送/接收数据,所有进程均阻塞在通信调用上,程序永远无法继续。典型情况如两个进程都先调用阻塞式 MPI_Recv 等待对方数据,而各自的 MPI_Send 排在 Recv 之后,导致谁都无法先发送。

本计算存在以下触发 MPI 死锁的风险因素:

  1. 跨节点通信:任务使用 3 个节点(sim[24-26])、72 个 MPI 进程。节点内通信走共享内存,稳定且快速;跨节点通信走网络(InfiniBand/以太网),网络瞬时抖动或某节点响应延迟可能触发边界条件 bug。

  2. ABINIT 8.6.3 版本较老(2018 年发布)。老版本中集体通信(MPI_AllreduceMPI_Alltoall 等)的实现在特定进程数/节点组合下可能存在 bug,这类问题通常在后续版本中逐步修复。

  3. post-SCF 并行路径测试不足:SCF 循环是 ABINIT 中最成熟、测试最充分的并行代码路径。而 prtdos 3(投影态密度)属于相对冷门的后处理功能,并行化程度和测试覆盖率均不如 SCF,更容易出现通信逻辑 bug。

  4. 现象吻合:Job 状态为 R(进程存活),但 12 小时内无任何输出,也未产生任何文件。若仅是计算缓慢,应仍有零星 I/O 活动;完全静默更像是所有进程均阻塞在某个通信调用上。

由于无法 SSH 到计算节点检查进程状态(如通过 strace 确认系统调用是否卡在 poll/recv),无法最终确认是计算缓慢还是死锁。但无论哪种情况,去掉 prtdos 3 都能同时消除这两个风险。

修复措施

取消所有任务

scancel -u w.zhengqing

共取消 24 个任务(11 个运行中 + 13 个排队中)。

修改输入参数

对所有 24 个 cohp.in 执行以下修改:

参数修改前修改后原因
prtdos30LOBSTER 不需要,消除 post-SCF 瓶颈
nstep100200提高 SCF 收敛余量

修改后的输出控制段:

prtdos 0
prtden 0
prtwf 1

清理输出文件

删除所有 calc 子目录中的输出文件(共 102 个),每个目录仅保留 4 个输入文件:

  • cohp.in --- ABINIT 输入
  • cohp.files --- ABINIT 文件列表
  • lobsterin --- LOBSTER 输入
  • mainsim-cohp.sh --- SLURM 提交脚本

预期效果

修改后,SCF 收敛后 ABINIT 将跳过 prtdos 计算,直接写入 WFK 文件(~7.3 GB)后正常退出。后续由 LOBSTER 读取 WFK 完成 COHP 分析。

References

  1. Gonze, X., et al. "The ABINIT project: Impact, environment and recent developments." Computer Physics Communications, vol. 248, 2020, p. 107042. link

  2. Nelson, R., et al. "LOBSTER: Local orbital projections, atomic charges, and chemical-bonding analysis from projector-augmented-wave-based density-functional theory." Journal of Computational Chemistry, vol. 41, no. 21, 2020, pp. 1931--1940. link