Answers:
这是科学编程界普遍关注的问题,我认为性能不确定性是计算科学中的主要“神话”之一。
正如@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并在成千上万的内核上并行高效运行的能力。
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库。祝好运!