我正在用 SLEPc 制作一个简单的特征值求解器,使用 5 点模板和有限差分法。我希望能够并行组装矩阵。
我的第一个想法只是用来MatGetOwnershipRange()获取range_beginand range_end,然后在循环内使用测试来确定该行是否代表边缘上的一个点。所有这些条件都使循环非常慢,在 PETSc 文档的其他地方,它建议为角和边缘构建单独的循环。
这如何在并行程序中完成?
有没有更好的方法适用于拉普拉斯示例代码中未提及的并行代码?
我正在用 SLEPc 制作一个简单的特征值求解器,使用 5 点模板和有限差分法。我希望能够并行组装矩阵。
我的第一个想法只是用来MatGetOwnershipRange()获取range_beginand range_end,然后在循环内使用测试来确定该行是否代表边缘上的一个点。所有这些条件都使循环非常慢,在 PETSc 文档的其他地方,它建议为角和边缘构建单独的循环。
这如何在并行程序中完成?
有没有更好的方法适用于拉普拉斯示例代码中未提及的并行代码?
这些条件是你最不担心的。如果矩阵插入/组装很慢,几乎总是意味着矩阵没有正确预分配。之后,检查并行分布是否良好(例如,使用 2D 分解而不是 1D)并且您的组装循环主要在给定进程拥有的行中设置值。2D 分解对自己进行编程有些棘手,因此您可能想查看这样的示例,它使用 aDMDA来管理并行分解。MatSetValues()最后,更喜欢对每行或每个元素使用一次调用,而不是插入标量条目。
考虑定义边界并将其值设置为零。二维:
0 0 0 0 0
0 . . . 0
0 . . . 0
0 . . . 0
0 0 0 0 0
这样,内部循环可以没有条件,并且您可以根据需要分割矩阵以进行并行化。