并行时间步长算法:解决抛物型偏微分方程的新途径
1. 并行化的新维度
在求解偏微分方程(PDEs)的数值解时,通常涉及一个空间域。过去,并行化求解过程的主要工作集中在空间域分割(即区域分解)上。这种方法将原始空间域分解为多个子域,不同的处理器分别处理不同的子域。
然而,许多研究发现,随着并行计算机中处理器数量的增加,用于求解这些PDEs的迭代算法效率会显著下降。尤其是在那些具有快速数值计算处理器,但处理器间通信通道相对较慢的架构中,这种情况更为明显。对于与时间相关的PDEs,传统的区域分解方法使得所有处理器在任何给定时刻只能处理同一个时间步,因为时间维度的计算是按顺序进行的。这导致在处理器数量较多时,通信与计算的比率非常高。
为了缓解这个问题,一种新的方法是开发能够同时利用空间和时间维度并行性的算法,使不同的处理器可以同时处理不同的时间步。
为了简化说明,我们使用以下方程来演示求解过程以及影响可扩展并行计算机性能的现有问题:
[
\begin{cases}
\frac{\partial u}{\partial t}+Lu = f, & x\in\Omega, t_0 < t < T \
B(u)=u_b(t), & x\in\partial\Omega, t_0 < t < T \
u(x,t_0)=u_0(x), & x\in\Omega
\end{cases}
]
其中,$L$ 是一个椭圆型空间算子(例如,如果上述方程是热传导方程,$L$ 将是拉普拉斯算子),$B$ 是边界算子,$\Omega$ 是一个二维矩形空间域。这里介绍的方法可以扩展到涉及更高阶时间导数和三维空间域的更复杂情况。
求解PDEs数值解的第一步是对方程和域(包括空间和时间维度)进行离散化。离散化后的空间域可以用一个 $m\times m$ 网格中的一组点表示,时间域则用离散的时间步 $t_0 = t_1 < t_2 < \cdots < t_n = T$ 表示。如果使用两层隐式时间步长算法,在每个时间步 $t_k$,我们将得到一个代数方程组:
[
Au_k = Cu_{k - 1}+b_k, \quad k = 1,2,\cdots,n
]
其中,$A$ 和 $C$ 是 $m^2\times m^2$ 矩阵,其元素取决于算子 $L$ 和 $B$ 的形式以及离散化方案;$m^2$ 是离散空间域中的网格点数;$u_k$ 是一个 $m^2\times 1$ 向量,包含时间步 $k$ 时所有网格点的函数值 $u$;$b_k$ 是 $f$ 的离散形式。
从上述方程可以看出,不同索引 $k$ 的方程组似乎相互依赖,不能同时求解。从已知的初始条件 $u^0$ 开始,我们先求解 $u^1$,然后将 $u^1$ 代入方程的右侧求解 $u^2$,以此类推,直到求解出 $u^1,\cdots,u^n$。这种时间步长过程似乎本质上是顺序的。
因此,并行化求解过程的主要工作集中在通过将矩阵 $A$ 的列或行分配给不同的处理器来利用并行性。由于 $A$ 中的每一行代表一个空间网格点的方程,这种方法相当于将原始空间域分割成子域,并将不同的子域分配给 $P$ 个不同的处理器。常见的分割方案有两种:
-
方案一
:将原始的 $m\times m$ 域划分为 $P$ 个尺寸为 $m\times\frac{m}{P}$ 的条带。
-
方案二
:将原始域划分为 $P$ 个尺寸为 $\frac{m}{\sqrt{P}}\times\frac{m}{\sqrt{P}}$ 的小块。
由于矩阵 $A$ 通常是稀疏且有结构的,大多数情况下使用迭代算法来求解方程,例如雅可比(Jacobi)或高斯 - 赛德尔(Gauss - Seidel)类型的松弛方案:
[
u_i^{l + 1}=T_iu_i^l+P(b_k + u_{k - 1}), \quad i = 1,2,\cdots, k = 1,\cdots,n
]
每个时间步需要进行多次迭代。在每次迭代中,处理器必须通过处理器间通信与持有相邻子域的处理器交换其边界上的解值。
对于给定的空间域,随着并行计算机中可用处理器数量的增加,分配给每个处理器的子域尺寸会变小。由于处理器必须与相邻子域的处理器交换边界上的解,通信与计算的比率会随着处理器数量的增加而增加。越来越多的时间将花费在信息交换上,而不是计算上。由于处理器间通信所花费的时间并不直接对数值计算有贡献,算法的效率会随着处理器数量的增加而下降。
如果从全局的角度来看方程在不同时间步的所有方程,不同时间步的问题可以被视为一个定义在增强型时空域上的组合问题。传统的时间步长算法是按顺序依次求解这些方程,而我们可以将这些问题合并为一个定义在三维增强型时空域上的更大的方程组,然后应用不同的并行算法来求解这个增强型系统,从而并行求解不同时间步的解。
以下是传统时间步长算法和并行时间步长算法的对比表格:
| 算法类型 | 处理器工作方式 | 通信与计算比率 | 效率 |
| ---- | ---- | ---- | ---- |
| 传统时间步长算法 | 所有处理器同一时刻处理同一时间步 | 随处理器数量增加而增加 | 随处理器数量增加而下降 |
| 并行时间步长算法 | 不同处理器同时处理不同时间步 | 可有效降低 | 可提高 |
下面是传统时间步长算法的流程 mermaid 图:
graph TD;
A[开始] --> B[初始化u0];
B --> C[进入时间步循环];
C --> D[求解当前时间步的代数方程组];
D --> E[判断是否完成所有时间步];
E -- 否 --> C;
E -- 是 --> F[结束];
2. 波形松弛法
波形松弛算法最初是为解决电路仿真中产生的大型常微分方程组而开发的。由于偏微分方程可以先在空间变量上进行离散化,同时保持时间变量连续,从而生成一组常微分方程,因此我们也可以将为常微分方程开发的算法应用于与时间相关的PDEs。
2.1 时间相关PDEs的波形松弛法
考虑抛物型方程:
[
\begin{cases}
\frac{\partial u}{\partial t}+Lu = f, & x\in\Omega, t_0 < t < T \
B(u)=u_b(t), & x\in\partial\Omega, t_0 < t < T \
u(x,t_0)=u_0(x), & x\in\Omega
\end{cases}
]
我们首先对空间算子 $L$ 进行离散化,得到一个常微分方程组:
[
\frac{du}{dt}+A(u)=f, \quad t_0 < t < T, \quad u(t_0)=u_0
]
其中,$u$ 是一个向量,包含未知函数 $u(t)$ 在所有网格点的值;$A$ 是算子 $L$ 的离散化版本(在线性情况下,$A$ 将是一个常数矩阵);$f$ 是由函数 $f$ 和边界条件确定的强迫项;$u_0$ 是初始条件。
作为一个简单的例子,如果使用中心有限差分方案在均匀网格上对以下方程的空间导数进行离散化:
[
\begin{cases}
\frac{\partial u}{\partial t}-\frac{\partial^2 u}{\partial x^2}=f(x,t), & x\in\Omega, t_0 < t < T \
u(x,t_0)=g(x), & x\in\Omega
\end{cases}
]
我们将得到一个类似于上述常微分方程组的系统,其中:
[
u(t)=\begin{bmatrix}u_1(t)\\vdots\u_N(t)\end{bmatrix}, \quad f(t)=\begin{bmatrix}f_1(t)\\vdots\f_N(t)\end{bmatrix}, \quad A=\begin{bmatrix}-2 & 1 & & \1 & -2 & 1 & \& \ddots & \ddots & \ddots \& & 1 & -2\end{bmatrix}
]
其中,$N$ 是网格点的数量。
波形松弛算法求解上述常微分方程组与求解代数方程的经典松弛算法非常相似。使用波形雅可比松弛法,方程变为:
[
\frac{du_i^{n + 1}}{dt}+A_{ii}u_i^{n + 1}+\sum_{j\neq i}A_{ij}u_j^n = f_i, \quad i = 1,2,\cdots,N, n = 0,1,2,\cdots
]
从给定的初始值向量开始,这 $N$ 个常微分方程相互独立,可以使用任何标准的常微分方程算法和软件包进行求解。对于上述方程和均匀网格,波形雅可比松弛法将简化为:
[
\frac{du_i^{n + 1}}{dt}-\frac{1}{\Delta x^2}(u_{i - 1}^n - 2u_i^n + u_{i + 1}^n)=f_i, \quad i = 1,2,\cdots,N, n = 0,1,\cdots
]
如果使用隐式欧拉算法对方程进行积分,我们将得到:
[
-\frac{\Delta t}{\Delta x^2}u_{i - 1}^{n,k}+(1 + \frac{2\Delta t}{\Delta x^2})u_i^{n + 1,k}=\frac{\Delta t}{\Delta x^2}u_{i - 1}^{n,k - 1}+\frac{\Delta t}{\Delta x^2}u_{i + 1}^{n,k - 1}+\Delta t f_{i,k}
]
其中,$i = 1,2,\cdots,N$,$k = 1,2,\cdots,m$,$n = 0,1,\cdots$,$m$ 是时间步的数量,$\Delta=\frac{\Delta t}{\Delta x^2}$。
将上述方程关于索引 $k$(时间步)进行组装,我们可以得到每个网格点 $x_i$ 的矩阵方程组:
[
B\begin{bmatrix}u_i^{n + 1,1}\\vdots\u_i^{n + 1,m}\end{bmatrix}=\begin{bmatrix}\frac{\Delta t}{\Delta x^2}u_{i - 1}^{n,0}+\frac{\Delta t}{\Delta x^2}u_{i + 1}^{n,0}+\Delta t f_{i,1}\\vdots\\frac{\Delta t}{\Delta x^2}u_{i - 1}^{n,m - 1}+\frac{\Delta t}{\Delta x^2}u_{i + 1}^{n,m - 1}+\Delta t f_{i,m}\end{bmatrix}
]
其中,
[
B=\begin{bmatrix}1 + 2\Delta & - \Delta & & \- \Delta & 1 + 2\Delta & - \Delta & \& \ddots & \ddots & \ddots \& & - \Delta & 1 + 2\Delta\end{bmatrix}
]
波形雅可比松弛算法的完整步骤如下:
1. 初始化 $n = 0$。
2. 选择初始猜测值 $u_i^n(t)$,$i = 1,\cdots,N$,$t_0 < t < T$。
3. 循环直到收敛:
- 对于 $i = 1$ 到 $N$:
- 求解方程 $\frac{du_i^{n + 1}}{dt}+A_{ii}u_i^{n + 1}+\sum_{j\neq i}A_{ij}u_j^n = f_i$,初始条件为 $u_i^{n + 1}(t_0)=u_{0i}$。
- $n = n + 1$。
类似于经典的松弛算法,我们可以使用波形高斯 - 赛德尔和波形超松弛(SOR)方法更有效地求解上述常微分方程组。基于波形雅可比松弛法的方程,波形高斯 - 赛德尔松弛法可以写成:
[
\frac{du_i^{n + 1}}{dt}+A_{ii}u_i^{n + 1}+\sum_{j < i}A_{ij}u_j^{n + 1}+\sum_{j > i}A_{ij}u_j^n = f_i, \quad i = 1,2,\cdots,N, n = 0,1,\cdots
]
使用这种松弛算法,定义在二维矩形域上的热传导方程可以离散化为:
[
\frac{\partial u_{j,k}^{n + 1}}{\partial t}-\frac{1}{\Delta x^2}(u_{j - 1,k}^n - 2u_{j,k}^n + u_{j + 1,k}^n)-\frac{1}{\Delta y^2}(u_{j,k - 1}^n - 2u_{j,k}^n + u_{j,k + 1}^n)=f_{j,k}, \quad j,k = 1,2,\cdots,m, n = 0,1,\cdots
]
以下是波形雅可比松弛算法的 mermaid 流程图:
graph TD;
A[初始化n = 0] --> B[选择初始猜测值u_i^n(t)];
B --> C{是否收敛};
C -- 否 --> D[循环i从1到N];
D --> E[求解方程得到u_i^{n + 1}(t)];
E --> F[n = n + 1];
F --> C;
C -- 是 --> G[结束];
综上所述,通过引入并行时间步长算法和波形松弛法,我们为解决抛物型偏微分方程提供了新的思路和方法,有望提高并行计算机在求解这类问题时的效率。后续我们还将探讨窗口和流水线迭代等其他利用时间维度并行性的方法。
并行时间步长算法:解决抛物型偏微分方程的新途径
3. 窗口和流水线迭代
除了波形松弛法,窗口和流水线迭代也是利用时间维度并行性的有效方法,它们基于偏微分方程的公式进行设计,下面详细介绍这两种方法。
3.1 窗口迭代
窗口迭代的核心思想是将时间域划分为多个窗口,每个窗口内的问题可以独立求解,但窗口之间可能存在一定的依赖关系。具体步骤如下:
1.
时间域划分
:将整个时间区间 $[t_0, T]$ 划分为 $W$ 个窗口,每个窗口的时间长度可以相同也可以不同,记为 $[t_{w - 1}, t_w]$,其中 $w = 1, 2, \cdots, W$,且 $t_0 < t_1 < \cdots < t_W = T$。
2.
窗口内求解
:对于每个窗口 $w$,将其视为一个独立的问题进行求解。在窗口内,使用传统的时间步长算法或其他合适的方法求解偏微分方程。例如,对于之前提到的抛物型方程,在窗口 $w$ 内的离散化方程仍然是 $A u_k = C u_{k - 1} + b_k$,其中 $k$ 是窗口 $w$ 内的时间步索引。
3.
窗口间通信
:由于窗口之间可能存在依赖关系,在求解完一个窗口后,需要将窗口边界的解信息传递给相邻的窗口,以便后续窗口的求解。例如,如果窗口 $w$ 的结束时间步为 $t_{k_w}$,则需要将 $u_{k_w}$ 的值传递给窗口 $w + 1$ 作为其初始条件。
窗口迭代的优点是可以在一定程度上利用时间维度的并行性,同时减少处理器间的通信量。因为每个窗口内的求解可以独立进行,不同的处理器可以同时处理不同的窗口。但缺点是窗口间的依赖关系可能会限制并行性的进一步提高。
以下是窗口迭代的流程 mermaid 图:
graph TD;
A[开始] --> B[划分时间域为W个窗口];
B --> C[选择窗口w = 1];
C --> D[在窗口w内求解偏微分方程];
D --> E[传递窗口w边界解信息到窗口w + 1];
E --> F{是否完成所有窗口};
F -- 否 --> G[w = w + 1];
G --> D;
F -- 是 --> H[结束];
3.2 流水线迭代
流水线迭代是一种更高效的利用时间维度并行性的方法,它类似于工业生产中的流水线作业。具体步骤如下:
1.
任务分解
:将整个求解过程分解为多个阶段,每个阶段对应一个时间步的计算。例如,对于 $n$ 个时间步的问题,将其分解为 $n$ 个阶段。
2.
流水线启动
:首先启动第一个阶段的计算,即求解第一个时间步的方程。当第一个阶段完成一部分计算后,启动第二个阶段的计算,同时第一个阶段继续进行后续的计算。以此类推,形成一个连续的流水线。
3.
数据传递
:在每个阶段完成计算后,将结果传递给下一个阶段。例如,在第 $k$ 个阶段完成 $u_k$ 的计算后,将 $u_k$ 传递给第 $k + 1$ 个阶段,用于求解 $u_{k + 1}$。
流水线迭代的优点是可以充分利用时间维度的并行性,因为不同的阶段可以同时进行计算。而且,由于数据的传递是连续的,处理器间的通信开销也相对较小。但缺点是需要精确控制每个阶段的计算时间,以确保流水线的顺畅运行。
以下是流水线迭代的流程 mermaid 图:
graph TD;
A[开始] --> B[启动第一个阶段计算];
B --> C{是否完成所有阶段};
C -- 否 --> D[启动下一个阶段计算];
D --> E[传递当前阶段结果到下一个阶段];
E --> C;
C -- 是 --> F[结束];
4. 不同方法的对比与总结
为了更清晰地了解波形松弛法、窗口迭代和流水线迭代这三种方法的特点,我们将它们进行对比,如下表所示:
| 方法 | 原理 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- |
| 波形松弛法 | 将偏微分方程离散化为常微分方程组,利用常微分方程的求解算法并行求解 | 可直接应用于时间相关的偏微分方程,算法相对简单 | 对于复杂问题,收敛速度可能较慢 | 适用于问题规模较小,且对算法复杂度要求不高的情况 |
| 窗口迭代 | 将时间域划分为多个窗口,窗口内独立求解,窗口间传递边界信息 | 可在一定程度上利用时间维度并行性,减少通信量 | 窗口间依赖关系可能限制并行性 | 适用于问题具有一定的时间局部性,窗口间依赖较弱的情况 |
| 流水线迭代 | 将求解过程分解为多个阶段,形成连续的流水线进行计算 | 充分利用时间维度并行性,通信开销小 | 需要精确控制计算时间,实现难度较大 | 适用于问题规模较大,且对并行性要求较高的情况 |
在实际应用中,需要根据具体问题的特点选择合适的方法。例如,如果问题的规模较小且结构相对简单,可以优先考虑波形松弛法;如果问题具有一定的时间局部性,可以尝试窗口迭代;而对于大规模的问题,流水线迭代可能是更好的选择。
5. 总结与展望
通过引入并行时间步长算法,包括波形松弛法、窗口迭代和流水线迭代等方法,我们为解决抛物型偏微分方程提供了多种利用时间维度并行性的途径。这些方法在不同程度上提高了并行计算机在求解这类问题时的效率,减少了通信与计算的比率,使得更多的处理器能够同时参与到计算中。
然而,这些方法也存在一些挑战和局限性。例如,波形松弛法的收敛速度可能较慢,窗口迭代的窗口间依赖关系可能限制并行性,流水线迭代的实现难度较大等。未来的研究可以从以下几个方面展开:
-
算法优化
:进一步优化现有的算法,提高收敛速度和并行效率。例如,结合不同算法的优点,开发混合算法。
-
硬件适配
:根据不同的硬件架构,对算法进行定制化优化,充分发挥硬件的性能。例如,针对多核处理器、GPU 等不同的计算平台,设计更高效的并行算法。
-
问题扩展
:将这些方法扩展到更复杂的问题中,如涉及更高阶时间导数、三维空间域以及非线性偏微分方程等。
总之,并行时间步长算法为解决抛物型偏微分方程带来了新的机遇和挑战,随着研究的不断深入,相信会有更多高效的算法和方法出现,为科学计算和工程应用提供更强大的支持。
超级会员免费看
90

被折叠的 条评论
为什么被折叠?



