Files
SystemSimulationApp/docs/other/Jacobian确定性复用与UD00验收-2026-09-15.md
T
ljz 1aac220084 优化 Jacobian 确定性复用并补充性能剖析与平台依赖文档
在单次 Jacobian 构建内按完整输入精确复用储气物性、PH 反算、密度和管路求根结果,保持原有求值副作用、差分政策与失败回退。八路模型求解 CPU 中位数减少 19.27%,循环和不循环的完整原始采样均与恢复基线一致。

增加独立的跨平台时间剖析工具,记录互斥阶段耗时、Newton/LU 统计、矩阵复用与内核复用,保存 UD00 两种工况的调查报告和机器可读汇总。

补充 Windows/Linux 运行、测试、原生编译和剖析所需依赖文档及索引,不修改依赖清单、版本锁或安装环境。

验证:8 项新增专项回归通过;2270 次完整 Jacobian 核对零差异;16 次剖析配对及预热运行保持完整数值一致。既有固定样本哈希失败和 Linux 实机验收限制见报告。
2026-09-16 13:39:53 +08:00

8.3 KiB
Raw Blame History

Jacobian 确定性复用与 UD00 验收

日期:2026-09-15。

结论与版本

已将方向一的工作区改动(含未跟踪源文件)保存到 Git stash,再从干净基线独立实施方向二。方向二在当前八路模型上将求解 CPU 时间减少 19.27%,完整原生工作进程耗时减少 17.56%。循环和不循环的完整原始采样均与基线逐字节一致。

  • 方向一备份:stash@{0},固定对象 06b161c309644bb01aa402ff79f34749ff8e889a。
  • 备份名称:codex-direction-one-purpose-evaluation-before-jacobian-2026-09-15。
  • 恢复后的基线:2b07d996cff295d9f401dd32edd10472238bdf2d,分支 system-optimization。
  • 本轮修改保留在工作区,尚未提交;未重新应用方向一。原有忽略目录中的验收数据仍保留。
  • 所有“优化前”均指上述恢复基线。交付核对确认两种优化后构建的 36 个源文件哈希、输入哈希及重新生成的 model.c / model.h 与实测冻结版本一致。

实施范围与通用性

在一次 Jacobian 构建中记录未扰动基准的确定性结果。分组扰动后,完整输入的浮点位全部一致才复用;输入变化时调用原始计算。每次 Jacobian 请求重新清空工作区。

覆盖储气物性、压力—焓温度反算、密度,以及管路标量求根。保留原有物性缓存的查询/填充顺序、温度观察、数值有效性检查和失败行为。普通 RHS、接受步检查、输出计算继续使用原路径,原有着色、差分步长和 Dense LU 不变。

复用依据实际物理输入与完整介质参数,不依赖模型实例名称、支路数或固定拓扑。使用已有内核的新模型自动接入,无需增加注册参数或维护另一套方程;新增底层内核需要审查完整输入和副作用后才能加入复用。

工作区使用堆内存。标量缓存为 1024 槽、每次至多探测 32 槽;内存不足、表满或未命中时执行原计算。分组计算失败时沿用原有未缓存逐列差分恢复。独立矩阵核对发现差异时采用参考矩阵并关闭后续着色/复用。

本轮未引入解析 Jacobian 或自动微分。现有切换、限位及隐式求根需要先明确导数政策,再评估这些方法。实现细节见 技术说明。

正式性能对比

环境为同一台 Windows 11 机器、CVODE 7.4 BDF。输入 tests/data/test-mql-8-corrected.json,132 个状态、1784 个输出,两个 UD00 均不循环。仿真 0–10 s,采样间隔 0.01 s,rtol 为 1e-8,保持原有 atol 和求解设置。

编译及重型测试结束后,每个版本预热一次,排除预热,交替串行测量三次,报告中位数。完整工作进程计时包含原始数据写盘、输出回放和 JSON 写出,排除编译、API 及浏览器。带矩阵核对的运行不参与计时统计。

指标 优化前 优化后 耗时减少
求解 CPU 7.296875 s 5.890625 s 19.27%
求解实际耗时 7.242260 s 5.876553 s 18.86%
完整原生工作进程 7.852573 s 6.473363 s 17.56%

六次正式运行的完整状态文件、输出文件、最终值、物性告警及原有求解计数全部相同:1002 个采样,nfev 44467,接受步 10840,拒绝步 918,Jacobian 896,LU 3106,状态转换 1,求解器启动 4。nfev 保持不变;收益来自每次求值内部减少了昂贵计算。

该工况的 Jacobian 优化路径计数如下,范围仅为基准/分组探针,不代表整个求解器的计算量:

内核 实际计算 复用
储气物性 150568 1254360
压力—焓温度反算 85283 601820
密度 440295 2479392
管路求根 196345 884176

原生可执行文件由 400314 字节增至 411613 字节。构建缓存状态未配平,不据此报告冷编译性能变化。以上性能收益限于当前机器及工况,不推断所有模型的加速比例。

UD00 循环与不循环

按实际项目 JSON 修改两个 UD00 的 iscyclic,通过正常生成器分别构建。每个版本、每种工况运行一次 0–21.7 s,覆盖 10.8 s 和 21.6 s 的周期边界。

两个 UD00 的配置 采样数 优化前 CPU 优化后 CPU 全部原始数据及原有计数
均不循环 2172 8.093750 s 6.453125 s 完全一致
均循环 2175 10.796875 s 8.750000 s 完全一致

这些时间是单次工况观察,正式性能结论使用上一节的三次中位数。

  • 不循环:nfev 50092,接受步 11006,拒绝步 884,Jacobian 1073,LU 3287,状态转换 1,求解器启动 5。
  • 循环:nfev 66495,接受步 15731,拒绝步 1334,Jacobian 1374,LU 4700,状态转换 4,求解器启动 10。
  • 完整比较包含所有状态和输出采样、最终状态/输出、完整物性告警和上述计数;并非只比较曲线外观或最终值。本轮没有改变 UD00 信号语义。

独立 Jacobian 验证

--verify-jacobian 使用未缓存的 canonical 逐列差分,核对矩阵每个元素。

工况 核对矩阵数 不匹配数 与对应普通运行的数值结果
不循环,0–10 s 896 0 完全一致
循环,0–21.7 s 1374 0 完全一致

共 2270 次矩阵核对,零差异。核对运行的 nfev 增量分别严格等于 896 × 132 与 1374 × 132;原步数、事件、完整采样及复用计数不变。这避免把重复调用缓存路径误当作独立验证。

回归与验收限制

新增内核/生成器测试覆盖精确输入键、各介质参数的 1 ULP 变化、正负零、失败、冲突、容量耗尽、记录关闭、观察与缓存副作用、反向管流和活动容积。测试理想气体和氦气、热状态和多变储气;全模型 RHS/输出在所有状态逐项扰动及非有限输入下与原路径逐位对照。

新增运行时测试使用 SUNDIALS 公共类型编译生产 cvode_solver.c,覆盖基准重置、原始差分步长、无可选工作区、分组失败恢复、取消、故意破坏复用结果后由独立核对捕获并停用优化。

相关回归包括物性、管路、生成器、依赖排序、守恒、告警、分块存储、摩擦及 Jacobian。unittest 汇总为 Ran 52 tests,FAILED (errors=1, skipped=1),已实际执行的用例通过,但不能称全量验收通过:

  1. NativeJacobianProbeTests.setUpClass:旧固定状态样本的输入 SHA 与当前物理输入不符。当前输入为 60ed16c71b72be4ae71ca7980f4f8cdcdf6b4c4c4c8950863c2390960b71ced4,样本要求 670977bef67e62d9c66e8af497bada208bd72a7301be45128d185d47282cf288。这是基线已有问题,输入及样本均未在本轮修改,也未更新样本以绕过保护;已排除换行差异。
  2. NativeJacobianRuntimeTests:旧测试使用 Linux SUNDIALS 7.4 私有 ABI/静态库,在 Windows 跳过。新增公共类型运行时测试在 Windows 通过,但不替代真实 Linux 验收。

当前没有可用的 Linux 容器或 WSL 运行环境,未完成 Linux 编译/运行验收;本轮也未重新执行完整 Amesim 对照或浏览器端全流程。数值一致结论限定为同平台恢复基线与方向二的前后比较。

复现与证据

  • 比较工具:benchmark_native_jacobian_reuse.py。prepare 冻结对应源码构建,run 保存单次测量及原始数据,report 断言全部对比项。
  • 本地证据目录:test/jacobian-reuse-20260915/(项目忽略的验收数据目录,不随源码提交)。
  • comparison.json:六次正式测量、两种 UD00 工况、矩阵验证和数值一致性断言。
  • before/、after/、before-cyclic/、after-cyclic/:冻结构建、输入/源文件哈希与构建清单。
  • 各运行子目录:states.bin、outputs.bin、result.json、measurement.json、日志。
  • regression.log:相关回归完整输出;delivery-verification.json:交付源文件与实测生成文件的一致性核对。
构建 buildKey
基线,不循环 80cf19d21e41cb5662f934232c7a2c5302eb7fc5b91f82da3cb23f14e3f9b885
方向二,不循环 7fe268c97557c3e1c5a511ea5e28cf0f0479a087031abe1a38d7007dde3c4ca0
基线,循环 a74d52ffe2daef7ccba5030dec75209f96d39f1bc7b47436ba5351fab08a3a92
方向二,循环 a50f302b77a49d1aa28a4ee305239a36e8c9281ecdc93756b729183b8f1e0a0a