大规模并行 GPU ODE 求解器
适用于大量独立常微分方程组的 GPU 加速积分器
模块:
单系统每线程 v3.1
它求解具有不同初始条件和/或参数集的同一 ODE 系统的大量实例。
每块耦合系统 v1.0
它解决具有不同初始条件和/或参数集的耦合系统(由许多子系统组成)的大量实例。
发行说明:
2020 年 8 月 18 日。
单系统每线程 v3.1:
- 支持单精度和双精度。
- 改进/重新设计的手册,例如,针对 Windows 用户的更详细的安装指南。
- 包含批处理文件 make.bat 以简化 Windows 上的编译过程。
- 添加了一个新教程(教程 5)来测试具有非常大时间尺度差异的实例的示例。 MPGOS 的性能曲线与程序包 odeint (C++) 和 DifferentialEquations.jl (Julia) 进行了比较。 MPGOS 优于这些软件包。
- 教程 6(冲击动力学)也扩展了性能曲线,请参阅上一点。在这种情况下,MPGOS 是唯一能够处理具有冲击动态的系统(在 GPU 上)的程序包。因此,仅对 odeint 和 DifferentialEquations.jl 的 CPU 版本进行了性能比较。
- 小改动:TimeDomain 和 ActualState 变量明确分离。
每块耦合系统 v1.0:
- 第一个 MPGOS 模块已准备就绪。该代码旨在解决具有不同初始条件和/或参数集的耦合系统(由许多称为单元的子系统组成)的大量实例。
- 该模块继承了Single System Per-Thread v3.1模块的几乎所有功能。没有什么特殊之处,例如,事件处理只能在单元级别上进行。只能以矩阵形式处理显式耦合;详细内容有兴趣的读者可参阅手册。
- 提供了两个教程示例。
2020 年 2 月 14 日。
单系统每线程 v3.0:
- 巨大的性能改进。引入的模板元编程技术使我们能够生成高度优化的代码。平均渗透率为 3 倍,而对于低维系统,它甚至可以是一个数量级。
2019 年 10 月 10 日。
单系统每线程 v2.1:
- 通过模板元编程,代码完全模板化,可在编译时生成高度专业化的求解器代码(作为算法的函数以及事件处理和密集输出的必要性)。因此,文件系统被重新设计。
- 小扩展:可以使用整数共享参数和整数附件,以便能够为复杂的系统有效地实现复杂的索引技术。
2019 年 8 月 13 日。
单系统每线程 v2.0:
- 现在支持密集输出,但限制很少,请参阅手册。例如,这是求解时滞微分方程的先决条件。
- 代码及其界面大大简化和清晰。例如,问题池从代码中完全省略(由于历史原因而保留),并且许多可能的选项现在绑定到求解器对象,可以使用单个成员函数来设置所有这些选项。
- 该手册还根据反馈进行了重组和简化。
2019 年 4 月 9 日。
单系统每线程 v1.1:
- 设备 (GPU) 可以与每个解算器对象关联。因此,设备选择现在是自动处理的。
- 为每个求解器对象自动创建 CUDA 流。
- 一组新的成员函数可重叠 CPU-GPU 计算,并轻松地将工作负载分配到单个节点中的不同 GPU。这包括异步内存和内核操作,以及 CPU 线程和 GPU 流之间的同步可能性。
- 可以在每个集成阶段指定活动线程数变量,以轻松处理拖尾效应。
- 添加了两个新的教程示例:a) 使用多个求解器对象进行重叠 CPU 和 GPU 计算 b) 使用单个机器/节点中可用的多个 GPU。
2019 年 2 月 14 日。
单系统每线程 v1.0:
- 第一个 MPGOS 模块已准备就绪。该代码旨在在 GPU 上求解大量独立但相同(参数集和初始条件可能不同)的 ODE 系统。
- 用户友好性。即使是 C++ 编程新手,只需一个短期课程就足以使用该程序包。
- 有详细的手册和教程示例。因此,用户可以通过复制粘贴代码块轻松构建自己的项目。
- 高效、稳健的事件处理。
- 每个时间步骤后用户定义的操作以实现灵活性。
- 在每个成功的时间步或事件处理之后用户定义的“交互”(非常有用,例如对于冲击动力学,请参阅手册中的教程示例)。
- 无需明确了解细节即可利用 GPU 的内存层次结构。
- 用户可编程参数,用于灵活实现并存储轨迹的特殊属性。
- 仅显式求解器:具有固定时间步长的 4 阶 Runge-Kutta 方法,以及具有 5 阶嵌入误差估计的 4 阶 Runge-Kutta-Cash-Karp 方法。 (由于隐式求解器的控制流程复杂,即使对于刚性问题,显式求解器有时也比隐式求解器表现更好)。
- 仅支持双精度算术运算。
- 仅存储每个积分阶段的端点(以提高速度)。然而,这很少是一个问题,因为用户可编程参数和上述用户定义的交互允许存储轨迹的最复杂的属性,请参阅文档。