138 votes

Comment vérifier la liaison BLAS/LAPACK dans NumPy et SciPy ?

Je suis en train de construire mon environnement numpy/scipy basé sur blas et lapack, plus ou moins basé sur este passer à travers.

Lorsque j'ai terminé, comment puis-je vérifier que mes fonctions numpy/scipy utilisent réellement les fonctionnalités de blas/lapack précédemment construites ?

311voto

davost Points 191

La méthode numpy.show_config() (ou numpy.__config__.show() ) fournit des informations sur les liens rassemblés au moment de la construction. Mon résultat ressemble à ceci. Je pense que cela signifie que j'utilise le BLAS/LAPACK fourni avec Mac OS.

>>> import numpy as np
>>> np.show_config()

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]

4 votes

Compte tenu de son utilité généralisée, numpy.__config__ devrait vraiment être une API publique. Néanmoins, vous gagnez ce tour, davost .

2 votes

Donc, le simple fait que lapack_opt_info est montré signifie que numpy est lié à lapack ?

53 votes

Comment interprétez-vous les résultats ?

30voto

rabra Points 419

Ce que vous cherchez, c'est ça : informations sur le système

J'ai compilé numpy/scipy avec atlas et je peux vérifier cela avec :

import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')

Consultez la documentation pour plus de commandes.

36 votes

Cela ne semble pas indiquer si numpy utilise actuellement ATLAS, mais simplement si ATLAS sera lié lors de la prochaine compilation de numpy. J'avais compilé numpy avant ATLAS. Il a fonctionné très lentement jusqu'à ce que je recompile numpy (chose sûre), mais avant et après la recompilation de numpy, sysinfo.get_info('atlas') a montré la même sortie. Comment vérifier l'état actuel des choses ?

6 votes

Comment interpréter la sortie ?

3 votes

Vous avez peut-être installé 'blas' au lieu de 'atlas' (cela se produit si vous installez openblas sur des distributions basées sur Debian).

11voto

Ricardo Cárdenes Points 4636

Comme il utilise les versions chargées dynamiquement, vous pouvez simplement faire cela :

$ ldd anyoftheCmodules.so

anyoftheCmodules.so pourrait être, par exemple, numpy/core/_dotblas.so qui renvoie à libblas.so .

11voto

talonmies Points 41460

Vous pouvez utiliser l'outil de dépendance du chargeur de liens pour regarder les composants du hook au niveau C de votre construction et voir s'ils ont des dépendances externes sur votre blas et lapack de choix. Je ne suis pas près d'une machine linux pour le moment, mais sur une machine OS X, vous pouvez le faire dans le répertoire site-packages qui contient les installations :

$ otool -L numpy/core/_dotblas.so 
numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)

$ otool -L scipy/linalg/flapack.so 
scipy/linalg/flapack.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

$ otool -L scipy/linalg/fblas.so 
scipy/linalg/fblas.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

substitut ldd à la place de otool sur un système gnu/Linux et vous devriez obtenir les réponses dont vous avez besoin.

1 votes

Et s'il n'y a pas de fichier numpy/core/_dotblas.so ? (voir le commentaire sous la réponse de Ricardo)

0 votes

@Woltan : soit quelque chose est sérieusement cassé, soit vous cherchez au mauvais endroit. Sur toutes les installations de numpy sous Linux et OS X que j'ai pu voir, il y a un fichier _dotblas.so qui est l'interface de l'enveloppe de n'importe quel blas utilisé pour construire la distribution. Sous Windows, il s'appelle _dotblas.pyd mais la fonction est la même.

3 votes

Il semble que _dotblas.so n'est construit que si vous utilisez un [atlas] section dans site.cfg (et une bibliothèque BLAS compatible avec CBLAS). Vous devriez donc l'utiliser, même si vous n'utilisez pas ATLAS (sauf si vous utilisez Intel MKL, qui a une section dédiée).

8voto

M.T Points 1129

Vous pouvez afficher la liaison BLAS, LAPACK, MKL en utilisant show_config() :

import numpy as np
np.show_config()

Ce qui pour moi donne la sortie :

mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X