c++ - 将 gsl c++ 程序与英特尔 MKL 链接

标签 c++ blas gsl intel-mkl

我写了这个测试程序。

#include <gsl/gsl_matrix.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_cblas.h>
#include <gsl/gsl_blas.h>

int main () {
        gsl_vector* v = gsl_vector_calloc(5);
        gsl_matrix* m = gsl_matrix_calloc(5, 5);

        gsl_blas_dgemv(CblasNoTrans, 1.0, m, v, 0.0, v);
}

我使用以下命令编译和链接它。

g++ -g -DMKL_ILP64 mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -lgsl -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm

我在执行 gsl_blas_dgemv 的行遇到段错误。堆栈跟踪看起来像这样:

#0  0x00007fffeeb5db0a in mkl_blas_mc3_xdgemv () from $HOME/intel/mkl/lib/intel64/libmkl_mc3.so
#1  0x00007ffff5b190be in mkl_blas_dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_sequential.so
#2  0x00007ffff70e0b51 in mkl_blas__dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_intel_ilp64.so
#3  0x00007ffff7108054 in cblas_dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_intel_ilp64.so
#4  0x00007ffff7a0cfa4 in gsl_blas_dgemv () from /usr/lib64/libgsl.so.0
#5  0x000000000040086e in main () at mkl.cpp:10

另一方面,当与 open blas 链接时,相同的程序可以工作。我在这里错过了什么吗?如何正确使用 Intel 的 MKL 和 gsl?

最佳答案

请确认您可以按如下方式运行程序:

g++ -g mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/-lgsl -lmkl_intel -lmkl_sequential -lmkl_core -lm

看起来您正在链接具有不同接口(interface)层的英特尔 MKL 库。

下一步将尝试以下操作:

g++ -g -DMKL_ILP64 mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/-Wl, --no-as-needed -lgsl -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm

后者修改您的编译命令以包含 -Wl, --no-as-needed,这保证所有指定的库都将在运行时按要求编写。

关于c++ - 将 gsl c++ 程序与英特尔 MKL 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52989133/

相关文章:

c++ - 向我介绍 boost::exception

c++ - make_pair 命名空间污染

c - 使用 GSL 计算矩阵的克罗内克积的有效方法

c++ - 返回对位域的访问类型

c++ - 检查类型是否是模板的实例化

c++ - cblas_dgemm() 中子矩阵的前导维度参数如何工作?

python - 通过 pyCharm windows 8 安装 scipy 时遇到问题 - 找不到 lapack/blas 资源

python - 将 ATLAS/MKL 链接到已安装的 Numpy

c - 如何在 Linux 中正确安装 gsl 库?

c++ - 将 gsl_ran_hypergeometric_pdf(k, n1, n2, t) 翻译成 boost::math::hypergeometric_distribution