OpenMP et Python
J'ai de l'expérience dans le codage OpenMP pour les machines à Mémoire Partagée (en C et en FORTRAN) pour effectuer de simples tâches comme la matrice de l'addition, multiplication, etc. (Juste pour voir comment il est en concurrence avec LAPACK). Je sais OpenMP suffisant pour effectuer de simples tâches sans avoir besoin de regarder la documentation.
Récemment, je suis passé à Python pour mes projets, et je n'ai pas d'expérience avec Python au-delà de la base absolue.
Ma question est :
Quel est le plus facile façon d'utiliser OpenMP en Python? Par le plus facile, je veux dire celle qui prend le moins d'effort sur le programmeur côté (même si elle se fait au détriment de l'ajout du système de temps)?
La raison pour laquelle je utiliser OpenMP est parce qu'un numéro de série qui peut être converti à un code parallèle avec un peu de !$OMP
s éparpillés. Le temps requis pour atteindre un rugueux parallélisation est fascinant petit. Est-il possible de reproduire cette fonction en Python?
De parcourir DONC, je peux trouver:
- C extensions
- StackLess Python
- Il plus? Qui s'harmonise le mieux avec ma question?
Vous devez vous connecter pour publier un commentaire.
En raison de GIL, il est inutile d'utiliser des threads de CPU tâches gourmandes en Disponible. Vous avez besoin d'un traitement multiple (exemple) ou utiliser des extensions C de la libération de la GIL lors des calculs par exemple, certaines fonctions de numpy, exemple.
Vous pouvez facilement écrire C extensions que l'utilisation de plusieurs threads dans Cython, exemple.
ctypes
en Python (Régulier)?ctypes
un de vous donner accès à la mémoire partagée dans C. Donc, c'est vraiment utile pour la programmation parallèle, car il permet d'augmenter la vitesse de façon spectaculaire, si vous avez de grandes données entre les processus de partage.multiprocessing
et d'autres modules python ont des méthodes que l'effet de levier de la mémoire partagée à traversctypes
Cython
Cython a OpenMP support: Avec Cython, OpenMP peut être ajouté en utilisant l'
prange
(en parallèle de la gamme) de l'opérateur et de l'ajout de la-fopenmp
directive du compilateur pour setup.py.Lorsque vous travaillez dans un prange strophe, l'exécution est effectuée en parallèle parce que nous désactiver le mondiale interprète de verrouillage (GIL) à l'aide de la
with nogil:
pour spécifier le bloc où le GIL est désactivé.Pour compiler _cython_np.pyx_ nous devons modifier la setup.py script comme indiqué ci-dessous. Nous le disons d'informer le compilateur C pour utiliser
-fopenmp
comme argument lors de la compilation - pour activer OpenMP et de faire le lien avec le OpenMP bibliothèques.Avec Cython est
prange,
nous pouvons choisir différentes approches de planification. Avec statique, la charge de travail est répartie uniformément sur les Processeurs disponibles. Cependant, comme certains de vos calcul régions sont coûteux en temps, tandis que d'autres sont bon marché - si nous demandons Cython pour planifier le travail des morceaux tout aussi à l'aide de statique à travers le Cpu, puis les résultats obtenus pour certaines régions va se terminer plus rapidement que d'autres et ces threads puis assis inactif.À la fois le dynamique et guidée options de planification de tenter d'atténuer ce problème en allouant travailler en petits morceaux de façon dynamique lors de l'exécution, de sorte que les Processeurs sont plus uniformément distribué lorsque la charge de travail du temps de calcul est variable. Ainsi, pour votre code, le bon choix varient selon la nature de votre charge de travail.
Numba
Numba de la version premium, NumbaPro, a un support expérimental d'un
prange
la parallélisation de l'opérateur pour travailler avec OpenMP.Pythran
Pythran (Python-à-compilateur C++ pour un sous-ensemble de Python) peuvent profiter de la vectorisation de possibilités et d'OpenMP à base de parallélisation de possibilités, bien qu'il s'exécute à l'aide de Python 2.7 seulement. Vous spécifiez les sections parallèles à l'aide de
pragma omp
directives (très similaire à Cython est OpenMP décrit ci-dessus), par exemple:PyPy
Le JIT Python compilateur PyPy supporte le multitraitement module (voir ci-après) et a lancé un projet appelé PyPy-STM "un spécial dans la version de développement de PyPy qui peut exécuter plusieurs indépendante gourmandes threads d'un même processus en parallèle".
Note de côté: multitraitement
OpenMP est une interface de bas niveau à plusieurs cœurs. Vous pouvez regarder la
multiprocessing.
Lamultiprocessing
module fonctionne à un niveau supérieur, le partage de Python structures de données, tout en OpenMP travaille avec C des objets primitifs (par exemple, les entiers et les flottants) une fois que vous avez compilé à C. Il n'a de sens que pour utiliser OpenMP si vous êtes à la compilation de votre code; si vous n'êtes pas à la compilation (par exemple, si vous êtes en utilisant efficace numpy code et que vous souhaitez exécuter sur de nombreux cœurs), puis coller avecmultiprocessing
est probablement la bonne approche.Au meilleur de ma connaissance, il n'existe pas de OpenMP paquet Python (et je ne sais pas ce qu'il ferait s'il y avait une). Si vous voulez directement des threads sous votre contrôle, vous devez utiliser l'une des bibliothèques de threading. Cependant, comme souligné par d'autres, le GIL (Global Interprète de Verrouillage) fait du multi-threading en Python pour des performances un peu... eh bien, inutile*. Le GIL signifie qu'un seul thread peut accéder à l'interprète à la fois.
Je suggère de regarder à NumPy/SciPy à la place. NumPy permet d'écrire Matlab-esque de code où vous vous trouvez sur les tableaux et les matrices avec de simples opérations. Il a quelques capacités de traitement parallèle, voyez les SciPy Wiki.
D'autres endroits pour commencer votre recherche:
* Ok, il n'est pas inutile, mais si le temps est consommé à l'extérieur de code Python (comme par un processus externe appelé par l'intermédiaire de
popen
ou quelque chose du genre), les fils ne vont pas acheter quelque chose d'autre que de la commodité.Si vous voulez libérer GIL et utiliser OpenMP ypu pouvez prendre un coup d'oeil à Cython. Il dispose d'un simple parallélisme de certaines tâches courantes. Vous pouvez en lire plus dans Cython la documentation.
Peut-être que votre réponse est en Cython:
"Cython prend en charge native de parallélisme par le biais de la cython.en parallèle du module. Pour utiliser ce type de parallélisme, le GIL doit être libéré (reportez-vous à Libérer le GIL). Il prend actuellement en charge OpenMP, mais plus tard, plus backends peut être pris en charge." Cython Documentation
Il y a un paquet appelé pymp, que l'auteur décrit comme un ensemble qui apporte OpenMP-comme la fonctionnalité de Python. J'ai essayé de l'utiliser, mais avec les différents cas d'utilisation: traitement d'un fichier. Il a travaillé. Je pense que c'est assez simple à utiliser.
Ci-dessous est un échantillon prélevé à partir de la page GitHub:
http://archive.euroscipy.org/talk/6857 "introduit Cython est OpenMP capacités en se concentrant sur des boucles parallèles sur des tableaux NumPy. Le code Source des exemples montrent comment utiliser OpenMP à partir de Python. Résultats des algorithmes parallèles avec OpenMP montrer ce speed-ups peuvent être obtenus pour différentes tailles de données par rapport à d'autres stratégies de parallélisation."