我写了这个测试程序。
#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/