将gsl c++程序与"英特尔MKL"链接
Linking gsl c++ program with 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
另一方面,当与openblas链接时,相同的程序也能工作。我是不是遗漏了什么?如何将英特尔MKL与gsl一起正确使用?
请确认您可以按如下方式运行程序:
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
,这保证了所有指定的库都将在运行时根据需要编写。
几天前我遇到了这个确切的问题(GCC 8.2、IMKL 2019.2、GSL 1.15(,并通过从MKL 64位接口(ILP(切换到32位接口(LP(来修复segfault。我怀疑在使用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文件。(然而,如果这是唯一的问题,我希望您在运行时会得到"未找到符号"错误,而不是分段错误。
libgsl接受32位整数,但当您使用-DMKL_ILP64选项进行编译并链接时-lmkl_intel_ilp64库,在这种情况下传递64位整数。这就是问题的原因。
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 将gsl c++程序与"英特尔MKL"链接
- 使用英特尔 PIN 修改寄存器
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 将"-01"替换为"-02" 英特尔编译器选项会导致 FPE 在较小的 for 循环行程计数中抛出
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何要求 macports 用英特尔编译器包装 openmpi?
- 实施英特尔实感和 SDL2 时出现问题
- OpenGL 片段着色器未在英特尔 HD 4000 显卡上编译
- 英特尔将指令存储在重叠的内存区域
- 如何指示 CMAKE 在 Visual Studio 中使用英特尔 MKL
- 使用英特尔内部函数 (AVX) 中的混合说明
- 英特尔 PIN:如何查看推测性指令?
- 我正在尝试解决英特尔架构并行基础课程中关于 Coursera 的一项作业
- 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- 如果由不同的线程写入 8 字节,那么现代英特尔 x86 上的 8 字节读取是否保证理智?
- 英特尔汇编与内部函数,AVX