URL: https://linuxfr.org/users/serge_ss_paille/journaux/pyth-on-ran-openmp Title: Pyth(on|ran) + OpenMP ? Authors: serge_sans_paille Date: 2012年08月07日T10:20:53+02:00 License: CC By-SA Tags: python et calcul_parallèle Score: 20 Youpi [le monde est beau] Vous n'êtes pas sans savoir que le parallélisme en mémoire partagé et [python](http://fr.wikipedia.org/wiki/python "Définition Wikipédia"), c'est pas la joie. La faute à ce cher [Gil](http://wiki.python.org/moin/GlobalInterpreterLock)les qui bride complètement le parallélisme. Les solutions alternatives se basent donc sur des processus lourds, comme inventorié dans cette excellente [page](http://wiki.python.org/moin/Concurrency). Personnellement, j'aime bien utiliser les directives [OpenMP](http://fr.wikipedia.org/wiki/OpenMP "Définition Wikipédia") pour paralléliser des applications natives. C'est concis, incrémental et non-intrusif. Heureux papa du projet [pythran](https://github.com/serge-sans-paille/pythran), qui permet justement de traduire un module python (écrit dans un sous-ensemble certes fortement diminué de python) en module natif, je me dis :> mais pourquoi ne pas annoter le code python et propager ses annotations dans le source ?> -- /me Alors là, souci, pas de moyen d'annoter des instructions en python, mais seulement des fonctions (les fameux `@look.at.me`). Un moyen non-intrusif serait de se contenter de chaînes de caractères du style : ```python def saxpy(x,y,a): 'omp parallel for private(i,b)' for i in range(len(x)): b = a* x[i] # laid mais utile pour l'exemple y[i]+= b ``` Ça ne me semble pas trop degueu, mais peut-être que les linuxfriens ont un avis sur la question ? En particulier, je m'interroge sur ce `private(i,b)`. Comme en python la portée d'une variable est complètement décorrélée de la notion de bloc (la variable existe depuis sa définition jusque la fin de la fonction), on ne peut pas considérer que les variables définies sont « locales » (bien qu'on puisse parfois le prouver). Ça donne des clauses OpenMP un peu plus verbeuses... Un autre point, toujours lié à la notion de bloc : ```python def fibo(n): if n < 2 : return n else: 'omp task default(none) shared(x,n)' # (1) x = fibo(n-1) # (2) y = fibo(n-2) # (3) 'omp task wait' # (4) return x+y # (5) ``` la clause `(1)` est attachée à `(2)` et `(4)` est attachée à `(5)`, mais si on avait voulu attacher une clause à tout un bloc, il aurait fallu créer un bloc, par exemple en utilisant : ```python ... 'omp task default(none) shared(x,n)' if True: instruction0 instruction1 instruction2 ... ``` C'est tout laid, mais je ne vois pas bien comment faire autrement. Ô Toi, Pythie, apporte moi conseil !