【问题标题】:Linking Anaconda MKL to C++/Cython program将 Anaconda MKL 链接到 C++/Cython 程序
【发布时间】:2015-10-18 11:05:58
【问题描述】:

我正在尝试编译 Cython 程序,但尝试链接 LAPACK 和 BLAS 时出现错误(它找不到库)。我有 Anaconda Accelerate,它会自动将 MKL 链接到 NumPy,所以我尝试复制 NumPy 的链接。

>>> import numpy as np
>>> np.show_config()
mkl_info:
    include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
    define_macros = [('SCIPY_MKL_H', None)]
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
blas_mkl_info:
    include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
    define_macros = [('SCIPY_MKL_H', None)]
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
lapack_mkl_info:
    include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
    define_macros = [('SCIPY_MKL_H', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
blas_opt_info:
    include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
    define_macros = [('SCIPY_MKL_H', None)]
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
openblas_lapack_info:
  NOT AVAILABLE
lapack_opt_info:
    include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
    define_macros = [('SCIPY_MKL_H', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']

这是我的setup.py 文件

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import numpy as np
import os

setup(
    author = "Rohan Pandit",
    url='https://www.github.com/rohanp/LDFMap',
    ext_modules = cythonize([Extension("LDFMap",
                            sources = ["LDFMap.pyx"],
                            include_dirs = [np.get_include(), "/home/ubuntu/LDFMap/src/include", "/home/ubuntu/miniconda3/envs/LDFMap/include"],
                            language="c++",
                            libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'],
                            library_dirs = ["/home/ubuntu/LDFMap/src/include", '/home/ubuntu/miniconda3/envs/LDFMap/lib'],
                            extra_compile_args = ["-I /home/ubuntu/LDFMap/src/include", "-I /usr/local/include"],
                                        )])

        )

这是我的错误信息: (为了便于阅读,我添加了换行符)

g++ -pthread -shared -L/home/ubuntu/miniconda3/envs/LDFMap/lib -Wl,  
-rpath=/home/ubuntu/miniconda3/envs/LDFMap/lib,--no-as-needed 
build/temp.linux-x86_64-3.4/LDFMap.o -L/home/ubuntu/LDFMap/src/include
-L/home/ubuntu/miniconda3/envs/LDFMap/lib -
L/home/ubuntu/miniconda3/envs/LDFMap/lib -lmkl_lapack95_lp64 - 
lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread - 
lpython3.4m -o /home/ubuntu/LDFMap/src/LDFMap.cpython-34m.so 

/usr/bin/ld: cannot find -lmkl_lapack95_lp64

我不明白的是,如果此链接适用于 NumPy,为什么它不适用于我的程序?

【问题讨论】:

    标签: python c++ numpy cython distutils


    【解决方案1】:

    为您的安装明确指定包含路径和 BLAS/LAPACK 库将导致非常依赖于平台且难以维护的模块。

    您应该做的是使用 scipy 获取指向您需要的 LAPACK 函数的指针,如 post 中所述(特别是第一个链接中的 gist)。这样,如果 Scipy 与 MKL 一起安装,您的 Cython 程序也将自动使用 MKL BLAS/LAPACK。

    【讨论】:

    • 我试过from scipy.linalg.cython_lapack cimport dgesvd,(我使用的C++头文件需要dgesvd),但我仍然得到一个错误:Symbol not found: _dgesvd_(我试过......cimport dgesvd as _dgesvd_和...cimport dgesvd as dgesvd_)
    • 我使用的是 scipy-0.16。错误不是在编译时发生,而是在运行时发生。这可能与我在使用 cdef extern 导入的外部 C++ 函数中调用 dgesvd 的事实有关吗?
    • 你知道如何将anaconda中的mkl库与C++代码链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多