一、前言
本文依托鲲鹏 Devkit 性能分析套件,从微架构流水线、内存缓存访存、热点函数、磁盘 I/O四大维度,对无两相流体仿真程序(X86 裸迁移鲲鹏 920+openEuler)开展多轮 300s 定点采样,全程无源码修改、编译优化、系统调参,完整还原原生应用性能瓶颈全貌,汇总全维度测试结论与分层优化方案,为同类型 CFD 科学计算应用上云鲲鹏提供完整调优参考。
二、全维度测试结果汇总分析
1. 微架构:瓶颈由 Core Bound 自然演进为 Memory Bound,IPC 整体偏低
两轮同等环境采样 IPC 均为 1.11,远低于鲲鹏合理最优 IPC(2.0~3.0),整体流水线阻塞集中在 Backend Bound(76.30%/76.04%),前端取指、分支预测损耗占比不足 5%,无优化优先级。
- 第一轮 Core Bound 为主(54.18%):大量周期出现全执行端口占用(0 ports non serialize 占 20.26%),指令并行度 ILP 严重不足,鲲鹏多发射浮点 / 整数执行单元闲置,浮点除法、运算单元阻塞占比极低,根源是原有代码指令依赖过长、缺少向量化与循环优化。
- 第二轮切换至 Memory Bound(21.95%):执行端口压力小幅释放后,缓存短板暴露,瓶颈由 L1 缺失 (11.15%)+DTLB 缺页 (1.62%)+L3 缺失 (9.84%) 共同构成,L2、主存带宽、写回阻塞影响微弱,缓存失效成为新性能天花板。
2. 访存维度:多级缓存命中率差、LLC 海量缺页 + 跨 NUMA 乱序访存
- L1d、L3 缓存带宽时序震荡剧烈,数据访问局部性差,数据频繁击穿各级缓存向下穿透;
- 全周期 LLC(L3)总缺失 931.8 万次,从进程、线程、CPU 三个维度负载分化明显,部分线程 / 核心集中爆发大量缓存失效;
- 平台四 NUMA 硬件架构,但程序无内存亲和配置,内存随机分配至不同 NUMA 节点,产生大量跨 NUMA 远端 DDR 访问,进一步拉高访存延迟,是 Memory Bound 的硬件诱因。
- 结合微架构数据可印证:缓存大量缺失直接拉长流水线等待周期,压低整机 IPC。
3. 热点函数:锁开销、核心计算、低效数学函数三大耗时源头
由 Devkit 热点 TOP30 + 火焰图定位 CPU 开销:
- 自旋锁开销突出:
pthread_spin_lock/unlock合计周期占比超 10%,多线程频繁抢锁空转,破坏数据连续性,加剧缓存颠簸与 LLC Miss; - 自研求解函数占主要算力:
imb_condif_、imb_vis、gradient、temperature等流体核心函数为计算主体,代码跨步访存、数组存储不匹配 ARM 缓存行,是缓存失效的代码本源; - powf 浮点库、边界处理、MPI 通信库带来附加损耗:标准幂函数无 NEON 优化、边界离散访存、并行进程跨 NUMA 分配,持续拖累缓存与内存性能。
4. 磁盘 I/O:整体 I/O 负载低,非程序性能瓶颈
采样 sda、sdb 两块磁盘 I/O 数据:sdb 承担绝大部分 IO 请求(13517 次)、sda 仅 186 次,I/O 平均时延处于微秒级,磁盘队列 D2C 阶段时延占比最高;IO 块尺寸偏小、零散小 IO 居多,但整体 IOPS、吞吐占用资源有限,磁盘 I/O 并非当前程序性能短板,优化优先级最低。
三、综合瓶颈根因归纳
- 代码层面:基于 X86 编写,数组存储、循环结构不适配 ARM64 缓存架构;多线程临界区过大、自旋锁滥用;循环内频繁调用未优化标准浮点函数,指令串行度高。
- 编译层面:默认编译未开启鲲鹏专属优化、NEON 向量化、循环展开,无法发挥 ARMv8 架构算力优势。
- 系统运行层面:未做 NUMA 绑核、未配置 HugePage 大页,内存随机分配引发跨 NUMA 远程访存、DTLB 缺页,恶化缓存表现。
四、分优先级优化实施路线
优先级 1:编译 + 核心代码优化,解决原有 Core Bound
- openEuler 采用鲲鹏编译参数:
-O3 -march=armv8-a -mtune=kunpeng -ftree-vectorize -floop-unroll-and-jam,开启自动向量化; - 优化 powf 高频调用,替换自研快速幂或鲲鹏 KML 数学库,缩短浮点指令依赖链。
优先级 2:源码访存改造 + 系统调优,攻克 Memory Bound
- 核心函数数组改为行优先存储,高耗时循环做循环分块,适配鲲鹏 L1 缓存容量;线程数据分区隔离,减少共享 L3 争抢;
- 操作系统配置 2MB 大页降低 DTLB 缺失,taskset 绑定进程至同一 NUMA 连续大核,杜绝跨 NUMA 远端 DDR 访问;CPU 设置 performance 调频策略。
优先级 3:多线程锁优化
缩小临界区范围,热点自旋锁按需替换互斥锁,减少 CPU 空转损耗,改善缓存局部性。
优先级 4:I/O 优化(按需延后)
零散小 IO 合并为大块顺序 IO,当前 I/O 无性能瓶颈,可在算力优化完成后按需调整。
五、总结
经过 Devkit 四大模块全链路诊断,无两相仿真裸迁移鲲鹏的性能短板呈现先计算受限、后缓存受限的典型 ARM 迁移特征,性能短板集中在代码适配、编译选项、NUMA 调度三大方向,磁盘 IO 无瓶颈。按优先级分步优化后,预期 IPC 明显抬升、LLC 缺失大幅下降,整体程序运行效率可实现显著提升,本次分析总结的调优逻辑可批量复用至 CFD、多相流、有限元等同类工业仿真软件鲲鹏迁移落地。
一、前言
本文依托鲲鹏 Devkit 性能分析套件,从微架构流水线、内存缓存访存、热点函数、磁盘 I/O四大维度,对无两相流体仿真程序(X86 裸迁移鲲鹏 920+openEuler)开展多轮 300s 定点采样,全程无源码修改、编译优化、系统调参,完整还原原生应用性能瓶颈全貌,汇总全维度测试结论与分层优化方案,为同类型 CFD 科学计算应用上云鲲鹏提供完整调优参考。
二、全维度测试结果汇总分析
1. 微架构:瓶颈由 Core Bound 自然演进为 Memory Bound,IPC 整体偏低
两轮同等环境采样 IPC 均为 1.11,远低于鲲鹏合理最优 IPC(2.0~3.0),整体流水线阻塞集中在 Backend Bound(76.30%/76.04%),前端取指、分支预测损耗占比不足 5%,无优化优先级。
2. 访存维度:多级缓存命中率差、LLC 海量缺页 + 跨 NUMA 乱序访存
3. 热点函数:锁开销、核心计算、低效数学函数三大耗时源头
由 Devkit 热点 TOP30 + 火焰图定位 CPU 开销:
pthread_spin_lock/unlock合计周期占比超 10%,多线程频繁抢锁空转,破坏数据连续性,加剧缓存颠簸与 LLC Miss;imb_condif_、imb_vis、gradient、temperature等流体核心函数为计算主体,代码跨步访存、数组存储不匹配 ARM 缓存行,是缓存失效的代码本源;4. 磁盘 I/O:整体 I/O 负载低,非程序性能瓶颈
采样 sda、sdb 两块磁盘 I/O 数据:sdb 承担绝大部分 IO 请求(13517 次)、sda 仅 186 次,I/O 平均时延处于微秒级,磁盘队列 D2C 阶段时延占比最高;IO 块尺寸偏小、零散小 IO 居多,但整体 IOPS、吞吐占用资源有限,磁盘 I/O 并非当前程序性能短板,优化优先级最低。
三、综合瓶颈根因归纳
四、分优先级优化实施路线
优先级 1:编译 + 核心代码优化,解决原有 Core Bound
-O3 -march=armv8-a -mtune=kunpeng -ftree-vectorize -floop-unroll-and-jam,开启自动向量化;优先级 2:源码访存改造 + 系统调优,攻克 Memory Bound
优先级 3:多线程锁优化
缩小临界区范围,热点自旋锁按需替换互斥锁,减少 CPU 空转损耗,改善缓存局部性。
优先级 4:I/O 优化(按需延后)
零散小 IO 合并为大块顺序 IO,当前 I/O 无性能瓶颈,可在算力优化完成后按需调整。
五、总结
经过 Devkit 四大模块全链路诊断,无两相仿真裸迁移鲲鹏的性能短板呈现先计算受限、后缓存受限的典型 ARM 迁移特征,性能短板集中在代码适配、编译选项、NUMA 调度三大方向,磁盘 IO 无瓶颈。按优先级分步优化后,预期 IPC 明显抬升、LLC 缺失大幅下降,整体程序运行效率可实现显著提升,本次分析总结的调优逻辑可批量复用至 CFD、多相流、有限元等同类工业仿真软件鲲鹏迁移落地。