Combien est plus lent petsc4py vs c / c ++ / fortran?
Je me rends compte que cela dépendra considérablement du code exécuté, mais qu'en est-il de quelque chose de simple comme un produit matriciel-vecteur?
Il s'agit d'une préoccupation largement répandue dans la communauté de la programmation scientifique, et je considérerais l'incertitude de performance comme l'un des «mythes» majeurs en science informatique.
Comme discute @fcruz , petsc4py
est un wrapper pour les bibliothèques PETSc, pas une réimplémentation de PETSc en Python. Par conséquent, vous pouvez vous attendre à ce que toute baisse des performances provienne de la copie de tableaux vers et à partir de PETSc, ou de la surcharge dans vos appels de code / fonction de pilote. petsc4py
est très soigneusement mis en œuvre, et tant que vous comprenez lanumpy
interfaces de tableau multidimensionnel, vous pouvez éviter les frais de copie. Pour la majorité des cas d'utilisation dans lesquels je travaille, la pénalité de performance en travaillant en Python est de l'ordre de 10 à 40%, et je gagne souvent substantiellement par d'autres moyens qui compensent largement cette perte de performances. En fait, plusieurs développeurs HPC Python plus expérimentés avec qui j'ai parlé pensent que cette différence de performances peut généralement être encore réduite, et lorsque Python conduit des codes coûteux en calcul, ce sera certainement le cas.
Le petsc4py
référentiel lui-même propose un certain nombre d'exemples utiles pour illustrer le compromis performances / flexibilité. Recherchez dans le petsc4py
référentiel source la démo appelée perftest
, qui résout un système non linéaire d'équations utilisant à la fois un pilote Python et un pilote C (sur un noyau Fortran fourni App.f90
dans ce répertoire). Le surcoût de performance est ici de l'ordre de 10%.
À titre d'exemple concret, je fais partie d'une équipe de scientifiques travaillant sur PyClaw , un progiciel qui s'interface avec PETSc pour la gestion du réseau parallèle et les noyaux Fortran hérités pour résoudre les problèmes de Riemann sur les interfaces cellulaires. Nous avons effectué une étude assez minutieuse de la dégradation des performances due au passage d'un pilote Fortran, et vous pouvez voir les résultats au bas de la page 5 dans le tableau 1 du document de conférence . Dans notre cas, nous avons échangé un peu de performances sur le cœur pour la capacité d'interfacer facilement notre code avec PETSc et Fortran et de fonctionner efficacement en parallèle sur des dizaines de milliers de cœurs.
App.f90
source dansperftest
). Il n'y a aucune différence de performances dans les E / S. Avez-vous consulté FEniCS pour un package de niveau supérieur?Petsc4py est juste une autre façon d'accéder à PETSc mais à partir de python , ou c'est la même chose pour dire que petsc4py fournit les liaisons de sorte que, à partir de python, vous pouvez accéder aux structures de données et routines PETSc qui sont destinées à réduire l'effort de développement de solveurs PDE parallèles (cette échelle).
PETSc fournit plusieurs niveaux d'abstractions à leurs solveurs, et vous pouvez même utiliser PETSc pour implémenter votre propre solveur. Au plus bas niveau d'abstraction logicielle, PETSc utilise BLAS, LAPACK et MPI, et au mieux ce sera aussi rapide que leur mise en œuvre.
Maintenant, pets4py utilise cython pour implémenter les liaisons à PETSc. Les frais généraux liés à l'utilisation du cython dépendent de la quantité de calculs à effectuer à partir de PETSc. Si vous utilisez les solveurs PDE de haut niveau de PETSc, les frais généraux doivent être suffisamment petits pour que vous n'ayez pas à vous en préoccuper.
Une question peut-être plus importante que la comparaison des performances de PETSc vs GEMV est de savoir si PETSc est le bon outil pour votre travail. Si vous avez besoin d'implémenter des solveurs PDE parallèles non triviaux, alors très probablement, PETSc vous aidera vraiment. Cependant, si vous devez faire un tas de GEMV, vous voulez une bibliothèque BLAS. Bonne chance!
la source