在并行有限元计算中管理网格的最佳方法?


11

我目前正在开发一种域分解方法来解决散射问题。基本上,我正在迭代地解决Helmholtz BVP系统。我在三角形或四面体网格上使用有限元方法离散化方程。我正在为我的博士学位论文开发代码。我知道一些现有的有限元库,例如Deal.ii或DUNE,尽管我认为它们很棒,具有鼓舞人心的设计和API,但出于学习目的,我想从头开始开发自己的小应用程序。

我现在正在运行我的串行版本,现在我想对其进行并行化。毕竟,至少在原则上,制定易于并行化的算法是领域分解框架的优势之一。但是实际上,有许多细节必须考虑。网格管理就是其中之一。如果应用程序在达到高分辨率的同时可以很好地扩展到许多CPU,则在每个CPU上复制整个网格的效率很低。

我想问那些在高性能计算环境中从事类似应用程序工作的开发人员如何处理此问题。

有用于分布式网格管理的p4est库。我不需要AMR,所以这可能是一个过大的选择,因为我只对使用统一网格感兴趣,并且不确定是否可以优化三角形网格。我也可以简单地创建一个统一的网格,然后将其输入到网格划分器之一中,并对输出进行一些后期处理。

最简单的方法似乎是为每个分区创建一个单独的文件,其中包含仅与该特定分区相关的网格信息。该文件将由单个CPU读取,该CPU负责在网格的该部分上组装离散系统。当然,某些全局分区连接性/邻居信息也需要存储在所有CPU读取的文件中以进行进程间通信。

还有哪些其他方法?如果你们中的一些人可以分享,那么与该问题相关的行业或政府研究机构中最常用的方法有哪些?对于编程并行有限元求解器,我是一个新手,我想了解一下我是否在正确地考虑这个问题以及其他人如何解决这个问题。任何有关相关研究文章的建议或指针将不胜感激!

提前致谢!


如果您正在寻找网格划分器-METIS是个不错的选择。还要检查ParMETIS。管理网格是另一回事,ITAPS iMesh可以为您提供解决方案。请也在这里检查我的问题的答案scicomp.stackexchange.com/questions/4750/...
克日什托夫·Bzowski

@KrzysztofBzowski:也许您也使用过Scotch库?我想知道苏格兰威士忌和梅蒂斯在有限元方面有什么区别。iMesh项目似乎非常有趣。在接下来的几天中,我将详细了解。我了解Deal.II和DUNE。我记得前一段时间研究过openMesh,但认为从头开始实现我所需的功能会更容易。对于顺序网格,基本上我改编了本文链接中介绍的半边/面数据结构,谢谢!
2013年

Answers:


7

如果您不使用AMR并且不想扩展到1K-4K内核以上,则只需执行此操作即可。

  1. 等级0读取整个网格并使用METIS / Scotch等对其进行分区。(注意:这是一个串行操作)。

  2. 等级0将元素/节点分区信息广播到所有其他等级,并释放内存(用于存储网格)

  3. 所有等级从相同的输入文件中读取它们拥有的节点/元素(包括幻影节点)(注意:2000等级访问相同的输入文件可能听起来很慢,但实际上并没有,尽管这可能对文件系统不利,但是我们只做一次)。

  4. 所有级别都需要创建局部到全局的节点/元素/ dof映射,以用于BC的应用和矩阵的组装,并对节点重新编号。

一切都说完之后,一个等级上的所有数据都将是本地的,因此您应该能够很好地扩展(在内存方面)。我用我的一小段代码在大约100行中完成了所有这些操作(请参阅此处的 35-132行)。

现在,如果您的网格太大(例如,> 100-2.5亿个元素),您将无法在单个节点上使用METIS对其进行分区,并且需要ParMETIS / PT-Scotch,那么您将需要在所有核心/行列可以阅读它。在这种情况下,出于逻辑原因,将分区阶段与主代码分开可能会更容易。

Btw AMR库通常不做tets。同样,PETSc是代码并行化的不错选择。

编辑:另请参阅此处此处


感谢您分享您的代码!我很可能会采用您上面概述的路线。看起来最简单,我已经知道如何去做。此外,这将是MPI编程中的一个很好的练习。您提到AMR库通常不处理tets。是因为对三角形网格的四叉树进行幼稚的细化会导致质量差的网格?完善四边形似乎很容易,但是如果想要保留质量,将四音分割成四个似乎很难。也许有PETSc的C ++包装器吗?我可以使用C,但是C ++会更好。
2013年

@midurad如果您更喜欢C ++而不是C,则应该考虑Trilinos,它是可与PETSc媲美的C ++库。此外,Trilinos有一个软件包(Zoltan),可用于执行网格划分。
Dr_Sam 2013年

@midurad如果使用PETSc,则只需要很少的MPI调用。精简tet应该很容易,但是(有效地)处理关联的动态数据结构可能需要一些思考和工作。您应该可以将PETSc与C ++一起使用,但是鉴于您的要求,libmesh可能是一个可行的选择(我认为它支持AMR和tets)。
stali 2013年

谢谢大家提供的信息。那很有帮助。
2013年

2

鉴于我开发了交易,这可能不足为奇。但是,这是我的看法:当我与学生交谈时,我通常会告诉他们一开始就开发自己的原型,以便他们可以看到它是如何完成的。但是,然后,一旦他们完成了一些小任务,我就让他们使用一个可以使他们走得更远的库,因为他们基本上不必一步步地重新发明轮子。

在您的案例中,您已经了解了如何实现简单的亥姆霍兹求解器。但是您将在接下来的6个月中花时间编写并行执行此操作所需的代码,如果您想使用更复杂的几何图形,则将花费3个月。如果需要高效的求解器,则需要再花费6个月。在所有这些时间里,您正在编写已经由他人编写的代码,从某种意义上讲,它并不能使您更接近于博士实际需要做的事情:开发尚未开发的新东西以前做过。如果走这条路,您将花费2-3年的博士学位时间重新做别人做的事情,也许花1年时间做新的事情。

另一种选择是,您现在花费6个月来学习一个现有的图书馆,但是之后,您将有2-3年的时间真正从事新工作,每隔一周您就可以走进顾问的办公室,向他展示/她是真正新颖的东西,可以大规模运行,或者在其他方面非常酷。我想您现在可能已经知道我要怎么做了。


3
诚实的问题是,既然您显然是权威,那么:如果目前的博士生中没有人能够解决这样的问题,那么谁将编写下一代协议如Deal.ii?我们已经看到,来势汹汹的博士生甚至从未编写过程序,这是一个成问题的趋势。令我感到不安的是,平均代码开发人员的技能似乎在不断地下降,这是计算科学家所为。
Aurelius

1
这是一个公平的问题。您需要像我一样顽固,固执的研究生:-)但是我的回答是,仅仅因为我们可能需要一些这样做的人,这并不意味着我们应该鼓励每个人花很多年重复生活其他人已经实施的。
Wolfgang Bangerth 2014年

2
是的,足够公平。在过去的20年中,IMO一直是CFD研究界的最大障碍,一直是缺乏软件工程人才和灰胡子拒绝现代软件实践。除了框架之外,如此之多的博士生都因为不良的旧代码而无法及时构建现代硬件上现代数值方法所需的复杂软件。
Aurelius

我不同意关于灰胡须的说法(尽管这些天我的脸也灰白了……)。但是他们也看到,当您有一个新的研究生时,您必须在繁琐的旧代码或重新发明轮子之间进行选择。很少有人会喜欢使用他们编写的软件获得成功(现在没有作者),并且如果您不知道他们可以从事该职业,那么您就不想在这条路上派一个有前途的研究生。
Wolfgang Bangerth 2014年

0

这不是一个完整的答案。

为了实现并行域分解方法,我遇到了一些麻烦。首先,一个人可以将多个处理器用于一个子域,或者为一个处理器提供多个子域,并且一个人可能想要实现这两种范例。其次,域分解方法的子结构形式要求分离出子域(而非元素)的面,边,顶点。我认为这些复杂性不容易包含在并行网格管理中。如果您为一个子域考虑一个处理器并使用重叠的RAS / RASHO方法,情况将变得更加简单。即使在这种情况下,您最好自己管理并行布局,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.