

正文热点数据对应【Top30 热点调用栈统计表】,函数耗时分布趋势参考【程序执行火焰图】,采样环境:鲲鹏 920+openEuler5.10 aarch64、裸迁移无优化、采样时长 300s,配套前期 300s 访存采样数据联合分析。
一、测试背景说明
本次依托鲲鹏 Devkit 性能分析模块,对 x86 裸迁移至鲲鹏 openEuler 的无两相流体仿真程序开展热点采样,未做源码修改、编译优化、线程绑核、系统参数调优;基于Top30 耗时函数清单 + 调用栈火焰图,拆分 CPU 耗时来源,分为自研业务核心函数、系统锁函数、浮点数学库、MPI / 第三方依赖库四大类,结合前文 LLC Miss、缓存带宽异常等访存数据,定位热点与访存瓶颈的关联性。
二、热点函数分类拆解与问题分析
(一)自旋锁函数:pthread_spin_lock/pthread_spin_unlock 合计占比超 10%,头号系统开销
从热点统计表可见:pthread_spin_lock(9.46%)、pthread_spin_unlock(1.09%)两项系统自旋锁总周期占比突破 10%,位列全函数耗时第一。
- 问题根源:流体仿真多线程并行求解阶段,临界区代码过长、锁粒度偏大,大量线程频繁抢占自旋锁;自旋锁等待时线程持续占用 CPU 空轮询,不主动让出 CPU,既浪费鲲鹏多核算力,又频繁打断数据访问连续性,破坏缓存局部性,直接加剧 L1/LLC 缓存颠簸、拉高前文统计的 931.8 万次 LLC 缺失。
- 关联访存瓶颈:高频加解锁打乱数组连续访问,是 dCache 带宽不规则脉冲震荡、缓存命中率下滑的关键诱因之一。
(二)自研流体核心求解函数(业务主体,合计超 30% CPU 耗时)
imb_condif_(5.04%)、imb_vis(2.74%)、gradient(2.35%)、cgstab(1.52%)、temperature(1.32%)、imb_y_zero_等自研核心计算函数为仿真主体热点,是程序浮点密集计算核心。
- 代码痛点:代码基于 X86 架构编写,多维数组采用列优先 / 随机存储、循环跨度大,跨步离散访存严重,无法适配鲲鹏 64B 缓存行与分级缓存架构;超长数据依赖链抑制指令并行,前期微架构分析中 Core Bound(执行端口拥堵)、后期 Memory Bound(缓存缺页)均由该类函数访存缺陷引发。
- 数据印证:前文 LLC Miss 按线程、CPU 分布不均衡,热点求解函数所在线程、对应 CPU 恰好是 LLC 缺页高发节点。
(三)标准浮点数学库函数:powf32/_pow_finite 带来额外浮点开销
powf32(0.73%)、_pow_finite(0.66%)幂运算函数单独占用可观 CPU 周期,CFD 仿真迭代中被高频循环调用。
- 问题:glibc 原生 powf 函数未针对 ARMv8-NEON 做向量化优化,单次幂运算指令依赖链长、无法并行,挤占鲲鹏浮点执行端口,加重早期 Core Bound 瓶颈;循环内反复调用标准库,频繁跳出用户态破坏数据缓存。
(四)边界处理与底层通信依赖函数
boundary3、pbsrhl、stochastic等边界条件处理函数(合计超 2% 耗时):边界网格数据随机离散访问,无数据分块,是短时 DDR 带宽冲高、跨 NUMA 随机访存的代码来源;- OpenMPI、libfabric 动态库函数(
ompi_mti_of_progress、libfabric.so系列)合计占比超 2%:MPI 并行数据分片不合理,多进程间数据跨 NUMA 节点分发,触发大量远端内存访问,放大 Memory Bound 损耗。
(五)其余库函数
bcmp、gfortran_compare_string等少量工具函数占比偏低,非重点优化对象。
三、热点与前期访存、微架构瓶颈联动总结
- 自旋锁开销→缓存颠簸→LLC Miss 飙升:高频 spinlock 破坏访存局部性,是海量 L3 缺失的重要软件诱因;
- 核心求解函数不合理访存→多级缓存击穿:原生数组、循环写法不匹配鲲鹏缓存,数据频繁从 L1 穿透至 L3、DDR;
- 串行浮点 powf→指令串行→早期 Core Bound:幂函数串行运算拉长指令依赖,前期端口满载阻塞,优化 ILP 后缓存问题暴露。
四、分层次落地优化方案(openEuler + 鲲鹏专属)
1. 锁优化(优先落地,降低 10%+ 无效 CPU 损耗)
- 缩小临界区范围,仅在必要数据修改处加锁;超长临界区将自旋锁替换为 pthread_mutex 互斥锁,线程阻塞时释放 CPU,减少空转;
- 采用数据分片无锁设计,各线程独占私有计算数组,从源头减少共享资源争抢。
2. 自研核心计算函数源码优化(缓解 Memory Bound 核心手段)
- 多维数组改为ARM 行优先连续存储,匹配鲲鹏 64B 缓存行;对
gradient、imb_condif_等高耗循环实施循环分块 Blocking,块大小适配鲲鹏 L1-D Cache(64KB/128KB),提升 L1 缓存命中率; - 调整循环嵌套顺序,消除跨步访存,减少 LLC 缓存缺失。
3. 浮点 powf 函数优化
- 编译侧:启用鲲鹏 GCC / 毕昇编译器
-O3 -ftree-vectorize -ffp-contract=fast,开启 NEON 向量化与 FMA 浮点融合运算,优化标准库浮点调用; - 代码侧:固定指数场景替换自研快速幂算法,或接入鲲鹏 KML 高性能数学库,使用 ARM 优化版 vec_pow 矢量接口批量计算,降低单指令开销。
4. MPI 与系统运行优化
- MPI 进程绑定同一 NUMA 连续物理大核(taskset 绑核),数据本地分配规避跨 NUMA 远端 DDR 访问;
- openEuler 配置 2MB HugePage 大页,降低 DTLB 缺页,配套 performance 性能调频策略。
5. 编译全量优化参数
bash
五、小结
通过 Devkit 热点 + 访存 + 微架构三维联动分析,明确自旋锁滥用、不合理数组访存、低效标准浮点函数是本无两相仿真裸迁移性能受限的三大代码根源。针对热点函数分优先级优化后,预期锁开销下降 70% 以上、核心函数缓存命中率大幅提升,同步降低 LLC Miss 数量,推动 IPC 进一步抬升。本套调优思路可复用在 CFD、多相流、有限元等同类 x86 转鲲鹏 HPC 仿真项目。
一、测试背景说明
本次依托鲲鹏 Devkit 性能分析模块,对 x86 裸迁移至鲲鹏 openEuler 的无两相流体仿真程序开展热点采样,未做源码修改、编译优化、线程绑核、系统参数调优;基于Top30 耗时函数清单 + 调用栈火焰图,拆分 CPU 耗时来源,分为自研业务核心函数、系统锁函数、浮点数学库、MPI / 第三方依赖库四大类,结合前文 LLC Miss、缓存带宽异常等访存数据,定位热点与访存瓶颈的关联性。
二、热点函数分类拆解与问题分析
(一)自旋锁函数:pthread_spin_lock/pthread_spin_unlock 合计占比超 10%,头号系统开销
从热点统计表可见:
pthread_spin_lock(9.46%)、pthread_spin_unlock(1.09%)两项系统自旋锁总周期占比突破 10%,位列全函数耗时第一。(二)自研流体核心求解函数(业务主体,合计超 30% CPU 耗时)
imb_condif_(5.04%)、imb_vis(2.74%)、gradient(2.35%)、cgstab(1.52%)、temperature(1.32%)、imb_y_zero_等自研核心计算函数为仿真主体热点,是程序浮点密集计算核心。(三)标准浮点数学库函数:powf32/_pow_finite 带来额外浮点开销
powf32(0.73%)、_pow_finite(0.66%)幂运算函数单独占用可观 CPU 周期,CFD 仿真迭代中被高频循环调用。(四)边界处理与底层通信依赖函数
boundary3、pbsrhl、stochastic等边界条件处理函数(合计超 2% 耗时):边界网格数据随机离散访问,无数据分块,是短时 DDR 带宽冲高、跨 NUMA 随机访存的代码来源;ompi_mti_of_progress、libfabric.so系列)合计占比超 2%:MPI 并行数据分片不合理,多进程间数据跨 NUMA 节点分发,触发大量远端内存访问,放大 Memory Bound 损耗。(五)其余库函数
bcmp、gfortran_compare_string等少量工具函数占比偏低,非重点优化对象。三、热点与前期访存、微架构瓶颈联动总结
四、分层次落地优化方案(openEuler + 鲲鹏专属)
1. 锁优化(优先落地,降低 10%+ 无效 CPU 损耗)
2. 自研核心计算函数源码优化(缓解 Memory Bound 核心手段)
gradient、imb_condif_等高耗循环实施循环分块 Blocking,块大小适配鲲鹏 L1-D Cache(64KB/128KB),提升 L1 缓存命中率;3. 浮点 powf 函数优化
-O3 -ftree-vectorize -ffp-contract=fast,开启 NEON 向量化与 FMA 浮点融合运算,优化标准库浮点调用;4. MPI 与系统运行优化
5. 编译全量优化参数
bash
五、小结
通过 Devkit 热点 + 访存 + 微架构三维联动分析,明确自旋锁滥用、不合理数组访存、低效标准浮点函数是本无两相仿真裸迁移性能受限的三大代码根源。针对热点函数分优先级优化后,预期锁开销下降 70% 以上、核心函数缓存命中率大幅提升,同步降低 LLC Miss 数量,推动 IPC 进一步抬升。本套调优思路可复用在 CFD、多相流、有限元等同类 x86 转鲲鹏 HPC 仿真项目。