2017-05-30 13 views
2

Cythonを使用してBLASライブラリからドットプロダクトを使用しようとしていますが、コンパイルされたモジュールが呼び出されると、次のトレースバック "未定義シンボル:cblas_ddot"が表示されます。 npを実行しています。Cythonからblas ddotを呼び出す

lapack_info: 
     libraries = ['lapack', 'lapack'] 
     library_dirs = ['/usr/lib64'] 
     language = f77 

lapack_info: 
    libraries = ['lapack', 'lapack'] 
    library_dirs = ['/usr/lib64'] 
    language = f77 

openblas_lapack_info: 
    NOT AVAILABLE 

blas_info: 
    libraries = ['cblas', 'blas'] 
    library_dirs = ['/usr/lib64'] 
    define_macros = [('HAVE_CBLAS', None)] 
    language = c 

atlas_3_10_blas_threads_info: 
    NOT AVAILABLE 

atlas_threads_info: 
    NOT AVAILABLE 

atlas_3_10_threads_info: 
    NOT AVAILABLE 

atlas_blas_info: 
    NOT AVAILABLE 

atlas_3_10_blas_info: 
    NOT AVAILABLE 

atlas_blas_threads_info: 
    NOT AVAILABLE 

openblas_info: 
    NOT AVAILABLE 

blas_mkl_info: 
    NOT AVAILABLE 

blas_opt_info: 
    libraries = ['cblas', 'blas'] 
    library_dirs = ['/usr/lib64'] 
    language = c 
    define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)] 

blis_info: 
    NOT AVAILABLE 

atlas_info: 
    NOT AVAILABLE 
atlas_3_10_info: 
    NOT AVAILABLE 

lapack_mkl_info: 
    NOT AVAILABLE 

及びLDDの/usr/lib/python2.7/site-packages/numpy/core/multiarray.soとREADLINK -eは/ usr /:リンクされたライブラリを参照するには設定 .SHOW() lib/libblas.so.3は次を示します: /usr/lib/libblas.so.3.7.0

明らかに、BLASライブラリはリンクされていますが、cblas_ddotは見つかりません。 PYXファイル:

import numpy as np 
cimport numpy as np 

cdef extern from "cblas.h": 
    double ddot "cblas_ddot"(int N, 
          double *X, int incX, 
          double *Y, int incY) 

ctypedef np.float64_t dtype_t 
def matmul(np.ndarray[dtype_t, ndim=2] A, 
      np.ndarray[dtype_t, ndim=2] B): 
    cdef Py_ssize_t i, j 
    cdef np.ndarray[dtype_t,ndim=2] out = np.zeros((A.shape[0],B.shape[1])) 
    cdef np.ndarray[dtype_t, ndim=1] A_row, B_col 
    for i in range(A.shape[0]): 
     A_row = A[i,:] 
     for j in range(B.shape[1]): 
      B_col = B[:, j] 
      out[i,j] = ddot(
       A_row.shape[0], 
       <dtype_t*>A_row.data, 
       A_row.strides[0] // sizeof(dtype_t), 
       <dtype_t*>B_col.data, 
       B_col.strides[0] // sizeof(dtype_t)) 

コンパイルするファイルは次のようになります。あなただけのsetup.pyでライブラリをリンクすることを指示する必要があり 輸入numpyの

if __name__ == '__main__': 

    from distutils.core import setup 
    from distutils.extension import Extension 
    from Cython.Distutils import build_ext 


    # The Cython modules to setup 
    ext_modules = [ 
     Extension('matmul', ['matmul.pyx'], include_dirs= 
     [numpy.get_include()]) 
    ] 

    # Run the setup command 
    setup(
     cmdclass = {'build_ext': build_ext}, 
     ext_modules = ext_modules 
    ) 
+1

コンパイル方法を表示できますか? – DavidW

+0

はい、あなたの投稿はコンパイルコマンドで更新されました –

答えて

0

Extension(... # as before 
    libraries=[':libcblas.so.3'] 
) 

正確なライブラリは、インストールしたものに少し依存するかもしれません。最初に'cblas'を試してください。失敗した場合は、あなたが持っているlibcblasファイルを調べてください。 libblasではなくlibcblasにリンクする必要があることに注意してください。

Scipy BLAS Cython bindingsを参照すると、時間を節約できます(これらはCBLASではなくBLAS用ですが)。

関連する問題