我写了这个测试程序。
#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?
答案 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位整数。这就是问题的原因。