优化 Jacobian 确定性复用并补充性能剖析与平台依赖文档
在单次 Jacobian 构建内按完整输入精确复用储气物性、PH 反算、密度和管路求根结果,保持原有求值副作用、差分政策与失败回退。八路模型求解 CPU 中位数减少 19.27%,循环和不循环的完整原始采样均与恢复基线一致。 增加独立的跨平台时间剖析工具,记录互斥阶段耗时、Newton/LU 统计、矩阵复用与内核复用,保存 UD00 两种工况的调查报告和机器可读汇总。 补充 Windows/Linux 运行、测试、原生编译和剖析所需依赖文档及索引,不修改依赖清单、版本锁或安装环境。 验证:8 项新增专项回归通过;2270 次完整 Jacobian 核对零差异;16 次剖析配对及预热运行保持完整数值一致。既有固定样本哈希失败和 Linux 实机验收限制见报告。
This commit is contained in:
1 parent
2b07d996cf
commit
1aac220084
26 files changed
+2293
-13
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# 现行规范索引
|
||||
|
||||
索引版本:1.1.2;整理/复核日期:2026-09-13。
|
||||
索引版本:1.1.3;索引更新日期:2026-09-16。
|
||||
|
||||
新增组件从[注册流程](component-registration-workflow-v1.md)开始,再按涉及的能力读取专项规范。[注册示例](component-registration-example-v1.md)包含实际失败阶段、修订对照和复现方法。本目录保存现行版本,修订时更新正文版本、日期及变更说明;历史实现报告仍在 `docs/other/`,不覆盖其历史结论。
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
| --- | --- | --- |
|
||||
| [System XML v3](system-xml-v3.md) | 1.1.1 / 2026-09-13 | 纠正求解方法的 XSD 描述;说明示例可执行边界、参数输入及连接检查层次 |
|
||||
| [优化基准模型](optimization-benchmark-model.md) | 1.1.0 / 2026-09-12 | 计时口径、当前/历史输入隔离、按需 XML 与可执行测试入口 |
|
||||
| [平台依赖说明](platform-dependencies.md) | 1.0.0 / 2026-09-16 | Windows/Linux 的运行、测试、原生编译和时间剖析依赖 |
|
||||
| [Jacobian 确定性复用](native-jacobian-reuse.md) | 2026-09-15 | 单次矩阵构建中的输入键、复用边界与回退 |
|
||||
| [求解器时间剖析](native-solver-profiling.md) | 2026-09-16 | 互斥耗时、求解计数、独立诊断副本及复现入口 |
|
||||
|
||||
以上版本仅表示文档,XML Schema 和用户指定的八路基准未改变。
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# C 求值的依赖排序与局部求解
|
||||
|
||||
2026-09-15:Jacobian 的分组探针现可在一次构建内复用完整输入未改变的确定性内核结果。
|
||||
普通求值、依赖排序和原有有限性检查保持原规则,详见 [Jacobian 构建内复用](native-jacobian-reuse.md)。
|
||||
|
||||
文档版本:1.1.1
|
||||
修订日期:2026-09-12
|
||||
核对代码基线:`22579e5`;本次版本号仅标注文档,不改变模型版本或协议版本。
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
# Jacobian 构建内的确定性结果复用
|
||||
|
||||
日期:2026-09-15。
|
||||
|
||||
## 目的与边界
|
||||
|
||||
一次 Jacobian 构建会反复计算基准状态和分组扰动状态。多数扰动只影响局部输入;其余部分的昂贵计算可以复用。当前实现保留原有结构着色、差分增量、canonical 基准、矩阵装配及 Dense LU,只复用经过审查的确定性内核结果。
|
||||
|
||||
普通 RHS、接受步物性检查、摩擦事件及采样输出继续使用完整求值路径。本功能不依赖“按用途裁剪”实现,不删除任何原有输出或导数的有限性检查。
|
||||
|
||||
## 生命周期
|
||||
|
||||
1. 生成器为有分组收益且使用相关内核的模型生成 `ModelJacobianWorkspace` 和 `model_eval_jacobian_reuse`。
|
||||
2. CVODE 每次请求 Jacobian 时,`model_jacobian_begin` 清空工作区。
|
||||
3. 同一条 canonical 路径重算基准。此时记录确定性结果;该次求值完成后关闭记录。
|
||||
4. 分组扰动查询基准结果。输入原始浮点位完全一致才复用;改变的输入重新计算,不覆盖基准条目。
|
||||
5. 下次 Jacobian 请求重新开始。事件、后续 Newton 迭代和其他仿真运行不会沿用旧基准。
|
||||
|
||||
工作区在 C 工作进程内部通过堆内存分配,随运行释放。分配失败时继续采用未缓存的 canonical 着色差分,不把可选优化变成求解失败。
|
||||
|
||||
## 可复用的计算
|
||||
|
||||
| 计算 | 完整输入键 | 复用内容 | 保留的原有行为 |
|
||||
|---|---|---|---|
|
||||
| 储气物性 | 内核函数、质量、热状态、实际容积、全部介质参数 | `NativeGas` 全部字段 | 仅用于 property cache 为 NULL 的 canonical 内核 |
|
||||
| 压力—焓温度反算 | 压力、焓、全部介质参数 | 温度 | 先查询当前求值的 PH 缓存;仍执行温度观察及本次缓存填充 |
|
||||
| 密度 | 压力、温度、全部介质参数 | 密度 | 仍进行物性观察、字段有效性判断和本次字段填充 |
|
||||
| 管路标量求根 | K、相对粗糙度、流量换算系数 | 原方程的收敛根 | 方程、容差、流向和失败判定不变 |
|
||||
|
||||
键使用完整浮点位,区分正负零。介质使用参数值而非对象地址。所有数值均来自原始公式或原始求根器,不使用量化、近似相等、邻近状态插值或结果钳制来提高命中率。
|
||||
|
||||
这也是运行时对“是否受扰动影响”的判定:机械位置引起的容积变化、耦合储气状态投影以及流向变化,都先计算实际物理输入,再查询完整键。复用不依赖实例名称、支路编号、固定流向或预设拓扑。
|
||||
|
||||
## 为什么不能直接共享原有物性缓存
|
||||
|
||||
原有 `NativePropertyCache` 的 PT/PH 条目和填充顺序会影响浮点舍入选择。直接跨扰动共享整个缓存,可能改变同一函数的实际数值路径,差分又会放大这类差异。
|
||||
|
||||
新机制仅在原路径本来需要执行纯函数时替代该函数的返回值。本次求值自己的缓存、观察、条件分支和错误检查仍按原顺序执行。例如 PH 已在当前求值缓存中命中时,直接使用原来那条命中路径;不会用跨扰动记忆覆盖它。
|
||||
|
||||
## 容量与恢复
|
||||
|
||||
- 储气条目按生成的物性调用分配,每个调用保留一份基准;非基准输入不驱逐它。
|
||||
- 标量缓存固定为 1024 个槽。冲突时比较完整键,不把哈希相同视为输入相同。
|
||||
- 每次查找至多探测 32 个槽,避免大型模型或表满时扫描整张表。放不下或找不到时执行原计算。
|
||||
- 只记录成功的储气结果和有限标量结果。非有限标量不进入缓存。
|
||||
- 分组扰动失败后使用未缓存的完整逐列差分。取消或超时不会触发额外重试。
|
||||
- `--verify-jacobian` 使用未缓存的 canonical 完整差分核对每个矩阵元素。发现差异后使用参考矩阵,并为后续请求关闭着色/复用路径。
|
||||
|
||||
## 新模型接入
|
||||
|
||||
使用已有储气和气动计算函数的模型自动参与复用,不需要新增用户参数或维护第二份方程。结构分析不能证明分组安全时,原有差分回退继续生效。
|
||||
|
||||
新增底层函数默认按原方法执行。要让它参与复用,需要一次性说明完整输入、确定性、输出和副作用边界;新增介质参数也必须纳入完整键。不能仅凭函数名称或某个算例中数值未变就判为可复用。
|
||||
|
||||
## 解析 Jacobian 与自动微分的评估
|
||||
|
||||
本轮先实现可与原差分逐位对照的复用。当前物理内核包含限位/摩擦切换、`fmax/fmin` 分支、PH 反算和带区间保护的管流求根。若进一步使用解析或自动微分,需要明确切换点的导数政策,并对隐式方程求导;直接对迭代程序逐条求导不等于取得收敛物理解的导数。这些工作不包含在本轮实现中。
|
||||
|
||||
## 诊断与验证
|
||||
|
||||
构建清单的 `jacobianStructure.reuse` 描述启用条件、容量、范围和核对策略。结果的 `jacobianReuse` 分别记录 gas、ph、density、pipe 的实际计算与复用次数,范围是优化后的基准/分组探针,不包含独立参考差分。
|
||||
|
||||
RHS、Jacobian、步数等原有计数含义不变。复用减少的是一次 RHS 内部的昂贵计算,不应表现为虚减 RHS 次数。
|
||||
|
||||
主要测试:`tests.test_native_jacobian_reuse`、`tests.test_native_jacobian_reuse_runtime`,并结合原有物性、管路、生成器、守恒、事件、告警、存储及 Jacobian 测试。
|
||||
|
||||
前后比较工具:`tests/manual/benchmark_native_jacobian_reuse.py`。正式计时须在编译及重型验证结束后串行执行;带 `--verify-jacobian` 的运行只用于正确性核对。
|
||||
@@ -0,0 +1,72 @@
|
||||
# 原生求解器时间剖析
|
||||
|
||||
诊断入口:`tests/manual/profile_native_solver.py`。它冻结当前正常构建,在 `test/` 下的独立源码副本加入计时,生成分阶段耗时、求解计数、完整数值对照和插桩开销。适用于当前具有自动着色 Jacobian 的 BDF 模型;不支持的模型明确拒绝,不把无法观测的阶段报告为零。
|
||||
|
||||
```powershell
|
||||
.\.venv-win\Scripts\python.exe tests/manual/profile_native_solver.py --run
|
||||
```
|
||||
|
||||
默认使用 `tests/data/test-mql-8-corrected.json`,将所有 UD00 分别设为不循环、循环,仿真至 21.7 s,每个版本预热一次并测量三次。可用 `--input`、`--output`、`--stop`、`--warmups`、`--repeats` 调整。输出目录须是项目 `test/` 下的新目录,以保护既有证据。所有构建先完成,随后串行计时。省略 `--run` 只准备构建。
|
||||
|
||||
已有完整测量可用 `--output test/solver-profile-20260916 --report-only` 重新检查计数和生成汇总,不重新编译或运行仿真。
|
||||
|
||||
## 计时口径
|
||||
|
||||
- 总计时覆盖原生进程内的初始化、积分、采样写盘、输出回放、JSON 编码及资源释放,排除构建、进程启动、API 和浏览器。
|
||||
- 采用单调墙钟:Windows 为 QueryPerformanceCounter,Linux 为 CLOCK_MONOTONIC。阶段耗时不是 CPU 采样百分比,不能与 CPU 秒数直接混用。
|
||||
- 每个作用域记录包含子调用的 `inclusiveSeconds`,以及扣除子调用后的 `exclusiveSeconds`。只有互斥的 exclusive 值可相加。
|
||||
- 三次阶段耗时取算术平均,确保分项之和等于总耗时;完整求解和进程耗时另报中位数。计时/统计开销仍包含在诊断结果中,以正常构建的配对运行估计扰动。
|
||||
- Jacobian 阶段包含基准和分组差分的模型求值;这些求值不重复计入普通 residual 阶段。保留探针、装配及普通 RHS 的子作用域数据。
|
||||
- Dense LU 没有稀疏矩阵的 symbolic factorization,记为不适用。
|
||||
- 当前预编译 SUNDIALS 关闭内部 profiler。误差估计无法独立直接计时,记录为 `null`,包含在 `cvode_controller_including_error_estimation` 中。该组还包括预测、历史更新、步长/阶数控制及其他未观测内部工作,不将其整体冒称为误差估计。
|
||||
- `newton_overhead` 为 Newton solve 扣除 residual、线性 setup、LU 和线性求解后的剩余时间,包括收敛判断、迭代控制及接口开销,不涵盖所有外层 CVODE 控制成本。
|
||||
- 事件计时扣除了接受步物性检查、普通采样和存储;保留事件探测、定位所用插值及模式更新。物性检查独立列出,以免淹没在框架耗时中。
|
||||
|
||||
## 观测接口与数值核对
|
||||
|
||||
使用 SUNDIALS 公共 SUNLinearSolver / SUNNonlinearSolver 操作表包裹原函数。诊断副本显式挂接同一库的 `SUNNonlinSol_Newton`,保持库的 Newton 实现及默认策略,便于计时与观测线性 setup。没有读取 CVODE 私有内存布局。正常构建仍使用原来的隐式默认创建过程。
|
||||
|
||||
每次运行比较正常构建与诊断构建的完整结果 JSON(仅排除原有两个耗时字段),并核对状态/输出二进制文件 SHA。任何数值、警告、事件或原有求解计数变化均中止调查。计数读取在每次 CVodeReInit 之前及最终清理时累计,检查累计段数等于 solver_starts,避免仅报告最后一段。
|
||||
|
||||
工具对单个独立进程内的一次 BDF 求解设计;诊断全局状态不作为并发库接口使用。生产源码、生产可执行文件和模型公式不被插桩脚本改写。
|
||||
|
||||
## 参数定义
|
||||
|
||||
| 参数 | 定义 |
|
||||
|---|---|
|
||||
| `accepted_steps` | 累加 CVodeGetNumSteps,CVODE 成功内部步数 |
|
||||
| `application_accepted_steps` | 原应用接受步数,可能受同时间返回处理影响,另行保留 |
|
||||
| `same_time_returns` | CVODE 成功返回但返回时间与上一次相同的次数;此时应用保留求解器历史并继续推进 |
|
||||
| `error_test_failures` | 局部误差检验失败次数,对应原 `rejectedSteps` |
|
||||
| `nonlinear_step_failures` | 因非线性求解失败而拒绝的步尝试 |
|
||||
| `rejected_steps` | 上述两类步失败之和,不等同于原 `rejectedSteps` |
|
||||
| `residual_evaluations` | CVODE 普通 RHS 次数,包含初值/步长准备;排除 Jacobian 差分探针和事件求值 |
|
||||
| `nonlinear_residual_calls` | 实际 Newton 非线性 residual 回调次数,其代数部分的时间也计入 residual 阶段 |
|
||||
| `jacobian_probe_evaluations` | 自定义 Jacobian 基准/扰动 RHS 次数 |
|
||||
| `linear_rhs_evaluations` | CVODE 内置线性差分 RHS 次数,与自定义探针分别记录 |
|
||||
| `jacobian_evaluations` | Jacobian 矩阵刷新次数 |
|
||||
| `jacobian_reuses` | 成功的线性 setup 中,没有新增 Jacobian 计算、沿用已有 J 的次数;直接比较该次 setup 前后的累计刷新计数 |
|
||||
| `jacobian_kernel_reuse` | 新计算一个 J 时,对 gas/PH/density/pipe 确定性结果的计算/复用次数;与矩阵复用不同 |
|
||||
| `linear_setups` | CVODE 线性求解器 setup 调用次数,对应原 `nlu` 的实际口径 |
|
||||
| `LU_factorizations` | 原 Dense setup 的实际调用次数,失败次数另记 |
|
||||
| `LU_solves` | 原 Dense solve 的实际调用次数,失败次数另记;不使用直接法恒为零的 Krylov 迭代数代替 |
|
||||
| `newton_iterations` | 累加 CVodeGetNumNonlinSolvIters |
|
||||
| `newton_failures` | 累加 CVodeGetNumNonlinSolvConvFails;一次步尝试内可能刷新 J 重试,不等于拒绝步数 |
|
||||
| `newton_solve_calls` | Newton solve 入口次数,与 Newton 迭代数分别记录 |
|
||||
| `event_count` | 原状态转换计数,同一时刻多个转换可合为一次;不是被发现的每个零点数量 |
|
||||
| `scheduled_boundary_count` | UD00 等预定时间边界导致的额外重启次数,独立于状态转换事件 |
|
||||
| `event_detection_calls` | 接受步事件检查入口次数 |
|
||||
| `all_counted_model_evaluations` | 原 nfev,含普通 RHS、自定义 Jacobian 探针与摩擦事件求值;不含全部诊断/输出回放求值 |
|
||||
| `accepted_property_checks` | 接受步及初始化物性检查入口次数 |
|
||||
|
||||
计数含义参考 [SUNDIALS 7.4 CVODE 可选输出接口](https://sundials.readthedocs.io/en/v7.4.0/cvode/Usage/index.html#optional-output-functions)。实际统计以本项目的调用边界和上述分项定义为准。
|
||||
|
||||
## 输出
|
||||
|
||||
- `prepared.json`:平台、编译器、模型参数、冻结构建哈希、原始/插桩源码哈希。
|
||||
- `noncyclic/`、`cyclic/`:正常构建、诊断构建及各次运行的完整结果。
|
||||
- 每次诊断的 `profile.json`:原始作用域次数、inclusive/exclusive 耗时和累计计数。
|
||||
- `measurement.json`、`measurements.json`:计时、原始数据哈希及数值一致性检查结果。
|
||||
- `summary.json`:互斥耗时分解、计数、分项平均值、总耗时中位数及观测扰动。
|
||||
|
||||
计时器及锚点保护测试:`python -m unittest tests.test_solver_profile -v`。Windows 与 Linux 使用同一源码;实际平台验收情况应以具体调查报告为准。
|
||||
@@ -0,0 +1,117 @@
|
||||
# Windows / Linux 依赖说明
|
||||
|
||||
文档版本:1.0.0;更新日期:2026-09-16。
|
||||
|
||||
适用范围:当前原生求解器、Jacobian 确定性复用及时间剖析工具。本次更新依赖文档,不安装环境或升级版本。依赖声明和锁文件仍以仓库既有文件为准。
|
||||
|
||||
## 依赖分层
|
||||
|
||||
| 用途 | Windows x64 | Linux x86_64 | 声明或入口 |
|
||||
|---|---|---|---|
|
||||
| 后端编排 | CPython 3.12,项目环境通常为 `.venv-win` | CPython 3.12,项目环境通常为 `.venv` | [.python-version](../../.python-version) |
|
||||
| 后端运行包 | FastAPI、lxml、Pydantic 2、Uvicorn standard | 同左,包含平台相应的传递依赖 | [requirements.txt](../../requirements.txt) |
|
||||
| 前端开发/构建 | Node.js 20.19+ 或 22.12+、npm | 同左 | [package.json](../../frontend/package.json)、[package-lock.json](../../frontend/package-lock.json) |
|
||||
| 模型原生编译 | GCC/MinGW,支持 C11 和当前 GCC 编译参数 | GCC、标准 C 开发环境 | [原生构建器](../../app/simulation/native_codegen/build.py) |
|
||||
| BDF 及共用原生程序 | SUNDIALS 7.4.0 开发头文件、导入库和 DLL | SUNDIALS 7.4.0 开发头文件及静态库 | [原生后端说明](../../native/README.md) |
|
||||
| 后端数值回归 | 上述工具链,加 NumPy | 同左 | [requirements-test.txt](../../requirements-test.txt),NumPy 范围 `>=1.26,<3` |
|
||||
| 求解器时间剖析 | 上述原生工具链与 Python 标准库 | 同左 | [profile_native_solver.py](../../tests/manual/profile_native_solver.py) |
|
||||
| 浏览器回归 | 前端开发依赖中的 Playwright,以及对应浏览器 | 同左;另需浏览器要求的系统运行库 | 前端 `npm ci` 与 Playwright 浏览器安装 |
|
||||
|
||||
NumPy 属于测试依赖,不是后端运行依赖。当前原生数值计算不依赖 SciPy;本轮 Jacobian 优化没有引入自动微分库。时间剖析也不需要额外的 Python profiler 包、Linux perf 或开启 SUNDIALS 内部 profiler。
|
||||
|
||||
## Python 版本与平台安装口径
|
||||
|
||||
跨平台直接依赖参考版本为 FastAPI 0.141.1、lxml 6.1.1、Pydantic 2.13.4、Uvicorn 0.52.3,来源为 [python312-direct.txt](../../constraints/python312-direct.txt)。`.python-version` 记录参考补丁版本 3.12.3。支持范围、参考版本和实际安装环境是不同概念;历史性能结果对应当时的实际环境,不能由文档更新推断环境已升级。
|
||||
|
||||
### Windows
|
||||
|
||||
在已有 Python 3.12 环境中,运行包使用范围文件配合直接依赖约束:
|
||||
|
||||
```powershell
|
||||
.\.venv-win\Scripts\python.exe -m pip install -r requirements.txt -c constraints/python312-direct.txt
|
||||
.\.venv-win\Scripts\python.exe -m pip check
|
||||
```
|
||||
|
||||
运行后端测试时改用:
|
||||
|
||||
```powershell
|
||||
.\.venv-win\Scripts\python.exe -m pip install -r requirements-test.txt -c constraints/python312-direct.txt
|
||||
```
|
||||
|
||||
Windows 目前没有完整的传递依赖 wheel 哈希锁。直接依赖约束不等于完整锁,不能拿 Linux wheel 锁安装到 Windows。
|
||||
|
||||
### Linux
|
||||
|
||||
发布和参考 CI 的运行依赖使用现有完整锁:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m pip install -r constraints/python312-linux-x86_64.lock
|
||||
.venv/bin/python -m pip check
|
||||
```
|
||||
|
||||
此锁适用于 CPython 3.12、兼容 manylinux_2_28 的 Linux x86_64,锁定传递依赖和 wheel SHA-256。必须作为 `-r` 输入;它启用 binary-only 和哈希校验。
|
||||
|
||||
测试依赖在运行环境安装完成后单独安装:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m pip install -r requirements-test.txt -c constraints/python312-direct.txt
|
||||
.venv/bin/python -m pip check
|
||||
```
|
||||
|
||||
`requirements-test.txt` 中 NumPy 仅规定范围,不是完整测试环境锁。正式跨版本性能比较还应记录实际 Python/NumPy/工具链版本,不能声称这一步实现了全部测试依赖的精确锁定。
|
||||
|
||||
## Windows 原生依赖
|
||||
|
||||
构建器接受 GCC 风格参数,当前不提供 MSVC 构建入口。本机已用 GCC 8.1 验证;这只是实测版本,不是对所有较早/较新 GCC 版本的兼容承诺。现有 Windows CI 使用 conda-forge 的 `sundials=7.4.0` 和 `m2w64-gcc`。
|
||||
|
||||
`SUNDIALS_ROOT` 指向包含 `include`、`lib`、`bin` 的开发文件根目录。需要以下五个库:
|
||||
|
||||
| 模块 | Windows 导入库 | 随程序部署的 DLL |
|
||||
|---|---|---|
|
||||
| CVODE | `lib/sundials_cvode.lib` | `bin/sundials_cvode.dll` |
|
||||
| Core | `lib/sundials_core.lib` | `bin/sundials_core.dll` |
|
||||
| Serial NVector | `lib/sundials_nvecserial.lib` | `bin/sundials_nvecserial.dll` |
|
||||
| Dense Matrix | `lib/sundials_sunmatrixdense.lib` | `bin/sundials_sunmatrixdense.dll` |
|
||||
| Dense Linear Solver | `lib/sundials_sunlinsoldense.lib` | `bin/sundials_sunlinsoldense.dll` |
|
||||
|
||||
还需保留发行包依赖的运行库,例如 `vcruntime140.dll`。构建器会把找到的上述 DLL 及该运行库复制到模型程序旁边。单独安装同名 Python 包不能提供这些 C 开发文件。
|
||||
|
||||
发现规则:`SIMULATION_NATIVE_CC` 覆盖编译器,否则从 PATH 查找 `gcc`;`SUNDIALS_ROOT` 覆盖库根目录,否则从当前 Python 基础环境的 `Library` 查找。若 Python 与 SUNDIALS 安装在不同环境,需要显式设置覆盖变量;文档不要求固定盘符或机器路径。
|
||||
|
||||
## Linux 原生依赖
|
||||
|
||||
执行 [setup-native-linux.sh](../../bat/setup-native-linux.sh) 前,系统应已提供:
|
||||
|
||||
- Bash、GCC 和标准 C 头文件/链接工具。
|
||||
- CMake 及所选生成器对应的构建工具,默认通常为 GNU Make。
|
||||
- curl、tar/gzip、sha256sum,以及 HTTPS 下载所需的系统 CA 证书。
|
||||
|
||||
脚本下载并校验固定的 SUNDIALS 7.4.0 源码,构建 Release 静态库,默认安装到项目 `.venv/native/sundials-7.4.0`。脚本本身不安装系统软件包。
|
||||
|
||||
```bash
|
||||
bash bat/setup-native-linux.sh
|
||||
```
|
||||
|
||||
需要 `libsundials_cvode.a`、`libsundials_core.a`、`libsundials_nvecserial.a`、`libsundials_sunmatrixdense.a`、`libsundials_sunlinsoldense.a`。构建器在依赖根目录的 `lib`、`lib64`、`lib/x86_64-linux-gnu` 下探测这组静态库。
|
||||
|
||||
如果设置 `SYSTEM_SIMULATION_NATIVE_ENV` 改变安装位置,应相应将 `SUNDIALS_ROOT` 指向该位置下的 `sundials-7.4.0`。默认情况下构建器先查当前 Python 环境的 `native/sundials-7.4.0`,再查 `/usr/local` 和 `/usr`。Linux 的 `start-all.sh` 另外要求 Bash 4.3+。
|
||||
|
||||
## 本轮新增功能的依赖边界
|
||||
|
||||
- Jacobian 复用使用现有 C11 标准库和上述五个 SUNDIALS 库,没有新增链接库。
|
||||
- 时间剖析使用 SUNDIALS 7.4 公共接口,包括 Newton 操作表、非线性失败计数与步失败计数;需保留完整开发头文件。
|
||||
- 诊断副本使用 GCC 的 cleanup 属性,Windows/Linux 都沿用项目 GCC 工具链。Windows 使用 QueryPerformanceCounter,Linux 使用 CLOCK_MONOTONIC。
|
||||
- 当前 SUNDIALS 内部 profiler 关闭时,误差估计没有独立计时;报告按不可分离的内部控制组记录,不要求重新构建 SUNDIALS 来制造该阶段的独立数字。
|
||||
|
||||
在已有环境中核对本轮新增功能:
|
||||
|
||||
```text
|
||||
python -m unittest tests.test_native_jacobian_reuse tests.test_native_jacobian_reuse_runtime tests.test_solver_profile -v
|
||||
python tests/manual/profile_native_solver.py --output test/my-solver-profile --run
|
||||
```
|
||||
|
||||
`python` 替换为对应平台的项目环境解释器。第二条命令会编译独立诊断副本并运行两种 UD00 工况,不安装依赖。详细计数与计时口径见 [时间剖析说明](native-solver-profiling.md)。
|
||||
|
||||
## 实际验证状态
|
||||
|
||||
本轮 Jacobian 优化与时间剖析已在 Windows 的现有环境实测,包含 UD00 循环/不循环以及完整数值保持核对;Linux 有对应构建、计时和测试路径,尚未完成本轮真实 Linux 运行验收。依赖文档覆盖两平台,不代表两平台验收均已完成。
|
||||
Reference in new issue
Block a user