我应该如何并行构建 2D 5 点模板拉普拉斯矩阵?

计算科学 并行计算 宠物 表现 有限差分 带状矩阵
2021-12-16 11:35:29

我正在用 SLEPc 制作一个简单的特征值求解器,使用 5 点模板和有限差分法。我希望能够并行组装矩阵。

我的第一个想法只是用来MatGetOwnershipRange()获取range_beginand range_end,然后在循环内使用测试来确定该行是否代表边缘上的一个点。所有这些条件都使循环非常慢,在 PETSc 文档的其他地方,它建议为角和边缘构建单独的循环。

这如何在并行程序中完成?

有没有更好的方法适用于拉普拉斯示例代码中未提及的并行代码

2个回答

这些条件是你最不担心的。如果矩阵插入/组装很慢,几乎总是意味着矩阵没有正确预分配。之后,检查并行分布是否良好(例如,使用 2D 分解而不是 1D)并且您的组装循环主要在给定进程拥有的行中设置值。2D 分解对自己进行编程有些棘手,因此您可能想查看这样的示例它使用 aDMDA来管理并行分解。MatSetValues()最后,更喜欢对每行或每个元素使用一次调用,而不是插入标量条目。

考虑定义边界并将其值设置为零。二维:

0 0 0 0 0
0 . . . 0
0 . . . 0
0 . . . 0
0 0 0 0 0

这样,内部循环可以没有条件,并且您可以根据需要分割矩阵以进行并行化。