将gsl c ++程序与Intel MKL链接

时间:2018-10-25 12:19:44

标签: 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链接时,相同的程序有效。我在这里想念什么吗?如何在gsl上正确使用英特尔MKL?

3 个答案:

答案 0 :(得分:1)

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

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

好像您正在将Intel 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,以保证所有指定的库都将在运行时按要求写入。

答案 1 :(得分:0)

几天前,我遇到了这个确切的问题(GCC 8.2,IMKL 2019.2,GSL 1.15),并通过从MKL 64位接口(ILP)切换到32位接口(LP)设法修复了段错误。我怀疑使用64位接口时,从libgsl调用进入libmkl调用时,参数大小不匹配。本质上,您可以从此更改您的编译/链接命令

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

对此

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

我还要补充一点,如果您不是明确地静态静态链接MKL,那么可能还需要包括Kaveh的答案中的-Wl,--no-as-needed。 (我必须包括它才能在结果二进制文件上运行ldd时显示所有必需的MKL .so文件。)但是,我希望您在运行时遇到“找不到符号”错误唯一的问题就是细分错误。

答案 2 :(得分:0)

libgsl接受32位整数,但是当您使用 -DMKL_ILP64 选项编译并链接到...- lmkl_intel_ ilp64 库时,在这种情况下,您将传递64位整数。这就是问题的原因。