petsc4py 与 c/c++/fortran 相比要慢多少?
我意识到这将很大程度上取决于正在执行的代码,但是像矩阵向量乘积这样简单的东西呢?
petsc4py 与 c/c++/fortran 相比要慢多少?
我意识到这将很大程度上取决于正在执行的代码,但是像矩阵向量乘积这样简单的东西呢?
这是科学编程界普遍关注的问题,我认为性能不确定性是计算科学中的主要“神话”之一。
正如@fcruz所讨论的,petsc4py
它是 PETSc 库的包装器,而不是 Python 中 PETSc 的重新实现。因此,您可以预期任何性能损失都来自将数组复制到 PETSc 或从 PETSc 复制,或者来自驱动程序代码/函数调用的开销。petsc4py
执行得非常仔细,只要你了解numpy
多维数组接口,可以避免复制开销。对于我工作的大多数用例,在 Python 中工作的性能损失约为 10-40%,而且我经常以其他方式获得实质性的收益,而不仅仅是弥补这种性能损失。事实上,与我交谈过的几位更有经验的 HPC Python 开发人员认为,这种性能差异通常可以进一步缩小,当 Python 驱动计算量大的代码时,肯定会出现这种情况。
存储库petsc4py
本身具有许多有用的示例来说明性能/灵活性的权衡。查看petsc4py
名为 的演示的源存储库perftest
,它使用 Python 驱动程序和 C 驱动程序(通过该目录中提供的 Fortran 内核)求解非线性方程组App.f90
。这里的性能开销约为 10%。
作为一个具体的例子,我是研究 PyClaw 的科学家团队的一员,PyClaw是一个软件包,它连接到 PETSc 用于并行网格管理和传统的 Fortran 内核,用于解决单元接口上的黎曼问题。我们对从 Fortran 驱动程序切换导致的性能下降进行了相当仔细的研究,您可以在会议论文的表 1 的第 5 页底部看到结果。在我们的案例中,我们牺牲了一点核心性能,以换取将代码轻松连接到 PETSc 和 Fortran 并在数万个核心上高效并行运行的能力。
Petsc4py 只是从 python访问 PETSc 的另一种方式,或者说是一样的,petsc4py 提供绑定,以便您可以从 python 访问 PETSc 数据结构和例程,以减少开发并行 PDE 求解器的工作量(那个规模)。
PETSc 为其求解器提供了多个抽象级别,您甚至可以使用 PETSc 来实现自己的求解器。在软件抽象的最低级别,PETSc 使用 BLAS、LAPACK 和 MPI,并且充其量与这些的实现一样快。
现在,pets4py 使用 cython 来实现对 PETSc 的绑定。使用 cython 的开销与将从 PETSc 完成的计算量有关。如果您使用 PETSc 的高级 PDE 求解器,则开销应该足够小,您无需担心它们。
一个可能比 PETSc 与 GEMV 的性能比较更重要的问题是 PETSc 是否适合您的工作。如果您需要实现非平凡的并行 PDE 求解器,那么 PETSc 很可能会真正帮助您。但是,如果你需要做一堆 GEMV,你需要一个 BLAS 库。祝你好运!