并行与串行 Thomas 算法

计算科学 并行计算 C++ mpi
2021-12-14 16:03:58

我目前正在编写一个代码,该代码每次迭代都解决一个大的三对角矩阵并运行 1,000 次迭代。我目前正在使用 Thomas 算法来串行求解矩阵。我在名为“C++ 和 MPI 中的并行科学计算”一书中找到了 Thomas 算法的并行版本(如果你用谷歌搜索它,你可以很容易地找到一个版本)。

问题是当我运行直接从书中获取的并行 Thomas 时,它的运行时间实际上比串行算法慢。这对我来说似乎令人困惑,因为创建并行算法的全部目的是加快它的速度。我通过逐字运行书中的串行和并行算法并将相同的三对角线发送到每个函数中来测试两者。我在学校集群上运行 MPI 来运行这些并提交并行运行的作业,以确保我为每个节点使用相同的处理器类型。难道仅仅是集群布局的通信时间导致了这种情况吗?我觉得我一定做错了什么,所以任何帮助将不胜感激。如果发布每种算法都有用,请告诉我。

1个回答

Thomas 算法非常有效,因为它的操作计数非常低,而且一旦数据最初从内存中读取,数据访问很可能是缓存命中。

有两个循环。

第一个循环向前遍历数据。下三角、主三角和上三角的每个元素以及右侧向量(通常也是完成时的解向量)将仅从内存中读取一次,并在计算过程中多次使用。

第二个循环以相反的顺序遍历数据,因此刚刚在第一个循环中使用的数据仍然存在于缓存中。在大多数现代微处理器上,您将拥有数 MB 的最高级别高速缓存。这意味着,即使对于 300,000 个方程的系统,大部分数据仍将在缓存中。

我知道的任何并行三对角求解器都需要比串行算法更多的操作。如果您计算您从 Karniadakis 和 Kirby 中提到的算法中的操作,您会发现它执行了更多操作,即使它们是并行完成的。

原则上,并行三对角求解器应该比简单的串行算法更快,但在问题规模和处理器数量上比您使用的要大得多。

如果您可以同时求解多个系统,假设其中一些系统同时可用,您将更有可能加快求解速度。如果这是不可能的,但是您的三对角矩阵对于多个求解是相同的,您可以通过将 Thomas 算法分成两部分(分解和求解)来节省一些串行成本。

如果这些情况都不可能发生,您可能不会看到 Thomas 算法的并行版本的加速。