Eficiencia del uso de petsc4py vs. c / c ++ / fortran

11

¿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?

Andrew Spott
fuente

Respuestas:

11

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 , petsc4pyes 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. petsc4pyse implementa con mucho cuidado y siempre que comprendanumpyInterfaces 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 petsc4pyrepositorio en sí presenta una serie de ejemplos útiles para ilustrar el compromiso de rendimiento / flexibilidad. Busque en el petsc4pyrepositorio 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.f90en 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.

Aron Ahmadia
fuente
También tengo una preocupación similar con un pequeño código no estructurado. PETSc solo proporciona las estructuras de datos y los solucionadores, pero aún tengo que leer en la malla (archivo de entrada de hasta 4 GB), particionar, crear asignaciones, recorrer los elementos, calcular matrices de rigidez local (elemento), etc. antes de que PETSc pueda ensamblar y resolver . Python no sería más lento para este material no relacionado con PETSc, especialmente E / S, asignaciones y cálculos de nivel de elemento. Porque el resto del código es simple de todos modos.
stali
Los cálculos a nivel de elemento generalmente se pasan como un núcleo (consulte la App.f90fuente en perftest). No hay diferencia de rendimiento en E / S. ¿Has mirado en FEniCS para un paquete de nivel superior?
Aron Ahmadia
Tienes razón. Entiendo la idea, pero en mi caso particular hay muchos de esos núcleos (funciones de forma para diferentes tipos de elementos, cálculos de nivel de elemento, mapeos, etc.) que es aproximadamente el 90% del código. Miré a Fenics hace un tiempo y muchos detalles, como tratar con mallas externas e imponer BC, etc., no estaban del todo claros a primera vista o parecían más complicados (al menos para mí). Además, uso Fortran, que es bastante fácil de usar (dada la excelente documentación de PETSc) para personas que no son CS como yo. De hecho, me resulta más fácil que python :) para mi trabajo.
stali
7

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!

fcruz
fuente