2016-05-12 15 views
7

Uso numpy e scipy in ambienti diversi (MacOS, Ubuntu, RedHat). Di solito installo numpy utilizzando il gestore pacchetti disponibile (ad esempio, mac port, apt, yum).Scoprire se/quale libreria BLAS viene utilizzata da Numpy

Tuttavia, se non si compila Numpy manualmente, come si può essere sicuri che utilizzi una libreria BLAS? Utilizzando le porte mac, ATLAS viene installato come dipendenza. Tuttavia, non sono sicuro che sia realmente usato. Quando eseguo un benchmark semplice, la funzione numpy.dot() richiede ca. 2 volte rispetto a un prodotto punto che viene calcolato utilizzando la libreria Eigen C++. Non sono sicuro se questo è un risultato ragionevole ..

Con i migliori saluti, Apo

risposta

16

numpy.show_config() non fornisce sempre informazioni affidabili. Ad esempio, se ho apt-get install python-numpy su Ubuntu 14.04, l'uscita di np.show_config() simile a questo:

Sembra come se numpy sta usando la libreria standard CBLAS. Tuttavia, so per certo che Numpy sta usando OpenBLAS, che ho installato tramite il pacchetto libopenblas-dev.


Il modo più definitivo per controllare * nix è quello di utilizzare ldd per scoprire quali librerie condivise NumPy link contro in fase di esecuzione (non possiedo un Mac, ma penso che si può utilizzare al posto di otool -Lldd).

  • Per le versioni di NumPy età superiore v1.10:

    ~$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so 
    

    Se _dotblas.so non esiste, questo probabilmente significa che NumPy non è riuscito a rilevare eventuali librerie BLAS quando è stato originariamente compilato, nel qual caso semplicemente non costruisce nessuno dei componenti dipendenti da BLAS.

  • Per numpy v1.10 e successivi:

    _dotblas.so has been removed, ma è possibile controllare le dipendenze di multiarray.so invece:

    ~$ ldd /<path_to_site-packages>/numpy/core/multiarray.so 
    

Guardando la versione di NumPy ho installato tramite apt-get:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 
    linux-vdso.so.1 => (0x00007fff12db8000) 
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000) 

/usr/lib/libblas.so.3 è actua l'inizio di una catena di collegamenti simbolici. Se li seguo il loro obiettivo finale utilizzando readlink -e, vedo che puntino alla mia OpenBLAS libreria condivisa:

~$ readlink -e /usr/lib/libblas.so.3 
/usr/lib/openblas-base/libblas.so.3 
+0

Grazie tante, che mi ha aiutato! Infatti, utilizza la libreria libblas standard ... – Apoptose

1

Si vuole controllare numpy.show_config() per vedere che cosa le librerie sono configurati.

2

numpy.show_config() dice solo che le informazioni non sono disponibili sul mio Debian Linux.

Tuttavia/usr/lib/python3/dist-packages/scipy/lib ha una sottodirectory per blas che potrebbe dirti ciò che desideri. Ci sono un paio di programmi di test per BLAS nei test di sottodirectory.

Spero che questo aiuti.

Problemi correlati