2012-01-25 14 views
104

Jestem builing mojego środowiska numpy/scipy oparte na blas i lapack mniej więcej w oparciu o this przejść.Jak sprawdzić połączenie blas/lapack w numpy/scipy?

Kiedy skończę, jak mogę sprawdzić, czy moje funkcje numpy/scipy naprawdę wykorzystują wcześniej zbudowane funkcje blas/lapack?

+1

Zauważyłem, że nadal jesteś aktywny w Stack Overflow. Patrząc na zaakceptowane i najlepsze odpowiedzi na głosowanie sugeruję, abyś rozważył zaznaczenie górnej głosowanej odpowiedzi jako przyjętej zamiast obecnie akceptowanej :) –

Odpowiedz

26

Co szukasz to: system info

Skompilowałem numpy/scipy z atlasu i mogę to sprawdzić z:

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

Sprawdź dokumentację dla kilku poleceń.

+25

To nie wydaje się pokazywać, czy numpy aktualnie używa ATLAS, tylko czy ATLAS będzie połączony z podczas kolejnej niepotrzebnej kompilacji . Miałem numpy skompilowane przed ATLAS. Pracował bardzo wolno, dopóki nie skompilowałem numpy (pewna rzecz), ale zarówno przed, jak i po ponownej kompilacji sysinfo.get_info ('atlas') pokazano to samo wyjście. Jak sprawdzić aktualny stan rzeczy? – dmytro

+2

Jak interpretować wynik? – EOL

+1

Możesz mieć 'blas' zamiast "atlasu" (dzieje się tak, jeśli instalujesz openblas w dystrybucjach opartych na Debianie). Odpowiedź – Malcolm

11

Ponieważ używa dynamicznie ładowanych wersje, można po prostu to zrobić:

$ ldd anyoftheCmodules.so 

gdzie anyoftheCmodules.so może być, na przykład, numpy/core/_dotblas.so, który prowadzi do libblas.so.

+1

Co jeśli nie ma pliku 'numpy/core/_dotblas.so'? (patrz komentarz pod odpowiedzią ze strony talonmies) – Woltan

+1

Musi tam być tylko pewna liczba plików '.so'. Po prostu wyszukaj w katalogu NumPy (powiedzmy, używając 'find/path/to/numpy -name" * .so "'). Kilka z nich ('_dotblas.so',' lapack_lite.so' na przykład pod prekompilowanym systemem Ubuntu, na przykład) używa BLAS/LAPACK –

+4

['_dotblas.so' już nie istnieje w numpy v1.10 i nowszym] (http : //docs.scipy.org/doc/numpy-dev/release.html#dropped-support), ale możesz sprawdzić powiązanie 'multiarray.so' zamiast: –

7

Możesz użyć narzędzia zależności dla modułu ładującego linki, aby spojrzeć na komponenty haka poziomu C swojej kompilacji i sprawdzić, czy mają one zewnętrzne zależności od twoich blasów i luku do wyboru. Nie jestem w pobliżu pole linux teraz, ale na X maszynie OS można to zrobić wewnątrz katalogu site-packages która posiada instalacje:

$ 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) 

substytut ldd zamiast otool na GNU/Linuksie i powinieneś uzyskać odpowiedzi, których potrzebujesz.

+1

Co zrobić, jeśli nie ma pliku 'numpy/core/_dotblas.so'? (patrz komentarz poniżej odpowiedzi Ricardosa) – Woltan

+0

@Woltan: albo coś jest poważnie zepsute, albo patrzysz w niewłaściwym miejscu. Na każdej instalacji Linuksa i OS X numpy, jaką kiedykolwiek widziałem, pojawi się '_dotblas.so', który jest opakowaniem interfejsu do tego, do czego blas został użyty do zbudowania dystrybucji. W systemie Windows będzie to nazywane '_dotblas.pyd', ale funkcja będzie taka sama. – talonmies

+3

Wygląda na to, że '_dotblas.so' jest budowany tylko wtedy, gdy używasz sekcji' [atlas] 'w' site.cfg' (oraz biblioteki BLAS z włączoną CBLAS).Tak więc powinieneś go używać, nawet jeśli nie używasz ATLAS (z wyjątkiem sytuacji, gdy używasz Intel MKL, który ma dedykowaną sekcję). –

224

Metoda numpy.__config__.show() podaje informacje o sprzężeniu zebranym w czasie kompilacji. Moje wyniki wyglądają tak. Myślę, że to oznacza, że ​​używam BLAS/LAPACK dostarczanego z Mac OS.

>>>import numpy as np 
>>>np.__config__.show() 

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)] 
+2

To pokazuje właściwie to, co chciałem. – astrojuanlu

+17

powinno to być zaakceptowaną odpowiedzią. – Julius

+4

Ze względu na szeroką przydatność, 'numpy .__ config__' powinno być naprawdę publicznym API. Niemniej jednak, ** wygrywasz tę rundę, [davost] (https://stackoverflow.com/users/2877003/davost). ** –