首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Cython调用blas ddot

从Cython调用blas ddot
EN

Stack Overflow用户
提问于 2017-05-30 18:41:18
回答 1查看 829关注 0票数 2

我试图使用Cython使用BLAS库中的点产品,但是当调用编译模块时,会出现以下“未定义符号: cblas_ddot”。执行np.config.show()以查看链接库:

代码语言:javascript
复制
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/lib/libblas.so.3显示: /usr/lib/libblas.so.3.7.0

因此,很明显,BLAS库是链接的,但是找不到cblas_ddot。pyx文件:

代码语言:javascript
复制
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))

编译文件如下所示:导入numpy

代码语言:javascript
复制
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
    )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-01 18:26:04

您只需告诉它将库链接到setup.py中:

代码语言:javascript
复制
Extension( ... # as before
   libraries=[':libcblas.so.3']
  )

确切的库可能在一定程度上取决于您已经安装了什么。首先尝试'cblas',如果失败,请查找您拥有的libcblas文件。请注意,您需要链接到libcblas而不是libblas。

您还可以查找Scipy绑定以节省手工创建这些东西的时间(尽管我认为这些是针对BLAS而不是CBLAS的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44269610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档