Files
SystemSimulationApp/tests/manual/fallback_profitability_report.md
T
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

21 KiB
Raw Blame History

Context fallback:盈利条件与下一步决策

日期:2026-09-17。范围:既有八路模型 0–10 s、896 个 Jacobian 的历史诊断数据。本轮只做数据归并和预算分析,没有构建新 worker、修改求解器、扩展 semantic replay 或重跑性能实验。

结论

停止按单个 operation 推进 semantic replay。下一次只值得先测 position379 / PNVO001_1 中 state_valve 数值尾部的 kernel memo。 原 context 查询、物性写入、valid 演变和 native 调用仍照常发生;这与跳过整个 operation 是不同实验。

  • 当前 343 个 fallback operation 的跨组单次均值最高只有 1.315 µs;即使拆到 5,157 个 (group, position) 组合,最高均值也只有 1.642 µs。没有一个能承担当前 7.109 µs 的单 operation replay 开销,尚未计 baseline。
  • 较贵 interval 是多个廉价 operation 的集合。不能把整个 interval 的预算发给其中每个 operation。
  • whole-context guard 成功的 20,608 次继续使用原机制;失败的 139,776 次不能直接恢复 baseline 全 context,其真实出口均与 baseline context 不同。
  • 不继续优化 R288,不启动 position52、R475 或其他区间的 semantic replay 实现。R490 等长区间只保留为预算上的备选,尚不具备立即实验的收益与语义证据。

1. 数据覆盖与计时口径

数据层 覆盖 / 结果 本报告用途
全量 census 115 个失败 interval;156 个 group/interval;343 个 position;5,157 个 group/position 次数、归属和摊销上限
fallback 原计算 139,776 次 interval;4,620,672 次 operation 执行 去重后的成本分母
分层 profiling,扣空标记估计 全轨迹 context fallback 613.201 ms 总量交叉检查
interval 独立计时 682.630 ms 原区间预算;含区间调度及诊断 hook,不含失败前的 guard
operation 独立计时 660.431 ms 分离 native 语句与纯代数/alias;operation 预算
function 独立计时 exclusive 合计 879.118 ms 函数排序,不能加到以上时间或视为净收益

interval、operation、function 各三轮;每轮分层抽取 112/896 个 Jacobian,按频率折算全轨迹后取三轮算术平均。这里的“µs/次”是累计折算时间除以全量次数,不是单次延迟分位数。完整表另外保留三轮值和 min/max。

这些是带插桩的预算估计。极短 operation 的计时可能明显高估;函数 exclusive 仅扣除已插桩子调用。不同模式的差值不能直接当作 dispatch 成本,更不能叠加。R288 最新实验的机器负载与旧 profiling 不同,跨批代入只用于成本量级情景,不能预测加速。

可查验的完整交付物

原始依据:fallback 诊断、原始统计、代码及依赖计划、分层 profiling、R288 typed 实验。当前工作区其他改动未作为这份历史测量的重新验收对象。

2. 热点:大区间与廉价 operation 必须分开

累计成本最高的区间及重要对照

“纯代数 ms”来自 operation 模式,只计完全不含 native 调用的语句;不包含 native 内部的代数部分,后者尚无独立测量。

interval / 范围 group 次数 原区间累计 ms 原区间 µs/次 ops / native ops 纯代数 ms
R490 [49,184) 24,25 1,792 33.807 18.865 135 / 15 4.139
R485 [50,181) 22,23 1,792 31.667 17.671 131 / 14 4.072
R480 [51,178) 20,21 1,792 30.269 16.891 127 / 13 3.954
R475 [52,175) 18,19 1,792 27.257 15.211 123 / 12 3.841
R470 [53,172) 16,17 1,792 25.381 14.164 119 / 11 见完整表
R465 [54,169) 14,15 1,792 22.936 12.799 115 / 10 见完整表
R460 [55,166) 12,13 1,792 22.117 12.342 111 / 9 见完整表
R3 [30,48) 0 896 21.393 23.876 18 / 17 0.033
R455 [56,161) 10,11 1,792 20.735 11.571 105 / 8 见完整表
R457 [297,444) 10,11 1,792 15.880 8.862 147 / 4 5.653
R49 [373,444) 0 896 15.782 17.614 71 / 4 1.814
R288 [16,17) 6 896 0.918 1.024 1 / 1 0

R490–R455 前半区域主要是 native_pipe_flow_cached_context,包含 PH context 获取和 state_valve 等链路;R457/R49 的四个 native 是 native_medium_orifice_context。R3 的 17 个 native 集中在管路/节流流量,因而短区间也可能更贵。

R49 暂不作首选:区间模式是 17.614 µs/次,operation 模式总和却只有 7.283 µs/次。三轮区间值都偏高,说明不是简单挑掉一轮就能解决;尚未分离具体原因。不能把两者差额承诺为可消除的调度成本。R3 也存在 23.876 vs 20.471 µs 的模式差异,预算应同时参考两种口径。

group 0–9 合计 361.823 ms,group 10–25 合计 320.807 ms,group26 为 0。大区间并未占据全部 fallback。

累计最贵的几个 operation

position / 原ID operation 失败执行次数 原计算累计 ms µs/次 每 Jacobian 结构复用上限
379 / 24 PNVO001_1.port_2 19,712 25.926 1.315 22
405 / 28 PNVO001_3.port_2 19,712 24.907 1.264 22
392 / 26 PNVO001_2.port_2 19,712 24.721 1.254 22
80 / 88 PNL00R_4.port_1 19,712 24.410 1.238 22
82 / 90 PNL00R_5.port_1 19,712 23.721 1.203 22
418 / 30 PNVO001_4.port_2 19,712 23.021 1.168 22

重复 22 次让 baseline 有更好的摊销机会,不能让每次 1.315 µs 的计算承担 7 µs 的 probe 成本。同一 position 的 baseline 可以在结构上被这些组引用,但查询分支、消费字段、kernel 参数是否相同,仍须单独验证。现有“显式 operation 输入/输出相同”不是这种证明。

3. Break-even:必须给 baseline 与 probe 共用一个预算

令 C 为每次可省的原计算,P 为 validation + patch + commit + 新增调度等 probe 开销,H 为每个 Jacobian 新增 baseline 捕获成本,m 为这份记录可成功服务的 probe 数。单位均为 µs:

net_per_J = m × (C − P) − H
P < C − H/m
H < m × (C − P)

不能同时把 C 分别全部分配给 H 和 P。表中 H 上限以 P=0 或指定值计算;只有严格低于上限才盈利。暂用全部成功、无新增失败成本的乐观条件。

若仅有 k 次成功、其余尝试付出失败 guard 成本 F:

net_per_J = k × (C_success − P_success) − H − (attempts − k) × F

同一区间跨组最多共享一次 baseline 的结构上限通常是 1 或 2;operation 跨重叠区间可达到 22。不能把同一 group/position 在多个 interval 中重复计价,本分析按 census 的唯一归属去重。若动态 schema 无法共享,m 必须减小;如果要按组捕获 H,则不能继续除以全部组数。

用当前 R288 typed 成本作量级筛选

同批实测中位数:原 operation 1.775 µs,typed 三阶段 7.109 µs,完整路径 7.575 µs,baseline 新增 18.258 µs/J。计入 baseline 的配对净收益为 −20.415 ms/896 次;所有轮次均为负。旧批的 1.143/22.521 µs 不能和最新批混为一组对照。

以下把 H=18.258 仅作为预算情景;P 也必须覆盖新增调度/统计等成本,使用三阶段 7.109 已比完整路径更乐观。

候选 C µs m 上限 Hmax,P=0 Hmax,P=5 Pmax,H=18.258 P≈7.109 的判断
R288,最新同批 native 1.775 1 1.775 −3.225 −16.483 即使H=0也不行;停止
position379,原 operation 1.315 22 28.935 −81.065 0.485 单operation replay不行
R490,整个区间 18.865 2 37.731 27.731 9.736 一次融合replay账面可行;未验证
R485,整个区间 17.671 2 35.342 25.342 8.542 同上
R480,整个区间 16.891 2 33.783 23.783 7.763 余量很小
R475,整个区间 15.211 2 30.421 20.421 6.082 当前量级不行;不扩展
R3,整个区间 23.876 1 23.876 18.876 5.619 需低于约5µs;op口径仅允许2.213µs
R457,整个区间 8.862 2 17.724 7.724 −0.267 baseline本身已超预算

R490 包含 15 个 native operation,若逐个使用 7.109 µs replay,单 probe 仅 replay 就要约 106.636 µs,远超整个区间 18.865 µs。表中可行性只适用于整个区间一次融合处理。不能假设 15 个 operation 的查询、字段保护与副作用能以一个 R288 的成本处理。

若要求每个长区间 P<2/5/10 µs,各自允许的 baseline 成本已在完整表逐项列出;并非只给一个统一的 7 µs 门槛。所有单 operation 的原测量均值都低于 2 µs,甚至 <2 µs 本身也不足以证明它们盈利。

4. 按真正的函数成本选择方法

以下 exclusive 时间来自函数模式,只作排名,不与 operation 模式相加。state_valve exclusive 包括未插桩的数学函数和包装等,不是已经单独测出的纯数值尾部成本。

函数 / 工作 调用数 exclusive ms 平均 exclusive µs 建议
state_valve 495,790 388.070 0.783 E:先测数值尾部;保留所有context访问
property_pt 1,225,458 114.822 0.094 F:若未来优化查找,必须保持有序first-match;不能承担µs级额外guard
local_isentropic 989,704 92.872 0.094 现有valid命中已跳过部分计算;需先分开hit与真实重算,不能整体memo掉observe/valid写入
native_jacobian_scalar_get 1,439,304 62.124 0.043 既有memo查询成本;避免再叠通用查表/完整key解释器
property_density 1,399,544 52.772 0.038 主要是cache/memo路径,保持原机制
native_pipe_flow_context 379,904 50.607 0.133 inclusive约601.523ms包含下游;不能再加到state_valve
native_temperature_ph_context 320,836 43.470 0.135 查询/包装仍发生,实际PH反算为0
native_viscosity 307,709 25.702 0.084 A;单独加memo通常预算太小,尚无盈利证据
native_medium_orifice_context 125,440 17.183 0.137 包装本身廉价,关注其state_valve数学部分
native_pipe_flow_cached_context 379,904 16.638 0.044 保留pipe语义;不要为省wrapper引入replay

native_temperature_ph、native_density、native_pipe_resistance 在这批 fallback 中实际执行次数都为 0。它们的昂贵求解已被 Jacobian memo 覆盖,不能再次把这些计算算成新优化的可省部分。

源码依据:归档 properties.c 中 state_valve 先执行 isentropic 与 property_density,之后才进行 pow/sqrt/log/tanh 等数学计算;orifice.c 的 PNVO 调用链还会获取 PH/PT、更新context并进行有限性返回检查。整个 state_valve 并不是无副作用的纯函数。

A–F 明确决策

类型 适用对象 决策
A 直接原计算 R288/position16;所有当前需要约7µs replay的单operation;廉价lookup/viscosity/alias 停止逐operation semantic replay;默认重算
B 原whole-context restore 现有guard成功的20,608次context复用 保留原guard与restore;不扩大到guard失败路径
C 切分interval 196个完全不含native的连续段;例R457 [297,379) 只考虑批量段和低成本输出恢复;不逐alias加guard
D 局部context replay R490/R485/R480的融合区间是假设候选 仅预算保留;没有全区间读写契约,也无足够实测收益,暂不实施
E 昂贵纯数值kernel memo 首选position379中的state_valve数值尾部 下一次唯一建议实验;先测小于µs的真实成本与key复用
F 更便宜方案 property_pt有序查询、现有memo定位、静态代数段恢复 先证明确有热点且额外成本在几十至数百ns预算内;不作为本次扩展任务

B 的全部成功区间为 R0、R135、R378、R454、R459、R464、R469、R474、R479、R484、R489、R494。只沿用已经满足原 guard 的 group/interval 对,不由区间ID推导新的复用范围。

5. 候选排序:只推荐启动一个

第一名:position379 / PNVO001_1 的 state_valve 数值尾部

  • 当前完整 operation 为 1.315 µs/次,19,712 次,累计 25.926 ms。三轮累计 25.631–26.268 ms。组为 0–5、10–25,共22组。完整 group→interval 映射在JSON中。
  • 主要工作是 native_medium_orifice_context → medium_valve → state_valve。保留 PH/PT、等熵字段计算/valid写入、density读取及所有context副作用,只考虑在这些步骤之后复用数学尾部的 cm/velocity。
  • 为什么优于 R288 replay:不是因为单次 operation 更贵,而是换成只比较少量最终数值输入的 kernel 机制,避免有序条目重放;baseline 在结构上最多可摊到22组,而 R288 的目标只有1组。候选还是累计最贵的单个 operation,且数值尾部边界可明确核对。
  • 可省上界:25.926 ms 是整个 operation 零成本消失的宽松上界;数值尾部只占其中一部分,实际可省必须更小。没有该position的尾部独立计时,不能把全局0.783µs当作它的实测尾部成本,更不能承诺25.926ms收益。
  • 令尾部实测每次成本为 K、memo probe成本为 G、baseline新增为 H,全部22组可命中时必须满足 G + H/22 < K < 1.315 µs。一轮净收益是 19712×(K−G)−896×H µs;命中不足时另扣miss开销。
  • 初始工程目标可设 G≤0.25 µs、H≤1 µs/J,其成本门槛约 0.295 µs/命中;这是待测目标,不是已有实现速度。若尾部K≤该值或实际开销不达标,则停止。若仍沿用18.258µs的baseline新增,则仅H/22就要0.830µs,很可能再次失败。

下一次实验的边界:仍用独立 worker,只选这个 position;先采集数学尾部的实际输入位与成本,确认同一Jacobian跨组key重复比例,再实现可拒绝的最小kernel memo。候选key应依据尾部真实使用的 p/T/pd/g/rho 等值确定,不拿operation显式输入相同代替。必须核对分支、非有限值、errno/浮点状态、memo生命周期;数学库也可能有副作用,不能默认忽略。

数值尾部不再触碰property context有利于验证,但不是免验。要求所有矩阵、求解输出、context/pipe/memo、warning和计数逐位一致;成本版无shadow。测量命中/拒绝、尾部原成本、key检查、命中返回和baseline新增成本,只有完整机制净收益为正才考虑其他position。本轮没有实施这个实验。

第二名(备选,不立即启动):R457 的纯代数连续段

R457/group10,11 整体 8.862µs、15.880ms;主要native仍是4个节流口。真正切分对象为 [297,379) 的82个纯代数operation,平均段成本 1.846µs,1,792次合计 3.308ms。这里不省任何native物理计算,保留全部context操作,可验证性较高。

选择C而非D:每段额外guard/restore加baseline摊销必须 <1.846µs,实际应显著低于1µs以留下余量。由于82个短语句分别计时,3.308ms可能含明显marker成本,先用段级低扰动测量核实;不能把该数字当作可兑现收益。全部代数段都低于2µs,逐条加机制会失败。它比R288 replay更简单,但单点总上界较小,排在kernel之后。

第三名(预算备选,暂不做):R490 的融合局部context机制

R490/group24,25 整体 18.865µs,1,792次 33.807ms;其中15个native语句,主要是pipe flow、state_valve及查询。两个组可结构共享一次baseline,预算明显比R288宽。

若H仍为18.258µs,全部验证、所有patch和commit合计必须低于9.736µs/整个interval;要有可靠余量,目标至少应低于5µs。若P=7.109、100%成功且两组共享记录,账面仅剩约 4.708ms,尚未扣完整路径额外开销。未知读写覆盖、15个native的effects以及guard扩张很容易用完预算,因此不建议现在开始完整semantic实现。

相比之下,先把state_valve里的数学部分分离,能检验是否存在更低成本方法,再决定是否需要复杂的融合局部context。R485/R480也是同类预算备选,不扩展实现。

6. 还剩多少空间:条件上界,不是加速承诺

以完整interval只付一次开销的乐观情景

每行只统计满足预算的interval,并扣除该行假设的P/H;各行是不同情景,不能相加。H每个Jacobian捕获一次并跨所有失败组共享,100%接受,无新增失败开销。跨批typed数字只用作量级参照。

假设每interval的P / baseline H,µs 过预算interval数 涉及原fallback ms 占原区间fallback 情景剩余净空间 ms
2 / 0 72 613.980 89.94% 438.364
5 / 0 35 496.359 72.71% 249.959
7.109 / 0 24 415.138 60.81% 160.350
10 / 0 13 284.669 41.70% 96.509
2 / 18.258 9 235.564 34.51% 57.870
5 / 18.258 6 169.775 24.87% 22.341
7.109 / 18.258 3 95.742 14.03% 8.448
10 / 18.258 0 0 0% 0

因此,“高成本interval占60.81%”只对应零baseline、整个interval固定7.109µs的理想条件。计入当前baseline量级后缩到14.03%,而这14.03%也只是原计算覆盖量,扣成本后仅8.448ms。三个区间在独立operation模式下也过相同账面门槛,但仍未证明融合实现可以达到该成本。

若每个group都要独立捕获,H不能被2组摊薄;在P=7.109/H=18.258情景下,所有interval都不再盈利。当前没有任何一个新interval被证明具有实际semantic replay净收益。

换方法后的空间

  • 单operation semantic replay,维持当前成本量级:可盈利覆盖为0%。 这不是证明所有更便宜的semantic方法都不可能,只是否定当前这条逐operation路径。
  • native语句工作池:577.486ms,占operation模式87.44%。 这是55个pipe/orifice语句全部计算的宽松上界,里面有必须保留的context访问和现有memo开销,不能全部归给kernel优化。
  • 四个PNVO候选position379/392/405/418:98.575ms的整个operation上界。 下一次只测379,其25.926ms上界之外不先承诺扩展。kernel尾部占比和实际命中率尚未测出,所以不能给出“已值得优化的kernel占fallback百分比”。
  • 纯代数/alias:82.944ms,占operation模式12.56%。 分布在196个连续段,最大段均值也只有1.846µs。只能考虑少数长段的廉价批量恢复;全量消除的82.944ms是含短语句插桩的宽松上界。
  • 全部fallback原工作约 0.61–0.68s/轨迹 只是所有相关工作免费消失的极宽上界,不能当成可实现的净节省,也不能由此推算最终solver加速比例。其余Jacobian/积分成本仍然存在。

方向调整:R288负收益证明的是低成本operation不适合当前这种replay机制,不是semantic replay原理不可行。眼下数据并未发现单次昂贵的fallback operation;发现的是大量重复的小计算,以及由它们组成的大interval。下一步应验证低成本的kernel复用能否赚回自己的开销,而不是继续扩大context重放范围。

7. 本轮验证与未确定项

分析脚本重新从三轮原始ticks/frequency/采样数还原interval和operation时间,与原analysis逐项核对;检查全部计数、唯一group/position归属、native分类一致性、代数段和各层汇总守恒。生成的JSON保留输入哈希和检查清单。没有用容差修改仿真结果,也没有新增数值正确性声明。

仍未测量:候选379的数学尾部专属成本与key命中率、长区间融合metadata成本、跨组动态契约共享率、切分后低扰动段成本,以及R49跨模式计时差异的成因。这些缺口决定了目前可以提出可证伪的性能实验,不能宣布新的优化已经盈利。

最终选择:保留whole-context机制和廉价原计算;停止R288 replay;下一次只做position379的state_valve数值尾部kernel memo成本/正确性实验。