2011-06-01 3 views
19

Je suis sur le point d'écrire du code Python très intensif en calcul qui passera probablement presque tout son temps dans les fonctions d'algèbre linéaire de numpy. Le problème est embarrassingly parallel. Longue histoire courte, la façon la plus facile pour moi de profiter de cela serait d'utiliser plusieurs threads. Le principal obstacle sera certainement le Global Interpreter Lock (GIL).numpy et Global Interpreter Lock

Pour aider à concevoir ceci, il serait utile d'avoir un modèle mental pour lequel numpy opérations peuvent s'attendre à libérer le GIL pour leur durée. À cette fin, j'apprécierais toute règle empirique, dos et ne pas faire, pointeurs etc.

Dans le cas où cela importe, j'utilise Python 2.7.1 64 bits sur Linux, avec numpy 1.5.1 et scipy 0.9.0rc2, construit avec Intel MKL 10.3.1.

+0

Avez-vous envisagé d'utiliser la bibliothèque ['multiprocessing'] (http://docs.python.org/library/multiprocessing.html) au lieu de thread? Vous ne devriez plus vous soucier de GIL. – Jeannot

+0

@Jeannot: Je l'ai, merci. En raison de la nature du problème, le filetage est mon premier choix. Si je ne peux pas le faire fonctionner, je regarderai les alternatives. – NPE

Répondre

8

Vous trouverez probablement des réponses à toutes vos questions concernant la programmation NumPy et parallèle au the official wiki.

Jetez également un oeil à this recipe page - il contient un exemple de code sur la façon d'utiliser NumPy avec plusieurs threads.

+4

J'ai regardé la page wiki, et il n'y a absolument aucune information sur les fonctions numpy qui ne libèrent pas le GIL. – DanielSank

3

Embarrassingly parallèle? Numpy? Cela ressemble à un bon candidat pour PyCUDA ou PyOpenCL.

+1

Cela ne semble pas être un bon problème de GPU car chaque thread va faire de l'algèbre linéaire. Il existe cependant des paquets d'algèbre linéaire GPU. Un de mes amis a récemment respecté scipy en utilisant la version ACAP-GPU de LAPACK. – kiyo

+0

Theano pourrait être un meilleur choix pour les applications liées à Numpy. –

1

Certaines routines numpy libèrent GIL, de sorte qu'elles peuvent être efficacement parallèles dans les threads (info). Peut-être que vous n'avez pas besoin de faire quelque chose de spécial!

Vous pouvez utiliser this question pour déterminer si les routines dont vous avez besoin sont parmi celles qui publient GIL. En bref, recherchez ALLOW_THREADS ou nogil dans la source.

(Notez également que MKL a la possibilité d'utiliser plusieurs threads pour une routine, donc c'est un autre moyen facile d'obtenir le parallélisme, bien que ce ne soit peut-être pas le type le plus rapide).