ABACUS 开源优化展示鲲鹏算子调优路径
北大团队为鲲鹏不同型号适配编译链、向量指令和数学库,并优化 ABACUS 的 19 类材料核心算子,相关代码已开源。报道给出同为 28 核时 SVE 版本快 1.3 至 3.9 倍,满核结合矩阵单元时最高快 10.7 倍。
AI 深度解读
ABACUS 在鲲鹏 920 上的加速,靠的是把编译链、数学库、硬件指令和热点算法一起调通。北大团队报告:相同 28 核配置下,SVE 版本在标准测试集上快 1.3 至 3.9 倍;另有单节点满核配置,最高快 10.7 倍。
这件事值得程序员关注的,是它展示了性能优化的几个层次:先让硬件能力被用起来,再消除算法里的浪费。但几组倍数的测试条件不同,不能合成一句「鲲鹏全面领先」。
同一套源码,为什么还要适配三条路径
ABACUS 是国内多家单位联合开发的开源密度泛函理论(DFT)软件,用于计算半导体、金属等材料的性质,用户超过一千人,应用单位过百家。它处理的是材料科学计算,不是通用业务服务。
适配的第一个问题,是鲲鹏 920 不同型号支持的向量指令并不相同,涉及 NEON、SVE、SVE512,还有矩阵运算单元。通用编译配置未必能用上这些能力,程序能运行,也可能只走基础计算路径。
团队为三款芯片分别配置工具链:两款使用 gcc-openmpi-openblas,生成 NEON 和 SVE 版本;第三款使用 clang-hmpi-kblas,生成 SVE512 和矩阵运算指令集版本。同时新增 USE_KML 编译选项,接入鲲鹏数学库(KML)。
替换数学库也需要处理接口差异。KFFT 与 fftw3、KScaLAPACK 与 ScaLAPACK 的函数签名和默认行为并不完全一致,因此团队调整了 FFT 接口的 OMP 配置,以及 abstol、orfac 两个默认值。
性能优化的起点,是确认程序实际使用了预期的硬件和软件路径。
加速数字成立,但不能混着比较
团队先验证正确性。NEON、SVE 和矩阵运算三个版本,均通过了平面波基组、线性组合原子轨道(LCAO)、随机波函数 DFT(sDFT)和深度学习泛函 DeePKS 等集成测试,报道说数值结果与业界主流实现一致。
标准性能测试覆盖 10 个材料体系,规模为 8 至 216 原子,采用周期性边界条件。双方配置均为 28 核、28 进程 ×1 线程,SVE 版本比受测主流 x86 CPU 快 1.3 至 3.9 倍。这组结果有相同核心数和进程配置作为比较基础。
最高 10.7 倍来自启用矩阵运算单元、单节点满核的另一组配置。随机轨道 DFT 算例中,SVE 版本快 2.8 至 3.1 倍,矩阵运算指令集版本快 6.1 至 20.1 倍。这些数字分别对应不同算例和运行条件。
原文没有给出对比 CPU 的具体型号、满核核心数、完整编译参数及各算例绝对耗时。因此,它能支持「这些配置和算例获得了加速」,还不足以支持所有工作负载上的硬件排名。
真正能复用的,是减少计算和搬运
硬件适配之后,团队继续拆解了 19 类核心算子,涉及基础数学函数、插值积分、球谐函数、矩阵变换、混合精度、TDDFT、DeePKS、近邻搜索和并行调度等模块。
其中几个改动很直观:
- 广义拉盖尔多项式原先递归计算,低阶结果被反复求值。改成迭代递推,只保留三个中间变量,复杂度降至 O(n),百万次调用测试约快 8 倍。
- 多项式插值用二分查找替代顺序扫描。对于 400 项的表,平均比较次数从约 200 次降至 9 次。
- 通过数学化简、三角函数递推、循环不变量外提、查表复用和整数幂特化,减少重复计算;再通过混合精度、内存布局调整和负载均衡,减少访存与等待开销。
原文称所有算子都复核了数值结果,多数明显加速,部分达到数倍甚至十余倍。但单个算子的提速,仍不能直接当成整个程序的提速。
团队还使用 DevKit 源码自动优化能力。在鲲鹏 920 新型号上,8 原子温稠密碳 sDFT 算例快了 2.28 倍,512 原子 Si 的 LCAO 算例快了 2.66 倍。原文没有展开工具生成的具体改动,也没有明确这两组结果的基线,不能据此判断自动优化能普遍替代专家调优。
我的判断
我认可这次工作的顺序:先打通依赖并验证正确性,再针对热点改算法,最后尝试用工具复用经验。相比只换编译器或打开优化选项,它处理了编译工具难以自动消除的重复计算和数据访问问题。
不过,原文把编译器概括为只能看一条语句、一个循环,过于绝对。现代编译器能够分析更大的范围,只是未必能推导出领域公式、替换算法,或判断哪些近似计算可以接受。
这份报道给出了具体测试结果,但缺少完整、可复现的横向对照。更稳妥的理解是:它证明了软硬件联合优化在这些科学计算任务中的价值;对一般团队,能否取得类似收益,取决于热点是否相似,以及是否具备相应硬件和领域知识。
能拿来做什么
- 排查 Node 原生扩展或科学计算依赖的性能时,先确认实际加载的库、编译目标和硬件指令路径,避免只看安装成功与否。
- 遇到插值、表查找或递归计算热点时,优先检查重复求值和查找复杂度,再考虑增加并行度。
- 让 AI 编程工具优化热点代码时,同时提供基准输入和正确性校验,要求分别报告局部算子耗时与整体耗时。
- 阅读性能宣传时,把核心数、进程线程配置、算例规模和比较基线一起记录;条件没说清的倍数,先保留判断。