2011-05-13 7 views
15

Quel est l'état de l'art en ce qui concerne l'utilisation de numpy pour utiliser des coeurs multiples (sur le matériel Intel) pour des choses comme les produits vectoriels intérieurs et extérieurs, les multiplications matricielles vectorielles, etc.?numpy sur le matériel multicœur

Je suis heureux de reconstruire numpy si nécessaire, mais à ce stade, je cherche des moyens d'accélérer les choses sans changer mon code.

Pour référence, mon show_config() est la suivante, et je ne l'ai jamais observé numpy d'utiliser plus d'un noyau:

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

Je doute que vous puissiez obtenir une accélération par le calcul multithread pour des produits scalaires de vecteurs de taille 4000. Un tel produit scalaire ne nécessite que quelques microsecondes à calculer. La surcharge de l'assignation de la tâche à un thread séparé annulera probablement au moins toute la vitesse que vous pourriez gagner, même en utilisant des pools de threads. –

+0

Je multiplie des matrices de 32M x (4k ... 1.5M) par des matrices (4k ... 1.5M) x quelque chose, et j'ai essayé de le faire en utilisant la boîte à outils multiprocessing, néanmoins cela semble créer beaucoup de surcharge de mémoire , car les données sont copiées dans de nouveaux processus (merci le GIL pour cela). Ce serait génial si tous les 8 noyaux étaient utilisés par atlas. – Herbert

Répondre

7

Vous devriez probablement commencer par vérifier si construire l'Atlas que numpy utilise a été construit avec multi-threading. Vous pouvez construire et lancer pour inspecter la configuration Atlas (droite de la FAQ 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 vous avez ne pas avoir une version multithread d'Atlas: « il y a votre problème ». Si elle est multithread, alors vous devez utiliser l'une des routines BLAS3 multithread (probablement dgemm), avec un produit matrix-matrix suffisamment grand et voir si le threading est utilisé. Je pense avoir raison de dire que ni les routines BLAS 2 et BLAS 1 dans Atlas ne supportent le multithreading (et avec raison, car il n'y a pas d'avantage de performance sauf pour des tailles de problèmes vraiment énormes).

+0

Quelle est exactement la commande du compilateur? que devrait -L [ATLAS lib dir] être? – Nino

+0

@Nino: Le chemin absolu vers l'endroit où la bibliothèque de l'atlas est installée .... – talonmies

Questions connexes