2011-06-01 14 views
19

Estoy a punto de escribir un código Python intensivo en cómputo que seguramente pasará la mayor parte del tiempo dentro de las funciones de álgebra lineal de numpy.numpy y Global Interpreter Lock

El problema en cuestión es embarrassingly parallel. Para resumir, la forma más fácil de aprovechar eso sería mediante el uso de múltiples hilos. La barrera principal seguramente será la Esclusa Global de Intérpretes (GIL).

Para ayudar a diseñar esto, sería útil tener un modelo mental para el que se espera que las operaciones numpy liberen el GIL durante su duración. Con este fin, agradecería cualquier regla general, lo que se debe y no se debe hacer, punteros, etc.

En caso de que importe, estoy usando Python 2.7.1 de 64 bits en Linux, con numpy 1.5.1 y scipy 0.9.0rc2, construido con Intel MKL 10.3.1.

+0

¿Ha considerado usar el ['multiprocessing'] (http://docs.python.org/library/multiprocessing.html) lib en lugar de hilo? Ya no tendrías que preocuparte por GIL. – Jeannot

+0

@Jeannot: lo tengo, gracias. Debido a la naturaleza del problema, el enhebrado es mi primera opción. Si no puedo hacer que funcione, veré las alternativas. – NPE

Respuesta

8

Probablemente encontrará respuestas a todas sus preguntas sobre NumPy y programación paralela en the official wiki.

Además, eche un vistazo a this recipe page - contiene código de ejemplo sobre cómo usar NumPy con múltiples hilos.

+4

He echado un vistazo a la página wiki, y no hay absolutamente ninguna información sobre qué funciones numpy hacen y no lanzo el GIL. – DanielSank

3

¿Vergonzosamente paralelo? Numpy? Parece un buen candidato para PyCUDA o PyOpenCL.

+1

No parece que este sea un problema de GPU bueno ya que cada subproceso hará álgebra lineal. Sin embargo, hay paquetes de álgebra lineal GPU. Un amigo mío ha cumplido recientemente con la versión de LAPACK de ACML-GPU. – kiyo

+0

Theano podría ser una mejor opción para aplicaciones relacionadas con numpy. –

1

Muchas rutinas numpy liberan GIL, por lo que pueden ser paralelas eficientemente en hilos (info). ¡Tal vez no necesites hacer nada especial!

Puede usar this question para determinar si las rutinas que necesita están entre las que publican GIL. En resumen, busque ALLOW_THREADS o nogil en la fuente.

(También tenga en cuenta que MKL tiene la capacidad de utilizar varios hilos para una rutina, por lo que es otra manera fácil de obtener el paralelismo, aunque posiblemente no sea el más rápido).