【问题标题】:Linking gsl c++ program with Intel MKL将 gsl c++ 程序与英特尔 MKL 链接
【发布时间】:2019-02-27 21:54:18
【问题描述】:

我写了这个测试程序。

#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?

【问题讨论】:

  • 您是否尝试将其与标准 blas 联系起来?看看here
  • @TheQuantumPhysicist 是的。使用标准 blas 就可以了。

标签: c++ blas gsl intel-mkl


【解决方案1】:

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

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

看起来您正在将英特尔 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,这保证所有指定的库都将在运行时按要求编写。

【讨论】:

    【解决方案2】:

    几天前我遇到了这个确切的问题(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 文件。)但是我希望您在运行时收到“未找到符号”错误,而不是如果这是唯一的问题,则出现分段错误。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        相关资源
        最近更新 更多