我正在尝试构建使用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);
如何使它链接并运行?
答案 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之前声明它,并且可以正常工作