Efficacité de l'utilisation de petsc4py vs c / c ++ / fortran

11

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?

Andrew Spott
la source

Réponses:

11

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 , petsc4pyest 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. petsc4pyest très soigneusement mis en œuvre, et tant que vous comprenez lanumpyinterfaces 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 petsc4pyréférentiel lui-même propose un certain nombre d'exemples utiles pour illustrer le compromis performances / flexibilité. Recherchez dans le petsc4pyré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.f90dans 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.

Aron Ahmadia
la source
J'ai également une préoccupation similaire avec un petit code non structuré. PETSc ne fournit que les structures de données et les solveurs, mais je dois encore lire le maillage (fichier d'entrée jusqu'à 4 Go), partitionner, créer des mappages, boucler sur les éléments, calculer des matrices de rigidité locales (élément), etc. avant que PETSc puisse assembler et résoudre . Python ne serait pas plus lent pour ce genre de choses non liées à PETSc, spécialement les E / S, les mappages et les calculs au niveau des éléments. Parce que le reste du code est simple de toute façon.
stali
Les calculs au niveau des éléments sont généralement transmis en tant que noyau (voir la App.f90source dans perftest). Il n'y a aucune différence de performances dans les E / S. Avez-vous consulté FEniCS pour un package de niveau supérieur?
Aron Ahmadia
Tu as raison. Je comprends l'idée, mais dans mon cas particulier, il existe de nombreux noyaux (fonctions de forme pour différents types d'éléments, calculs au niveau des éléments, mappages, etc.), ce qui représente environ 90% du code. J'ai regardé Fenics il y a quelque temps et beaucoup de détails tels que les maillages externes et les BC imposants, etc. n'étaient pas très clairs au premier coup d'œil ou semblent plus compliqués (du moins pour moi). En outre, j'utilise Fortran qui est assez simple à utiliser (compte tenu de l'excellente documentation PETSc) pour les non CS comme moi. En fait, je trouve cela plus facile que python :) pour mon travail.
stali
7

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!

fcruz
la source