Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b1d33f2
test(eigen_sparse): per-thread 同源 golden 化——消除 init 共享 golden 的满线程 UL…
wangxumarshall Oct 24, 2026
85a4217
feat(eigen): 维度时间校准——内存自适应叠加单次求解时长上限, 修复 -t 无法打断大维度迭代
wangxumarshall Oct 24, 2026
217b2e8
docs(plan): eigen_svd 家族多线程拉满实施计划(P0/P1/P2)与执行记录
wangxumarshall Oct 24, 2026
596f36a
docs(eigen): 满核假阳修复口径同步——CLAUDE.md 平台怪癖条目与 README 结果判读
wangxumarshall Oct 24, 2026
895f0ba
fix(eigen_sparse): run() 两处 generate_problem 纳入 OOM 异常防护(PR #290 意见 #…
Oct 24, 2026
a61a075
fix(eigen): 校准 probe 纳入 OOM 异常防护, 异常时退回内存自适应档(PR #290 意见 #8/#12)
Oct 24, 2026
4f688cd
fix(eigen_sparse): 校准 probe 散列换 64-bit mix + k_floor 提正 3.0(PR #290 意…
Oct 24, 2026
128756e
fix(framework): sdc_calibrated_dim 增加外推后验证探针, 构造性保证单解 ≤ 预算(PR #290 意见…
Oct 24, 2026
3f06692
fix(eigen_sparse): 解向量比对改 memcmp_or_fail 位级比较(PR #290 意见 #15)
Oct 24, 2026
aa945c9
fix(campaign): KNOWN_FLAKY 白名单移除 eigen_svd_double/eigen_sparse(PR #29…
Oct 24, 2026
c88f53c
docs(README): eigen 判读规则限定构建版本, 预构建段加旧二进制警示(PR #290 意见 #7)
Oct 24, 2026
1e72083
docs(eigen): 验证口径写真实机器, 澄清分支提交数字来源(PR #290 意见 #16)
Oct 24, 2026
e49a9f7
docs(eigen_sparse): generate_problem 注释更正——非严格对角占优与 LDLT 依赖(PR #290 意…
Oct 24, 2026
a90241c
docs(eigen): 检出通道口径披露——same-source repeat 的能力边界(PR #290 意见 #13, 变通采纳)
Oct 24, 2026
1a4fce8
chore(eigen_sparse): 补显式 #include <cmath>/<cstdint>/<vector>(PR #290 …
Oct 24, 2026
72647e9
chore(stress-config): 收缩循环变量 nd 改名 newdim, 修复 codespell lint(PR #290 意见)
wangxumarshall Oct 25, 2026
2cbfa69
fix(eigen_sparse): 校准 probe 的 solve() 惰性表达式落入向量——补上被跳过的三角回代计时
Oct 25, 2026
0216799
fix(eigen): 校准 probe 异常兜底退守校准下限 lo——遵守『上限宁小勿大』
Oct 25, 2026
b28d9e3
refactor(eigen_sparse): 校准 probe 与 generate_problem 负载形状常量单源化
Oct 25, 2026
becbabb
docs(eigen_sparse): 异常分类契约与 LDLT 零主元条件注释——检视 #39/#46 的处置依据入档
Oct 25, 2026
751da4f
fix(framework): 校准日志尾巴区分『lo 档超预算/收缩轮数上限』+ 契约注记补 probe 口径与满核实测
Oct 25, 2026
6d8817d
docs(README): 旧二进制战役调用补 KNOWN_FLAKY 逃生门——文档口径与脚本默认行为对齐
Oct 25, 2026
16a000b
docs(eigen): 满核带宽竞争实测口径——『单解 ≤ 2s』限定单线程探针, TERM 兑现依据写实测
Oct 25, 2026
66074ac
fix(eigen): SVD 校准 probe 谱系修复——条纹阵换同谱系散列填充(PR #290 意见 #51)
Oct 26, 2026
aa4a254
docs(eigen): 模板过时 flakiness 注释随 CLAUDE.md 新口径更新(PR #290 意见 #48)
Oct 26, 2026
62cce4e
docs(eigen): 检出通道披露口径修正——golden-value 族覆盖断言限定其自身路径(PR #290 意见 #52/#49)
Oct 26, 2026
4cd9747
fix(eigen): P1 评审处置——时间校准退化分支方向修正 + 验证探针口径如实化 + README 补谓语
Oct 26, 2026
09906d2
fix(docs): CLAUDE.md 平台怪癖节去身份化回退修复 + eigen 修复口径补入
Oct 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 41 additions & 19 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,27 +100,49 @@ END_DECLARE_TEST
(the framework quiets SNaN uniformly in `sandstone_data.cpp` so FP16/BF16
NaN bit patterns match cross-arch).

## Known platform quirks (Kunpeng 920, openEuler 24.03 SP3)
## Known platform quirks (probe per host — this section binds no machine)

这些条目来自**多台**开发机的实测记录,单条可能只对其中一部分机器成立。
换机先按 rule 2 探测;与本机实测冲突时以本机实测为准,并顺手更新本节。

- `sysfs cluster_id` increases monotonically (138→654→1170…) and
`physical_package_id` is large — firmware/ACPI-PPTT artifact, read as-is.
- No `cpufreq` → `--vary-frequency`/`--vary-uncore-frequency` skip gracefully;
no CPU `thermal_zone*` zones → thermal throttle is a no-op here.
- `eigen_svd_double`/`eigen_sparse` fail sporadically under full-system
multithreading (ULP-level diffs vs strict memcmp; the original "192 CPUs"
records are from the cortex x3b machine — see the SVE rule below, this host
is the 96-CPU 0xd01) — `-n 1` always
passes. Eigen/large-core-count limitation, not a port defect.
- SVE runtime-VL rule: this host (0xd01, Kunpeng 920, 96 CPUs) has NO
SVE/SME — all SVE/SME functional verification is gem5-fi only
(`--sve_vl/--sme_vl {1,2,4,8}` = 128/256/512/1024-bit). Earlier "host is
VL=256" records refer to a different machine (cortex x3b,
docs/architecture.md:130). All-VL Phase 2 P5: `tests_sve` (eigen×2 only)
still compiles at fixed 128-bit — the tests self-pin each worker thread to
the compile-time VL inside `test_run` (`arm64_sve_pin_vl(16)`, no external
launcher; pin failure skips honestly); `sleef_sve` + sve_rot×5 migrated to
the true-VLA `tests_sve_vla` library (no `-msve-vector-bits`, all-VL
128..1024-bit).
`physical_package_id` is large — firmware/ACPI-PPTT artifact (observed on a
Kunpeng-family board); read as-is.
- cpufreq/thermal **因机而异**:有的板有 `cppc_cpufreq`(每核独立 policy,
实测范围见 `cpuinfo_min_freq`/`cpuinfo_max_freq`),有的完全没有。先看
`ls /sys/devices/system/cpu/cpu0/cpufreq` 与 `ls /sys/class/thermal/`:
缺 `cpufreq` 时 `--vary-frequency`/`--vary-uncore-frequency` 优雅 SKIP;
缺 CPU `thermal_zone*` 时 thermal throttle 是 no-op。都不是缺陷。
- `eigen_svd_double`/`eigen_sparse` full-core flakiness is **FIXED**
(2026-10-24, feat/eigen-svd-multithread): both now use the per-thread
same-source golden (each worker generates its own input and recomputes the
golden on the same thread), so cross-thread Eigen SIMD-path divergence can
no longer produce false mismatches. Verified on a 64-core host: full-run
green (3x240s x 3 seeds, 10-min x 2 tiers, 300s rerolls) plus gem5-fi FS
2-core `eigen_svd_double -n 2` pass. Run full-core; `-n 1` is no longer
required. Adaptive dims are time-calibrated (`sdc_calibrated_dim`:
two-probe power-law + k_floor, one solve <= ~2s so the `-t` TERM is
honoured); explicit `-O <test>.mdim/n` skips calibration. The pre-fix
"ULP-level sporadic failure under full-core multithreading" advice is
obsolete.
- **Vector capability (SVE/SVE2/SME, VL/SVL tiers) is per-host — probe it,
never assume it.** Measured lab hosts differ widely: some expose SVE with a
pinnable VL and no SVE2/SME, some expose the full SVE2 set + SME/SME2 at a
wider VL. Verification path follows rule 2: tiers the host supports are
verified natively here; tiers it lacks go to gem5-fi
(`--sve_vl/--sme_vl {1,2,4,8}` = 128/256/512/1024-bit). `tests_sve`
compiles at fixed 128-bit, so on SVE hosts with VL≠128 the eigen SVD test
needs a VL-pinning launcher (`scripts/eigen-sve-double/` precedent; the
external `/tmp/vlrun` tool no longer exists); `sleef_sve` stays at 128 by
design.
- **SME caveat**: "HWCAP2_SME=0 / `SMSTART` raises SIGILL" only proves SME is
*not enabled by this kernel* — with `CONFIG_ARM64_SME=n` (check
`/boot/config-$(uname -r)`; the SME sysctl
`/proc/sys/abi/sme_default_vector_length` will also be absent) EL0 `SMSTART`
traps regardless of silicon. A kernel-level "absent" is not a hardware
verdict; say "software-invisible" and state the boundary.

## Documentation map — consult before guessing

## Documentation map — consult before guessing

Expand Down
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ bash scripts/run/sdc_detect.sh
```bash
# 源码构建
./builddir/sdcshield --quality=0 -T forever -t 60s -Y -F -o sdc-$(date +%m%d-%H%M).yaml
# 预构建二进制(旧 tarball;clone 后进入对应 SP 的 built 目录)
# 预构建二进制(旧 tarball,2026-09-12 构建 = eigen 满核假阳修复【2026-10-24】之前;clone 后进入对应 SP 的 built 目录)
./run-sdcshield.sh --quality=0 -T forever -t 60s -Y -F -o sdc-$(date +%m%d-%H%M).yaml
```

Expand All @@ -71,7 +71,7 @@ bash scripts/run/sdc_detect.sh

1. **一直跑不停** = 本轮全过;`-T forever` 自动进入下一轮,继续挂着(检出率随时间积累)。
2. **停下且有 FAIL**:先看挂在哪个测试——
- 挂在 `eigen_svd_double` / `eigen_sparse`:大核数机器全核多线程下的已知 ULP 级良性抖动。用 `-e <测试名> -t 5000 -n 1` 单线程复跑(源码树 `./builddir/sdcshield`、预构建 `./run-sdcshield.sh`):**单线程过 = 良性**(假阳性),单线程也挂 = 真嫌疑。
- 挂在 `eigen_svd_double` / `eigen_sparse`(**本条仅适用于含 2026-10-24 修复的构建**,即 feat/eigen-svd-multithread 合入后的源码构建;2026-09-12 预构建旧二进制见上节警示):**2026-10-24 已修复**(per-thread 同源 golden——每 worker 独立生成输入并在同线程重算 golden,跨线程 Eigen SIMD 路径分歧不再产生假 mismatch;分支会话验证【64 核机器,git 无法进一步判定身份,来源未定谳】:3×240s×3 seed + 10 分钟档×2 + 300s 换 seed 全绿,gem5-fi FS 双线程 `eigen_svd_double -n 2` pass;本机复跑锚点【鲲鹏 920 0xd01,128 CPUs = 2×64 核,32GB】:满核 `eigen_sparse` 300s×2 seed 全绿,校准 k=3.30~3.39 → 单解验证 369-825ms ≤ 2s 预算【单线程探针口径;满核带宽竞争同分布实测 ~24.9×(单解 ~14s、含 reroll 最坏迭代 ~29s,2026-10-25 实测),远低于框架 300s 硬宽限,`-t` TERM 由该宽限兜底】)。**满核挂 = SDC 嫌疑**,与其他测试同等进入定位流程;`-e <测试名> -t 5000 -n 1` 单线程复跑仍可用作交叉对照(单线程也挂 = 高嫌疑),但不再是"良性抖动"判定。历史"已知 ULP 级良性抖动"记录见 CLAUDE.md 平台怪癖条目(修复前行为)。检出通道口径:eigen 族的同源重算比对(same-source repeat)检出**非确定性缺陷**(瞬态/间歇/边际——同输入不同位;打坏 golden 本身的错误也会在下一轮重算比对中 FAIL);对**确定性核缺陷**存在结构性盲区(golden 与重算走同一错误路径、位级一致地错)。golden-value 测试族(固定 golden 数据)只覆盖**其自身**指令路径(FMA/SIMD/加密/压缩等)——全套件没有任何 Eigen 分解路径的固定 golden 测试(Eigen 全族 gemm/sparse/svd 均为同源重算),Eigen 路径的确定性缺陷是**已披露的覆盖空洞**(旧共享 golden 的概率性检出通道被主动换弃以消除满核假阳)。
- 挂在其他任何测试:**SDC 嫌疑**。保留 `-o` 落盘的 YAML 日志(含 seed/迭代号,可复现),进入定位流程。
3. **停止方式**:Ctrl-C 干净停止(当前测试跑完边界即停,日志完整落盘,`exit: interrupted`)。
4. **检出后的定位**:`bash scripts/run/run_sdc_campaign.sh`(24h 战役,自动失败分类 known_benign_ulp / sdc_suspect + 可复现嫌疑自动逐核二分定位)。
Expand Down Expand Up @@ -124,6 +124,15 @@ sudo bash scripts/sdc-excite-reproduce/excite.sh --stop # 停止(保留断

预构建二进制(git 08c37be3,2026-09-12 构建)含 221 个 PROD 用例——少于源码构建(440)是因为镜像内未含全部 vendored 计算库测试组;检出命令见上节"一行命令"。

> **旧二进制判读警示**:2026-09-12 预构建二进制是 `eigen_svd_double`/`eigen_sparse` 满核假阳修复(2026-10-24,feat/eigen-svd-multithread)**之前**的构建——其上这两个用例的满核 FAIL 仍按旧口径判读为已知 ULP 级良性抖动(`-n 1` 复跑通过即可),不升级为 SDC 嫌疑;下节"满核挂 = SDC 嫌疑"的判读规则仅适用于含 2026-10-24 修复的构建。**若用旧二进制跑 24h 战役脚本**(`scripts/run/run_sdc_campaign.sh`),须显式恢复旧白名单,否则这两个用例的满核假阳会被按新口径分类为 `full_core_only` 而非 `known_benign_ulp`(在仓库根目录):
>
> ```bash
> SDC=third-party/rpms/openEuler-24.03/openEuler-24.03LTS_SP3/built/run-sdcshield.sh \
> KNOWN_FLAKY="eigen_svd_double eigen_sparse" bash scripts/run/run_sdc_campaign.sh
> ```
>
> (`SDC`/`KNOWN_FLAKY` 两个环境变量仅用于旧二进制;含修复的源码构建不需要、也不应设置。)

```bash
git clone --recurse-submodules <repo-url> # 含子模块
cd third-party/rpms/openEuler-24.03/openEuler-24.03LTS_SP3/built
Expand Down
87 changes: 87 additions & 0 deletions docs/superpowers/plans/2026-10-24-eigen-svd-multithread.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# eigen_svd 家族多线程拉满——实施计划(P0/P1/P2)

日期:2026-10-24
分支:feat/eigen-svd-multithread
前置:设计讨论(2026-10-23 会话)+ 本机满核实证(3×240s 全绿)+ gem5-fi FS
模式双线程实证(`gem5-fi` 仓 `feat/fs-sdcshield-multithread` 分支,
`eigen_svd_double -n 2 → pass`)。

## 0. 背景与结论(实证)

- **结构层已多线程**:eigen_svd 家族 10 用例(BDCSVD×6 + JacobiSVD×4)统一走
`EigenSVDTest` 模板 = per-thread 输入 + per-thread 同源 golden(H11'/P14,
46141ed4 模式)。本机 64 核满跑 3×240s×3 seed 全绿。
- **CLAUDE.md 的 "eigen_svd_double 满线程 ULP 假阳 → use -n 1" 是 H11' 改造前
的过时记录**(旧结构 init 共享 golden 跨线程比对)。
- **真残留**:
1. `eigen_sparse` 仍是 init 共享 golden(CLAUDE.md 点名两个用例中唯一旧模式);
2. 自适应维度上限 2048 时单次 BDCSVD 数分钟,`-t` 无法打断迭代内计算
(实测 2 分钟 timeout 杀不掉);
3. 文档口径未解除 `-n 1`。

## 1. Patch 拆分(one patch per unit)

### P1: eigen_sparse per-thread 化(`tests/cpu/eigen_sparse/eigen_sparse.cpp`)

对齐 `EigenSVDTest` H11' 模式:
- 删除 init 的 A/b/golden 共享生成与单点 golden 求解;
- run 内每线程独立:生成稀疏矩阵(保持 10% 密度 + 对角占优 + `[-1,1)` 值域,
良态可解)与 b(框架 RNG per-thread 流),**同线程先解出 golden 再重解比对**
(same-source repeat);
- `kRerollEvery = 16` 次重掷(解除当前"故意不 reroll"的冻结——冻结原因是旧
共享 golden 结构下的 flakiness,per-thread 化后该理由消除);
- init 保留维度计算(`sparse_n`)与数据骨架。
- 共享文件逻辑修复(同 H11' 先例),x86 同向受益,无架构分支。

验证:
- `./scripts/build.sh` 零新警告;
- 满核 64×≥300s×2 seed 全绿(reroll 生效,矩阵随时间变化);
- `-n 1` 对照 pass;
- `-e zstd19 -t 2000 -n 1` 回归 pass;
- x86 非回归:检视(无 `#ifdef` 分支变化)。

### P2: EigenSVDTest 维度时间校准(`tests/cpu/eigen_svd/sandstone_eigen_common.h`)

先例:`svd_cdouble_sve` init 按"10 分钟预算内完成整个测试"校准 N。
本 patch 把校准推广到模板:
- 模板 init(或首次 run 前一次性)以基准维度(128)试解一次 `calculate_once`
计时,按 O(n³) 外推,取 `dim = min(用户 dim, 使单次迭代 ≤ 剩余时间预算 1/4 的上限)`;
- 显式 `-O mdim=N`(knob/env 显式指定)时跳过校准(用户自担);
- 仅自适应路径(`sdc_auto_square_dim`)受校准约束。
- 共享模板改动,x86 同向受益。

验证:
- build 零新警告;
- `-O mdim=2048` 显式档不受校准影响(行为不变——校准只作用于自适应路径,
用 `-t` 短时 + 自适应档观测实际维度 ≤ 校准上限,日志引用真实输出);
- 满核回归 + zstd19 回归。

### P0: 文档更正(`CLAUDE.md`,如需 README)

- Known platform quirks 条目更正:`eigen_svd_double` 满核假阳已由 H11'
per-thread golden 消除(本计划长跑 + 既有 3×240s 实证);`-n 1` 建议仅保留给
`eigen_sparse`(P1 合入后该条亦可解除——P1 完成后一并更新为"已消除")。

验证:文档条目与实测输出一致(引用真实 YAML/terminal 输出)。

## 2. 执行顺序(全部完成,2026-10-24)

1. ✅ 满核长跑链:eigen_svd_double 10min mdim=128 `pass` / mdim=256
LCG:777 `pass`;eigen_sparse 段实测自适应大维度 timed out(SIGQUIT),
该现象归入 P2 问题域(非 ULP 假阳);
2. ✅ P1 代码 + 验证 + commit(98188ec9);
3. ✅ P2 代码 + 验证 + commit(05819d8e)——实施中两项实测驱动的加固:
probe 档自适应抬升(<1ms 翻倍,规则带状 probe 会把稀疏成本低估 3 个
数量级)、k_floor(小档实测 k 偏低,BDCSVD 64→128 实测 1.8 为预处理
主导,取 max(实测, 理论) 修正);
4. ✅ P0 文档更正(CLAUDE.md 平台怪癖条目 + README 结果判读);
5. ✅ push feature 分支。

## 3. 风险与诚实边界

- P1 reroll 引入稀疏结构随机性:对角占优保证可解性(SimplicialCholesky
正定),`solver.info() != Success` 时按现状 report_fail;
- P2 校准的外推是启发式(O(n³) 拟合单点)——上限宁小勿大(拉满优先于单轮
极限维度);显式 knob 优先,绝不覆盖用户显式指定;
- gem5-fi FS 侧 SVE 变体(svd_cdouble_sve)本轮不动——其校准逻辑已有先例
且本机无 SVE,改动须 gem5-fi 四档验证(超出本计划范围)。
Loading
Loading