¿Cuánto más lento es petsc4py vs c / c ++ / fortran?
Me doy cuenta de que dependerá significativamente del código que se ejecute, pero ¿qué pasa con algo simple como un producto de matriz de vectores?
Esta es una preocupación muy extendida en la comunidad de programación científica, y consideraría que la incertidumbre del rendimiento es uno de los principales "mitos" en la ciencia computacional.
Como comenta @fcruz , petsc4py
es un contenedor para las bibliotecas PETSc, no una reimplementación de PETSc en Python. Por lo tanto, puede esperar que las penalizaciones de rendimiento provengan de la copia de matrices hacia y desde PETSc, o de la sobrecarga en sus llamadas de código / función del controlador. petsc4py
se implementa con mucho cuidado y siempre que comprendanumpy
Interfaces de matriz multidimensional, puede evitar la sobrecarga de la copia. Para la mayoría de los casos de uso en los que trabajo, la penalización de rendimiento al trabajar en Python es del orden del 10-40%, y a menudo gano sustancialmente de otras maneras que compensan con creces este impacto en el rendimiento. De hecho, varios desarrolladores más experimentados de HPC Python con los que he hablado sostienen la opinión de que esta diferencia de rendimiento generalmente se puede reducir aún más, y cuando Python maneja códigos computacionalmente costosos, este será sin duda el caso.
El petsc4py
repositorio en sí presenta una serie de ejemplos útiles para ilustrar el compromiso de rendimiento / flexibilidad. Busque en el petsc4py
repositorio de origen la demostración llamada perftest
, que resuelve un sistema no lineal de ecuaciones utilizando un controlador Python y un controlador C (sobre un núcleo Fortran proporcionado App.f90
en ese directorio). La sobrecarga de rendimiento aquí es del orden del 10%.
Como ejemplo concreto, formo parte de un equipo de científicos que trabajan en PyClaw , un paquete de software que se conecta a PETSc para la gestión de la red paralela y los núcleos heredados Fortran para resolver los problemas de Riemann en las interfaces celulares. Realizamos un estudio bastante cuidadoso de la degradación del rendimiento al cambiar de un controlador Fortran, y puede ver los resultados en la parte inferior de la página 5 en la Tabla 1 en el documento de la conferencia . En nuestro caso, intercambiamos un poco de rendimiento en el núcleo por la capacidad de interconectar fácilmente nuestro código con PETSc y Fortran y ejecutar de manera eficiente en paralelo en decenas de miles de núcleos.
App.f90
fuente enperftest
). No hay diferencia de rendimiento en E / S. ¿Has mirado en FEniCS para un paquete de nivel superior?Petsc4py es solo otra forma de acceder a PETSc, pero desde python , o es lo mismo que decir, petsc4py proporciona los enlaces para que, desde python, pueda acceder a las estructuras y rutinas de datos de PETSc destinadas a reducir el esfuerzo de desarrollar solucionadores de PDE paralelos (esa escala).
PETSc proporciona varios niveles de abstracciones a sus solucionadores, e incluso puede usar PETSc para implementar su propio solucionador. En el nivel más bajo de abstracción de software, PETSc utiliza BLAS, LAPACK y MPI, y en el mejor de los casos será tan rápido como la implementación de estos.
Ahora, pets4py usa cython para implementar los enlaces a PETSc. La sobrecarga del uso de cython es relativa a la cantidad de cálculos que se realizarán desde PETSc. Si utiliza los solucionadores PDE de alto nivel de PETSc, los gastos generales deben ser lo suficientemente pequeños como para que no tenga que preocuparse por ellos.
Una pregunta quizás más importante que la comparación de rendimiento de PETSc vs GEMV es si PETSc es la herramienta adecuada para su trabajo. Si necesita implementar solucionadores de PDE paralelos no triviales, lo más probable es que PETSc realmente lo ayude. Sin embargo, si necesita hacer un montón de GEMV, quiere una biblioteca BLAS. ¡Buena suerte!
fuente