为全局和局部 Petsc DA 向量使用相同的内存空间

计算科学 宠物
2021-12-18 09:23:41

我在 Petsc 3.2 中构建了一个本地和全局分布式数组,使用:

DMCreateGlobalVector(da, &v);
DMCreateLocalVector(da, &lv);

为了从相邻进程中检索幽灵单元格值,我只需使用以下命令:

DMGlobalToLocalBegin(da, v, INSERT_VALUES, lv);
DMGlobalToLocalEnd(da, v, INSERT_VALUES, lv);

据我了解,本地和全局向量使用单独的内存空间。对于任何处理器,全局向量 (Vec v) 的局部部分在分配给局部向量 (Vec lv) 的另一个内存空间中复制。我正在尝试构建一个使用相同内存空间的本地/全局向量。然后我需要使用某种分散例程来仅填充适当的幽灵单元。我注意到有一个VecCreateGhost函数似乎提供了这个功能。但是,它似乎与 DMDA 函数(例如 DMCreateGhostVector)无关。

1个回答

如果你有一个结构化的网格,那么这无疑是过早的优化。在多个维度中直接访问需要一些幻像值在“拥有”值之间,因此需要一个副本。

如果您使用 Krylov 方法、加速非线性方法 (NGMRES) 或多级时间积分器,那么最终使用VecGhostin place 代替普通全局向量几乎总是需要更多内存,因为额外空间存储为每个向量的一部分.

所以除非你有一个非常独特的应用程序,否则你真的不应该尝试使用VecGhost结构化网格。对于非结构化网格,它可以说是一种自然的表示形式,通常不会有害,除非你有更大的模板,但它也不是性能优化。如果你有一个非常特殊的用例,你可以实现DMCreateGlobalVector_XXX()返回一个VecGhost.