使用petsc4py与c / c ++ / fortran的效率


11

petsc4py比c / c ++ / fortran慢多少?

我意识到这将在很大程度上取决于正在执行的代码,但是像矩阵向量乘积这样简单的东西呢?

Answers:


11

这是科学编程界普遍关注的问题,我认为性能不确定性是计算科学中的主要“神话”之一。

正如@fcruz所讨论的,它petsc4py是PETSc库的包装,而不是Python中对PETSc的重新实现。因此,您可能会因为复制阵列与PETSc之间的复制或来自驱动程序代码/函数调用的开销而导致性能下降。petsc4py只要您了解numpy多维数组接口,可以避免复制开销。对于我从事的大多数用例,在Python中工作的性能损失约为10-40%,而且我经常以其他方式获得实质性收益,而这些收益远远不能弥补这种性能损失。实际上,与我交谈过的一些经验丰富的HPC Python开发人员认为,这种性能差异通常可以进一步减小,并且当Python驱动计算量很大的代码时,肯定会发生这种情况。

petsc4py库本身有许多有用的例子来说明的性能/灵活性折衷。在petsc4py源代码库中查找名为的演示perftest,该演示使用Python驱动程序和C驱动程序(通过App.f90该目录中提供的Fortran内核)解决了非线性方程组。这里的性能开销约为10%。

举一个具体的例子,我是PyClaw科学家团队的成员,PyClaw是一个软件包,可与PETSc进行并行网格管理,而传统的Fortran内核则可解决单元界面上的Riemann问题。我们对从Fortran驱动程序切换导致的性能下降进行了相当仔细的研究,您可以在会议论文表1的第5页底部看到结果。在我们的案例中,我们在内核性能上进行了一些折衷,以换取将代码轻松连接到PETSc和Fortran并在成千上万的内核上并行高效运行的能力。


小型的非结构化代码也有类似的问题。PETSc仅提供数据结构和求解器,但在PETSc可以组装和求解之前,我仍然必须读入网格(最多4GB输入文件),分区,创建映射,循环遍历元素,计算局部(单元)刚度矩阵等。 。对于非PETSc相关的东西,特别是I / O,映射和元素级别计算,python不会慢一些。因为其余的代码仍然很简单。
stali 2012年

元素级计算通常作为内核传递(请参阅参考资料中的App.f90源代码perftest)。I / O没有性能差异。您是否看过FEniCS以获得更高级别的软件包?
阿隆·艾玛迪亚

你是对的。我确实有这个主意,但是在我的特殊情况下,有很多这样的内核(用于不同类型元素的形状函数,元素级计算,映射等),大约占代码的90%。我曾经看过Fenics,许多细节,例如处理外部网格物体和强加BC等,乍一看还是不太清楚,或者看起来更复杂(至少对我而言)。此外,我使用Fortran,对于像我这样的非CS人员来说,使用起来非常简单(考虑到出色的PETSc文档)。实际上,对于我的工作,我发现它比python :)更容易。
stali 2012年

7

Petsc4py只是访问PETSc的另一种方法,但是是从python进行的,或者说,petsc4py提供了绑定,因此,从python,您可以访问PETSc数据结构和例程,以减少开发并行PDE求解器的工作量(该比例)。

PETSc为求解器提供了多个抽象级别,您甚至可以使用PETSc来实现自己的求解器。在最低的软件抽象级别上,PETSc使用BLAS,LAPACK和MPI,并且充其量只能与它们的实现一样快。

现在,pets4py使用cython来实现与PETSc的绑定。使用cython的开销与要从PETSc中进行多少计算有关。如果使用PETSc的高级PDE求解器,则开销应该足够小,以至于不必担心它们。

与PETSc与GEMV的性能比较相比,一个可能更重要的问题是PETSc是否是适合您工作的工具。如果您需要实现非平凡的并行PDE求解器,那么PETSc很可能会真正为您提供帮助。但是,如果需要执行大量GEMV操作,则需要一个BLAS库。祝好运!

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.