Guides sur Python pour la programmation parallèle en mémoire partagée

11

J'ai de l'expérience dans le codage d'OpenMP pour les machines à mémoire partagée (en C et FORTRAN) pour effectuer des tâches simples comme l'ajout de matrice, la multiplication, etc. (Juste pour voir comment il est en concurrence avec LAPACK). Je connais suffisamment OpenMP pour effectuer des tâches simples sans avoir à consulter la documentation.

Récemment, je suis passé à Python pour mes projets et je n'ai aucune expérience avec Python au-delà des bases absolues.

J'ai 2 questions:

  • Existe-t-il un bon guide (PDF en ligne) pour décrire le calcul parallèle en mémoire partagée pour Python?

  • Quelle est la meilleure façon d'y parvenir? J'en ai vu un peu ctypeset je ne sais pas si c'est la meilleure façon. (Au mieux, je veux dire celui qui a un bon compromis entre le temps du programmeur et le temps du système. Il ne devrait pas être trop fastidieux de coder et l'exécution ne devrait pas être lente)

Enquête
la source

Réponses:

8

[Ceci est mon premier message et j'espère que je n'ai pas complètement mal compris l'utilisation de SE - si c'est le cas, je m'excuse à l'avance]

Je suis d'accord avec "bgschaid" qu'il est très difficile de répondre à la question sur la base des informations fournies. Cela fait une énorme différence si vous voulez que les routines de bas niveau exploitent une architecture multicœur ou si vous devez exploiter le parallélisme pour des problèmes embarrassants parallèles - ou quelque chose entre les deux. Un aperçu des différentes possibilités de calcul parallèle en Python peut être trouvé ici .

Dans le premier cas, je recommande à coup sûr d'utiliser des outils tels que NumPy / SciPy qui, au moins dans la version compilée MKL d'Enthought, prend en charge les architectures multicœurs. Ici, vous pouvez contrôler le nombre de cœurs à utiliser via la variable d'environnement "MKL_NUM_THREADS". Cela repose sur des bibliothèques hautement optimisées que nous pouvons difficilement espérer battre en termes de performances. Je pense qu'il est généralement conseillé d'utiliser ces bibliothèques de haute qualité et hautement optimisées dans la mesure du possible.

Si vous souhaitez exploiter le parallélisme à un niveau grossier, le multi -traitement de l' outil standard Python est facile à utiliser - et il prend également en charge les objets de données partagés. Il existe différents outils à utiliser dans le cadre du package de multitraitement . J'ai utilisé map_async (comme SIMD) et apply_async (comme MIMD) pour plusieurs problèmes avec de bons résultats. Le package multiprocessing est assez facile à utiliser et étant une partie standard de Python, vous pouvez vous attendre à ce que d'autres utilisateurs potentiels de votre code puissent facilement l'utiliser. le multitraitement relie également directement aux objets de données NumPy. Lors de l'utilisation du multitraitementJe vous recommande de définir la variable d'environnement "MKL_NUM_THREADS" sur 1 de telle sorte que NumPy ne soit autorisé qu'à un cœur pour chaque processus / travailleur - sinon vous pourriez vous retrouver dans un conflit de ressources entre NumPy parallèle et multiprocessing, ce qui entraîne une dégradation des performances. le multiprocessing fonctionne très bien pour une architecture multi-CPU / multi-core sous le même système d'exploitation. J'ai utilisé le multitraitement sur un ordinateur à mémoire partagée avec 4 processeurs Xeon E7-4850 (10 cœurs chacun) et 512 Go de mémoire et cela fonctionnait extrêmement bien. Les tableaux partagés peuvent être gérés par multiprocessing.Array ou sharedctypes . Vous pouvez trouver la documentation Python ici - consultez lefichier library.pdf . J'ai quelques diapositives expliquant certaines des parties de base de ceci - PM moi si vous les voulez.

Si vous avez une configuration en cluster avec de la mémoire distribuée, je pense que mpi4py est probablement l'outil préféré. Je ne l'ai pas utilisé moi-même mais je sais qu'il est beaucoup utilisé dans la programmation parallèle Python.

Lars1
la source
3

Cela dépend du niveau que vous essayez de programmer en parallèle. Par exemple pour les trucs matriciels / vectoriels, le premier arrêt avec python serait NumPy / SciPy (ils fournissent une interface vers les bibliothèques numériques qui vous donne la pleine vitesse des bibliothèques avec la commodité de Python) et d'après ce qu'ils écrivent sur le parallélisme, il semble que si les bibliothèques sont compilées pour une utilisation parallèle, les programmes profitent des multicœurs pour certaines opérations. (il semble que cet article soit un peu plus ancien, les choses auraient pu s'améliorer entre-temps. Il existe également des liens vers d'autres moyens de programmation parallèle.

Et bien sûr, il y a mpi4py pour programmer directement MPI (inclus dans l'article ci-dessus)

Ma ligne de fond est la suivante: si votre intérêt principal est les opérations vectorielles / matricielles et que le parallélisme est quelque chose dont vous avez "seulement" besoin pour le faire rapidement, alors vous devriez jeter un œil à l'écosystème NumPy / SciPy et seulement si vous ne trouvez pas le des trucs dont vous avez besoin si vous pensez à écrire vos propres bibliothèques

bgschaid
la source