龙芯 LA664 丢失的原子更新:一条原子指令引发的打包死循环
来源:jia.je — 10 分 · by jiegec
📋 概述
作者记录了一处此前未知的龙芯 LA664 勘误。2026 年 2 月,LoongArch 上 Debian 13 社区移植版 loong13 的维护者王淼在打包 normaliz 时发现内置测试总是超时,卡在一个逃不出去的死循环里;顺着代码追下去,问题指向一句极普通的 OpenMP #pragma omp atomic 自增——循环退出条件要求累加值等于总点数,而累加结果总是偏小。代码规模太大,半年都没能缩减出人可读的最小例子,事情被搁置;8 月改用 AI 主导找复现、人来指挥方向的办法,约两天后拿到稳定复现器,根因是 CPU 的原子加指令偶尔做不到原子。龙芯得知后两周内给出几乎无性能损失的修复并提供测试固件,作者确认问题解决,正式固件预计在国庆前发布。
🔑 核心要点
- 触发场景很日常:打包 normaliz 时内置测试卡在无法退出的死循环里。
- 问题代码只有一句:OpenMP 的 #pragma omp atomic 自增计数器。
- 死循环的机制是累加值永远小于总数:nr_points_matched 追不上 nr_to_match。
- 人工排查在此卡住:代码太大,半年都没做出人可读的最小复现。
- 转折来自方法:让 AI 找最小复现、人来指挥方向,约两天拿到稳定复现器。
- 根因在硬件:CPU 的原子加指令偶尔不原子;龙芯两周内给出几乎无性能损失的修复,正式固件预计国庆前发布。
💡 金句
这时我们才发现根本原因:CPU 的原子加指令偶尔并不能做到原子。这意味着我们发现了新的 CPU 勘误。
👍 0
👎 0
← 返回 Hacker News 首页