无法在JNI共享库中使用Intel MKL

时间:2019-06-12 06:23:02

标签: java java-native-interface intel-mkl

我正在尝试构建使用Intel MKL进行矩阵乘法的C JNI代码

我的C文件中有

{ multi: true }

我用以下命令编译jni文件:

#include "mkl.h"
...
cblas_dgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans, numRows, numCols, numRows, 1.0, mulMatrix, numRows, first, numCols, 0.0, second, numCols);

我在使用System.loadLibrary时遇到了奇怪的问题,因此在静态初始值设定项中有以下代码:

m082166@mforgehn4 $ icc -mkl -openmp -O3 -fPIC -std=c99 -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux/" -o irl/libjniconverge.so -shared c_src/MyJNICode.c

代码无法运行:

不可克服的错误是这样的:

线程“ main”中的异常java.lang.UnsatisfiedLinkError:/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_avx2.so:/ usr / local / intel-2016 / compilers_and_libraries_2016 .0.109 / linux / mkl / lib / intel64_lin / libmkl_avx2.so:未定义符号:mkl_dft_fft_fix_twiddle_table_32f

帖子here声称由libmkl_core.so提供,但是添加了/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_core.so(24 MB)确实没有解决问题

    String      path = System.getProperty ("jni.library");
    String[]    paths = path.split (":");

    for (String libPath : paths)
        System.load (libPath);

如何使它链接并运行?

2 个答案:

答案 0 :(得分:0)

每当将代码传递给JNI时,您就不再位于JVM内(就java.library.path而言)。这意味着JNI代码加载的任何共享库都将使用系统调用来加载库。

对您来说,这意味着您必须确保所有库都可以通过LD_LIBRARY_PATH可见,也可以使用-rpath链接。

确保libmkl_core.so及其依赖的库

ldd libmkl_core.so

对您的代码可见。

答案 1 :(得分:0)

解决方案是

export LD_PRELOAD = [路径] /libmkl_def.so:[路径] /libmkl_avx2.so:[路径] /libmkl_core.so:[路径] /libmkl_intel_lp64.so:[路径] /libmkl_intel_thread.so:[不同的路径] /libiomp5.so

在运行Java之前声明它,并且可以正常工作