首页
/ OpenBLAS在Graviton3处理器上的NAN断言问题分析与修复

OpenBLAS在Graviton3处理器上的NAN断言问题分析与修复

2025-06-01 07:09:01作者:胡易黎Nicole

问题背景

在AWS Graviton3(r7g实例)处理器上运行Kaldi语音识别工具时,开发者遇到了一个数值计算异常问题。具体表现为Kaldi的Mel频率倒谱系数(MFCC)计算过程中出现了NAN(非数值)断言失败。这个问题在使用OpenBLAS 0.3.27版本时出现,而在0.3.21版本中则工作正常。

问题定位

通过系统性的测试和分析,开发者发现:

  1. 问题与处理器核心类型选择密切相关:

    • 当设置OPENBLAS_CORETYPE=neoversen2/neoversev2/neoversev1时,会出现NAN错误
    • 只有设置为neoversen1时才能正常工作
  2. 通过版本对比测试确认:

    • 0.3.22和0.3.25版本工作正常
    • 0.3.26版本开始出现NAN问题
  3. 使用git bisect工具精确定位到问题根源:

    • 问题源于7a4fef4f604db2a5e4e0c4ffaebea220a0646ab1这个提交
    • 这个提交优化了SVE(可伸缩向量扩展)指令集的DDOT(双精度点积)内核实现

技术分析

深入分析发现,问题的本质在于:

  1. 内联汇编代码缺少必要的clobber列表声明

    • Clobber列表用于告知编译器哪些寄存器会被汇编代码修改
    • 缺少这一声明可能导致编译器错误地假设某些寄存器内容未被修改
  2. 在Graviton3(Neoverse-V1架构)处理器上:

    • 错误的寄存器假设导致计算结果出现NAN
    • 这一问题在Neoverse-N1架构上不出现,说明与具体微架构实现相关
  3. 测试验证:

    • 开发者构建了专门的测试用例验证DDOT函数
    • 确认在NO_FORTRAN=1的构建配置下问题重现
    • 在c7g实例(Graviton3开发平台)上同样复现

解决方案

修复方案主要包括:

  1. 为SVE内核的DDOT实现添加完整的clobber列表

    • 明确声明所有被修改的寄存器
    • 确保编译器正确理解汇编代码的行为
  2. 验证测试:

    • 修复后,所有核心类型(NEOVERSE{N,V}{1,2})均工作正常
    • Kaldi语音识别流程完整运行无异常

经验总结

这个案例提供了几个重要的技术经验:

  1. 汇编级优化需要特别注意ABI兼容性

    • 即使是性能关键的内核,也不能忽视编译器的交互需求
  2. 跨架构测试的重要性

    • 同一指令集的不同微架构实现可能有细微差异
    • 全面测试覆盖是保证兼容性的关键
  3. 开源协作的价值

    • 开发者与维护者的高效沟通加速了问题解决
    • 详细的测试报告帮助快速定位问题根源

这个问题展示了在ARM架构演进过程中,性能优化与稳定性保障之间的平衡艺术,也为类似场景下的问题排查提供了参考范例。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
260
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
858
507
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
255
299
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
331
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
397
370
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
21
5