Files
SystemSimulationApp/tests/manual/r288_real_skip_report.md
ljz 7611f13208 修复循环信号与事件采样并接入 LSTP 接触定位,补充八路验证及复用实验
相较上一版 Jacobian 确定性复用更新,本次补齐事件边界一致性、结果两侧采样及接触事件定位;保留已有物性复用和组件力学公式。

- 统一 UD00 信号求值与下一事件查询的绝对时间边界,修复循环边界浮点舍入导致的阶段错位、重复或漏报,并覆盖零时长、多阶段及长周期场景。
- 引入原生输出语义 v2:保留规则网格真实时间,补充内部时间事件和状态事件的左邻及事件后采样,按保存时间、状态和离散模式重放结果。
- 两条代码生成路径均发出 LSTP 接触描述,默认定位间隙过零及非负力模式的力截断;仅在接受事件时更新防重复记录,增加 contactEvents 诊断计数。
- 补充 MASS/LSTP 独立事件实验、八路全曲线与驱动阶段配对评估,以及 Amesim 不连续点输出对照和力差定位报告;MASS 新增释放机制仍保留为独立实验。
- 保存局部 probe、context 访问与回退、shadow replay、R288 real skip/typed replay 及阀门数值尾部诊断工具和报告;未证明净收益的实验不启用为生产默认优化。
- 更新原生运行说明和元件建模规范,补充信号边界、输出语义、接触事件和实验依赖回归测试。

验证:五组专项回归共 34 项全部通过;37 个待提交 Python 文件语法检查通过;git diff --cached --check 通过。
2026-09-17 23:50:13 +08:00

12 KiB
Raw Permalink Blame History

R288 / position16 最小 real skip 实验

结论

  1. 完整求解结果逐位一致。 0–10 s 全轨迹,896 个 132×132 Jacobian(15,611,904 个元素)及每个 t/y、states、outputs、事件、最终状态与既有基线一致;没有使用数值容差。
  2. 896/896 次真实 skip;自然 reject/fallback 为 0。 commit 896 次,原目标 native operation 实际执行 0 次,Reference 双路执行 0 次。
  3. 当前 replay 更贵。 7 轮中位数:原 operation 1.143 µs/次,validation + overlay/patch + commit 22.521 µs/次(19.70 倍)。目标完整路径 control 1.186 µs/次,real skip 22.913 µs/次。
  4. 暂不把这一实现直接扩展到 position52。 正确性门槛已满足,净收益门槛未满足。应先降低 metadata 采集、事务复制和解释执行成本;本轮不能据此推断 position52 或其他 interval 的收益。

范围与实现

  • 全部改动仅在独立生成的实验 worker 及 tests/manual;生产路径、默认开关、property cache 语义、原 whole-context guard 未改动。
  • 入口仅为 lp_color == 6 && region == 288 的 case 16,位于原 lp_reuse 失败之后。其他位置继续原执行。
  • baseline position16 用单独命名空间的 kernels 采集必需的有序事件 metadata。其他 operation 使用原 kernels,没有全局访问插桩。
  • guard 来自已验证的 shadow 源码,构建时校验其 SHA-256,并断言 guard 函数保持一致;唯一变量替换是将原事务入口 count 改为当前真实 probe 入口 count。
  • 复制当前 probe 到私有 overlay;按当前 entries 验证 first-match/miss,重定位逻辑 slot,从当前 count 追加。通过后构造地址已转换的有序 write set,再 commit。已有 entries、未写字段和其他 pipe slots 保持原值。
  • Observer、capacity/scratch、memo lifetime/value、消费字段、valid、pipe branch、未知副作用/非有限值等原保护条件保留;失败只回退原 operation。
  • 性能版不执行 Reference、不导出访问日志或 Jacobian、不逐次比较完整 context。保留运行所需 metadata、严格 guard、overlay/patch、计时和累计计数。

正确性证据

检查 结果
Jacobian、t/y 与既有 all-audit 文件逐字节比较 896/896 一致
每个 Jacobian 的 baseline + 27 group evaluator 出口 25,088/25,088 一致
目标 operation 入口 / 出口 896 / 896 一致
返回状态、dy/w、active property entries 有序字段/valid、全部 pipe slots 逐位一致
memo 每次 Jacobian 的表内容、owner 绑定、recording 生命周期 一致
所有 probe 的 memo entries 只读检查 通过
gas memo 内容、kernel 绑定及计数 一致
errno、x87/SSE flags/rounding、warning/observer 一致
count 差异 / slot relocation 的目标 probe 638 / 571
顺序 append 1,658
PT miss → PT miss / 近零流量无查询 829 / 67

Audit 对照来自独立 control 进程真实执行当前 probe的出口,约 1.88 GB 二进制数据。跨进程地址比较采用 owner/function 绑定身份,数值字段保持原始位模式;不把 C padding 当成数值。memo 表逐 Jacobian 比较,后续每个 probe 同时检查整表未变。目标入口、出口与所有 group 的完整 evaluator 出口均参与比较。audit 的 I/O 保留并恢复 errno、x87 和 SSE 环境。

求解器计数 control / real skip
accepted / rejected 10840 / 918
Newton iterations / convergence failures 19371 / 798
nfev / njev / nlu 44467 / 896 / 3106
solverStarts / stateTransitions 4 / 1

额外负例:每 128 个目标 probe 注入一次晚期 nonfinite-output reject,发生在 overlay 已执行有序更新之后。7 次 reject 均完成无污染检查,fallback/native 原执行各 7 次,commit/skip 各 889 次;全轨迹仍与同一 control 和既有基线逐位一致。没有放宽 guard,也未改变容差。

性能方法与原始数据

Windows / MinGW GCC,原构建优化选项(-O3 -ffp-contract=off -fno-fast-math)。完成正确性和回退测试后单独编译性能 worker;control、skip 各预热一次,再交替串行运行 7 组。表中顺序就是实际顺序。每轮 states/outputs/events 指纹和全部指定求解器计数保持一致,skip 每轮均为 896、reject 0、原执行 0。

QPC 粗粒度计时;累计整数 tick,积分过程中不做浮点时间换算。validation 包括语义校验所必需的临时有序更新;overlay/patch 包括当前 context 复制及提交 write set 构造;commit 是真实字段写回。完整 target 路径另计,包含调度、计数和额外计时开销。未减去计时器自身成本,未使用 shadow/audit 时间推断性能。

运行顺序 原执行 µs/次 validation µs/次 overlay/patch µs/次 commit µs/次 fallback ms target 总 ms baseline pos16 总 ms Jacobian s 积分 CPU s 积分 wall s skip/reject
pair-1-control 1.562 0.000 0.000 0.000 0.000 1.439 1.760 2.190858 6.375000 6.564619 0/0
pair-1-skip 0.000 6.172 15.011 0.434 0.000 19.785 19.239 2.007014 5.953125 6.076049 896/0
pair-2-skip 0.000 6.451 14.713 0.435 0.000 19.716 18.944 1.971936 5.921875 5.910387 896/0
pair-2-control 1.170 0.000 0.000 0.000 0.000 1.088 1.533 2.000030 6.046875 6.140446 0/0
pair-3-control 1.143 0.000 0.000 0.000 0.000 1.063 1.540 2.018777 6.015625 6.213678 0/0
pair-3-skip 0.000 6.831 15.331 0.436 0.000 20.563 19.928 2.014426 6.031250 6.120732 896/0
pair-4-skip 0.000 7.101 15.141 0.434 0.000 20.651 19.911 2.035451 6.015625 6.135601 896/0
pair-4-control 1.093 0.000 0.000 0.000 0.000 1.017 1.508 1.933127 5.921875 5.940958 0/0
pair-5-control 1.080 0.000 0.000 0.000 0.000 1.009 1.676 1.935641 5.906250 5.900561 0/0
pair-5-skip 0.000 6.334 15.975 0.451 0.000 20.720 19.466 2.038743 5.984375 6.166865 896/0
pair-6-skip 0.000 6.508 14.442 0.444 0.000 19.496 19.729 2.016491 5.906250 6.033967 896/0
pair-6-control 1.177 0.000 0.000 0.000 0.000 1.093 1.512 2.030009 6.250000 6.418474 0/0
pair-7-control 1.119 0.000 0.000 0.000 0.000 1.039 1.499 1.970795 5.953125 6.030361 0/0
pair-7-skip 0.000 6.166 15.893 0.462 0.000 20.530 19.112 2.008419 6.078125 6.126521 896/0

baseline pos16:control 为原 baseline operation;skip 包含原 baseline operation + 本次 replay 必需 metadata 采集,不能漏算这部分成本。性能各轮没有自然 reject,因此 fallback 总时间为 0;这不代表一次 fallback 的成本为零,本轮未估计该分支的单次性能。

中位数及 min/max

项目 control 中位数 [min, max] real skip 中位数 [min, max]
originalSeconds(s,896 次累计) 0.001024400 [0.000967700, 0.001399500] 0.000000000 [0.000000000, 0.000000000]
validationSeconds(s,896 次累计) 0.000000000 [0.000000000, 0.000000000] 0.005780000 [0.005525000, 0.006362100]
overlayPatchSeconds(s,896 次累计) 0.000000000 [0.000000000, 0.000000000] 0.013566200 [0.012939600, 0.014314000]
commitSeconds(s,896 次累计) 0.000000000 [0.000000000, 0.000000000] 0.000390700 [0.000388500, 0.000414100]
fallbackSeconds(s,896 次累计) 0.000000000 [0.000000000, 0.000000000] 0.000000000 [0.000000000, 0.000000000]
pathSeconds(s,896 次累计) 0.001062600 [0.001009100, 0.001439000] 0.020530400 [0.019496400, 0.020720200]
baselineRecordSeconds(s,896 次累计) 0.001533400 [0.001499200, 0.001760000] 0.019465900 [0.018944100, 0.019927500]
jacobianSeconds(s,896 次累计) 2.000029500 [1.933127300, 2.190857900] 2.014426400 [1.971935900, 2.038742900]
solveCpuSeconds(s,896 次累计) 6.015625000 [5.906250000, 6.375000000] 5.984375000 [5.906250000, 6.078125000]
solveSeconds(s,896 次累计) 6.140445900 [5.900561100, 6.564618800] 6.120731700 [5.910387000, 6.166865500]

配对差值

组 原计算 − replay 三阶段 ms target 完整路径净节省 ms 新增 metadata 采集 ms Jacobian Δ s 积分 CPU Δ s 积分 wall Δ s
1 -17.969 -18.346 17.479 -0.183844 -0.421875 -0.488570
2 -18.304 -18.628 17.411 -0.028094 -0.125000 -0.230059
3 -19.224 -19.501 18.387 -0.004351 0.015625 -0.092946
4 -19.338 -19.633 18.403 0.102324 0.093750 0.194642
5 -19.425 -19.711 17.790 0.103102 0.078125 0.266304
6 -18.114 -18.404 18.217 -0.013517 -0.343750 -0.384508
7 -19.176 -19.492 17.613 0.037623 0.125000 0.096160

净节省为正表示节省,Δ = skip − control。

  • 原计算成本 − replay 三阶段成本:配对中位数 -19.176 ms / 896 次。
  • target 完整路径净节省:配对中位数 -19.492 ms / 896 次;范围 [-19.711, -18.346] ms。
  • 此外 baseline metadata 采集增加:配对中位数 17.790 ms。
  • Jacobian callback 配对 Δ:中位数 -0.004351 s,范围 [-0.183844, 0.103102] s。
  • 积分 wall 配对 Δ:中位数 -0.092946 s,范围 [-0.488570, 0.266304] s。

全局时间受调频、调度和系统负载影响,不能把某轮 Jacobian/积分变快归因于这个 operation。目标路径在全部配对中均更慢,已经足以否定当前实现的局部净收益;本轮不预测整个 local probe 的最终加速比例。

成本解释及下一阶段条件

原 operation 在现有 Jacobian memo 的只读复用环境下已经很便宜;当前严格 replay 仍要初始化/复制 156,816 B 的 overlay(含完整 memo),解释事件并构造 write set。运行所需有效 metadata 为 2,224–23,344 B,Plan 固定预留 90,224 B,patch 预留 16,384 B。这些是当前隔离实现的实际成本,不是机制理论上的下限。

因此,本轮证明了目标路径可以安全真实跳过,但没有证明性能优化成立。下一步应先针对事务存储和 metadata 表达做最小化,再重复同样的正确性与交替性能验收;不因 position16 正确就直接扩大到 position52/整个 R475/全部 reuse interval。

复现与证据位置

运行目录:test/r288-real-skip-20260917/。依赖上一轮生成的 local-probe worker、context-access worker 和 shadow-certified 源码;工具链复用原实验配置,不安装依赖。

.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py prepare --audit
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py prepare --audit --skip
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py run --audit
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py run --audit --skip
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py run --audit --skip --label audit-forced-reject --force 128
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py prepare
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py prepare --skip
.venv-win/Scripts/python.exe tests/manual/real_skip_experiment.py benchmark --pairs 7
.venv-win/Scripts/python.exe tests/manual/analyze_real_skip.py
  • audit-{control,skip}-run/validation.json:正确性、独立执行计数、完整求解器计数及文件指纹。
  • audit-forced-reject/validation.json:真实回退及 rollback 检查。
  • byte-comparison.json:全部 Jacobian/t/y、states、outputs、events 与原始基线的逐字节比较。
  • audit-control-run/audit.bin:所有 group 和目标 operation 的实际执行对照出口。
  • performance.json:14 次按实际顺序记录的原始数据;各轮目录保留独立日志和结果。
  • performance-summary.json:中位数、min/max 和逐对差值。
  • {audit,perf}-{control,skip}/build.json:源文件哈希、guard 一致性和构建记录。