Resumen del EuroSciPy 2009
Francesc Alted
faltet en pytables.org
Jue Jul 30 11:38:43 CEST 2009
A Thursday 30 July 2009 01:47:24 Pau Freixes escrigué:
> Francesc, perdona si es un poco off topic
No creo que eso sea ningún off-topic. El hecho que no se discuta casi sobre
aplicaciones de cálculo intensivo en python en esta lista no significa que no
se pueda ;-)
> Numexpr utiliza numpy para realizar las operaciones primitivas ? La
> pregunta puede parezer un poco tonta pero me gustaria saber si en este
> codigo
>
> >>> import numpy as np
> >>> import numexpr as ne
> >>> ne.evaluate("a**2 + b**2 + 2*a*b")
>
> En la ejecución de evaluate cuando al final se realiza la multiplicación de
> a**2 es codigo de numpy o numexpr ?
Es código numexpr. La expresión de arriba se compila al vuelo en código
'máquina' específico de numexpr (realmente se usa el compilador de Python para
eso, pero esto no es importante para la discusión).
> Esto me lleva a preguntar, se utiliza optimizacion con uso de instruciones
> vectoriales ? Realiza unrolling internamente ? etc
Si por instrucciones vectoriales te refieres a usar SSE2 (por ejemplo), la
respuesta es que no, al menos no directamente. Sin embargo, como en general
en este tipo de operaciones el cuello de botella está en el acceso a memoria,
el no usar SSE2 no tiene demasiada importancia. Aún así, para las operaciones
que están limitadas por la CPU (como por ejemplo, la evaluación de funciones
transcentes, como el seno, coseno...), se puede enlazar numexpr con la MKL de
Intel para conseguir tiempos de evaluación óptimos (y aquí sí que se usan las
extensiones vectoriales SSEx y multicores, así como aceleraciones basadas en
reducir la precisión de los cálculos; muy completito).
Respecto al unrolling, sí que se efectúa, ya que es el compilador (en este
caso, el estático, sea GCC o MSVC o cualquier otro) quien lo hace. En general
este es un problema resuelto en Numexpr.
> Todo esto te lo pregunto porque tengo que atacar un problema donde tendre
> que manejar matrizes muy grandes y hacer operaciones de multiplicación
> sobre ellas, puedo optar por utilizar numpy i numexpr ? o bien mejor me
> decanto con C directramente y optimizo el ancho de banda a memoria i las
> operaciones por mi mismo ?
Si tienes que usar operaciones sobre matrices *elemento-a-elemento* numexpr va
genial. Sin embargo, las operaciones de álgebra lineal no están soportadas (y
no está claro que se soporten en el futuro), así que si tienes que hacer
cálculo tensorial con las matrices, mejor lo haces con numpy y enlazando con
Atlas, MKL o cualquier otra libreria que disponga de un BLAS o LAPACK
medianamente optimizado (ver ejemplo de multiplicación matricial en mi
presentación del pasado EuroSciPy para ver las aceleraciones que puedes
conseguir).
Y no, no te recomiendo que lo hagas tú directamente en C, porque:
1. Es mucho más complicado
2. No está claro que obtengas mejores prestaciones que con numexpr+numpy+MKL
Saludos,
--
Francesc Alted
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es