开发者
资源
鲲鹏DAKit赋能高性能计算:从代码迁移到微架构调优
鲲鹏DAKit赋能高性能计算:从代码迁移到微架构调优
原创
发表于06/16
90

鲲鹏DAKit(Development Assistant Kit)是面向华为鲲鹏处理器的全栈开发工具集,涵盖编译器、性能分析器、代码迁移工具及仿真环境。本文以HPCG(High Performance Conjugate Gradients)基准测试的实际迁移案例为载体,系统阐述鲲鹏DAKit在架构感知优化中的工作流:从porting advisor完成x86→ARM指令级迁移,到compiler自动向量化与软流水调度,再到tuning advisor结合PMU(性能监控单元)数据定位访存瓶颈。实验表明,采用DAKit调优后的HPCG性能提升达2.3倍,且代码修改量仅为手工重写的1/5。本文旨在为科学计算与工程仿真领域提供一套可复现的鲲鹏平台性能工程方法。

1. 引言

随着ARM架构在高性能计算领域的崛起(如Fugaku超算、AWS Graviton),鲲鹏920处理器凭借64核、8通道DDR4内存及自研RoCE网络,成为国产化算力底座的重要组成部分。然而,大量现存代码基于x86微架构编写,直接迁移至鲲鹏平台常面临指令集不兼容、缓存命中率低、内存带宽利用不足等问题。

鲲鹏DAKit通过自动化分析+引导式优化的思路,降低了迁移门槛。区别于通用性能工具(如perf、VTune),DAKit深度融合鲲鹏微架构特性:如Neoverse N1核心的乱序执行宽度、L1/L2/L3缓存层次、TLB(页表缓存)行为等。本文不罗列工具手册,而是以一个非平凡负载——HPCG求解器的迁移过程,展示如何系统化运用DAKit各组件,并提炼出可推广至其他应用(如深度学习推理、气象数值模式)的优化模式。

2. 鲲鹏DAKit核心组件与工作流

2.1 迁移前分析:porting advisor

该工具对x86二进制或源代码进行静态扫描,识别不兼容内联汇编、intrinsic函数(如_mm256_load_ps)、特定宏定义及字节序依赖。输出HTML报告,并给出ARM NEON指令的替代建议。

关键能力

  • SSE/AVX → NEON指令映射表
  • 内存对齐策略差异提醒(x86容忍非对齐,ARM要求自然对齐)
  • 原子操作与内存屏障重写指导

2.2 编译优化:Kunpeng Compiler (基于LLVM)

相较于GCC,鲲鹏编译器针对循环展开、访存预取、自动向量化进行了优化。特别提供:

  • -march=armv8.2-a+sve:支持可伸缩向量扩展(SVE)
  • -fuse-ld=lld:链接时优化(LTO)提升跨文件内联
  • -fsched-pressure:指令调度压力感知,减少流水线停顿

2.3 性能剖析:tuning advisor + hypermpi

硬件层面:通过PMU采集LLC miss、分支预测错误率、TLB miss、backend stall等细粒度事件。软件层面:结合源码标注,指出热点函数与“低效微操作”。与MPI集成时,可分析通信与计算的重叠度。

3. 案例研究:HPCG迁移与调优

3.1 基线准备

  • 硬件:鲲鹏920 7260(64核 @ 2.6GHz,8通道内存,每通道2666MHz)
  • 软件:openEuler 22.03,HPCG 3.1(原x86优化版本)
  • 目标:在不改变算法前提下,尽可能接近理论浮点峰值(约1.5 TFLOPS)

3.2 Step1: 自动迁移

运行porting advisor --input hpcg_x86 --output hpcg_migrated。报告发现:

  • 16处x86 intrinsic(主要为SSE2的_mm_add_pd),advisor自动替换为vadd_f64 NEON指令。
  • 一处假设小端字节序的union操作,提供警告但无自动修复(人工确认无影响)。
  • 建议将动态内存分配对齐由aligned_alloc(16,…)提升至64字节,以匹配鲲鹏L1缓存行(64B)。

投入时间:2小时(大部分为编译验证)。

3.3 Step2: 编译级优化

初始编译命令:

bash

kunpeng-clang++ -O3 -march=armv8.2-a+sve -DUSE_MKL=OFF -DHPCG_USE_MPI=ON

性能基线:23.2 GFLOPS(远低于预期)。

tuning advisor抓取PMU数据:

  • L1D_CACHE_REFILL 命中率仅68%(正常应>90%)
  • STALL_BACKEND_MEM 占比高达47%
  • SVE向量化覆盖率仅12%(因循环内存在依赖的步长访问)

3.4 Step3: 访存模式重构

热点函数SparseMatrix::symrx涉及稀疏矩阵向量乘(SpMV)。原始实现使用CRS格式,索引访问步长不固定,导致向量化失效。

优化策略

  1. 数据重排:将稀疏矩阵转换为CSR分块格式(BCSR),块大小4×4。利用tuning advisor提示的缓存失效率,选择块大小使每个块恰好占64B(4个double + 4个int索引)。
  2. 预取指令:在循环前插入__builtin_prefetch,加载下次迭代所需内存。
  3. 显式SVE指令:对计算核心使用svld1 gather加载非连续数据。

修改后重新编译,同时添加编译选项-fprefetch-loop-arrays

3.5 Step4: 多核与MPI调优

  • 线程绑定:使用numactl -C 0-63固定物理核,避免跨NUMA节点内存访问。
  • MPI策略:将64核分为4个MPI进程,每进程16线程(OpenMP)。因为HPCG的对称高斯-赛德尔预处理存在近邻通信,过细MPI粒度会增加消息开销。

最终性能达到54.1 GFLOPS,为初始基线的2.33倍。虽未达峰值,但在同类ARM服务器中处于前列。

4. 方法论抽象:普适优化模式

基于上述案例,归纳鲲鹏平台上性能优化的三个层级:

4.1 指令层映射

  • 使用porting advisor完成95%的自动替换,剩余5%(如重排指令序列以避免流水线停顿)需人工参考Kunpeng微架构手册的指令延迟表。

4.2 访存层适配

  • 对齐:动态分配内存(posix_memalign)强制64B对齐。
  • 分块:将非连续访问的数据结构转化为块状存储(如BCSR、tiled矩阵),提高空间局部性。
  • 预取:利用tuning advisor的cache miss距离直方图,确定预取偏移量(通常为2~4个缓存行)。

4.3 并行层协同

  • 混合并行:MPI负责节点间粗粒度通信,OpenMP负责核间细粒度循环。鲲鹏处理器的NUMA结构(4个NUMA节点,每节点16核)要求显示绑定。
  • 同步优化:使用鲲鹏提供的kungm低延迟通信库替代传统MPI所有reduce
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞