2011-05-13 34 views
15

¿Cuál es el estado del arte con respecto a obtener numpy para usar núcleos múltiples (en hardware Intel) para cosas como productos vectoriales internos y externos, multiplicaciones de matrices de vectores, etc.?numpy en hardware multinúcleo

Estoy contento de reconstruir numpy si es necesario, pero en este punto estoy buscando formas de acelerar las cosas sin cambiar mi código.

Como referencia, mi show_config() es el siguiente, y nunca he observado numpy utilizar más de un núcleo:

atlas_threads_info: 
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] 
    library_dirs = ['/usr/local/atlas-3.9.16/lib'] 
    language = f77 
    include_dirs = ['/usr/local/atlas-3.9.16/include'] 

blas_opt_info: 
    libraries = ['ptf77blas', 'ptcblas', 'atlas'] 
    library_dirs = ['/usr/local/atlas-3.9.16/lib'] 
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')] 
    language = c 
    include_dirs = ['/usr/local/atlas-3.9.16/include'] 

atlas_blas_threads_info: 
    libraries = ['ptf77blas', 'ptcblas', 'atlas'] 
    library_dirs = ['/usr/local/atlas-3.9.16/lib'] 
    language = c 
    include_dirs = ['/usr/local/atlas-3.9.16/include'] 

lapack_opt_info: 
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] 
    library_dirs = ['/usr/local/atlas-3.9.16/lib'] 
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')] 
    language = f77 
    include_dirs = ['/usr/local/atlas-3.9.16/include'] 

lapack_mkl_info: 
    NOT AVAILABLE 

blas_mkl_info: 
    NOT AVAILABLE 

mkl_info: 
    NOT AVAILABLE 
+4

Dudo que pueda lograr ninguna aceleración mediante el cálculo multiproceso de productos de vectores de tamaño 4000. Tal producto de puntos solo necesita unos microsegundos para computar. La sobrecarga de asignar la tarea a un subproceso diferente probablemente al menos anulará cualquier velocidad que pueda obtener, incluso cuando use grupos de subprocesos. –

+0

Estoy multiplicando matrices de 32M x (4k ... 1.5M) con matrices de (4k ... 1.5M) x algo, y traté de hacerlo usando la caja de herramientas de multiprocesamiento, sin embargo, esto parece crear una gran cantidad de memoria por encima , ya que los datos se copian en nuevos procesos (gracias a GIL por eso). Sería genial si todos los 8 núcleos fueran utilizados por atlas. – Herbert

Respuesta

7

Probablemente debería comenzar por comprobar si el Atlas construir numpy que está utilizando ha sido construido con multi-threading. Puede generar y ejecutar este inspeccionar la configuración del Atlas (directamente desde la AYUDA Atlas):

main() 
/* 
* Compile, link and run with something like: 
* gcc -o xprint_buildinfo -L[ATLAS lib dir] -latlas ; ./xprint_buildinfo 
* if link fails, you are using ATLAS version older than 3.3.6. 
*/ 
{ 
    void ATL_buildinfo(void); 
    ATL_buildinfo(); 
    exit(0); 
} 

Si ha no tiene una versión multiproceso de Atlas: "no es su problema". Si es multiproceso, entonces necesita ejercer una de las rutinas BLAS3 multiproceso (probablemente dgemm), con un producto de matriz matricial adecuadamente grande y ver si se usa el enhebrado. Creo que estoy en lo cierto al decir que ni las rutinas BLAS 2 y BLAS 1 en Atlas admiten multihilo (y con razón porque no hay una ventaja en el rendimiento, excepto en tamaños de problema realmente enormes).

+0

¿Qué es exactamente el comando del compilador? ¿qué debería ser -L [ATLAS lib dir]? – Nino

+0

@Nino: la ruta absoluta hacia donde está instalada la biblioteca atlas .... – talonmies

Cuestiones relacionadas