Я пытаюсь создать код C JNI, который использует Intel MKL для умножения матриц
В моем файле C у меня есть
#include "mkl.h"
...
cblas_dgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans, numRows, numCols, numRows, 1.0, mulMatrix, numRows, first, numCols, 0.0, second, numCols);
Я компилирую файл jni с:
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
У меня были странные проблемы с System.loadLibrary, поэтому у меня есть следующий код в статическом инициализаторе:
String path = System.getProperty ("jni.library");
String[] paths = path.split (":");
for (String libPath : paths)
System.load (libPath);
Код не запускается:
Непреодолимая ошибка такова:
Исключительная ситуация в потоке "main" .0.109 / linux / mkl / lib / intel64_lin / libmkl_avx2.so: неопределенный символ: mkl_dft_fft_fix_twiddle_table_32f
В сообщении здесь утверждается, что он предоставлен libmkl_core.so, но добавляется /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_core.so (24 МБ) ) не решает проблему
$ java -Djni.library="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so:/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so:/home/mayo/m082166/irl/libjniconverge.so" -jar MyJava-jar-with-dependencies.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so: /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so: undefined symbol: mkl_dft_fft_fix_twiddle_table_32f
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at MyJava.<clinit>(MyJava.java:77)
$ java -Djni.library="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so:/home/mayo/m082166/irl/libjniconverge.so" -jar MyJava-jar-with-dependencies.jar
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
$ export LD_LIBRARY_PATH=/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin
$ java -Djni.library="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so:/home/mayo/m082166/irl/libjniconverge.so" -jar MyJava-jar-with-dependencies.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so: libintlc.so.5: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at MyJava.<clinit>(MyJava.java:77)
$ find /usr/local/intel-2016 -name libintlc.so
/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libintlc.so
/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/ia32_lin/libintlc.so
/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin_mic/libintlc.so
$ export LD_LIBRARY_PATH="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin:/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin"
$ java -Djni.library="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so:/home/mayo/m082166/irl/libjniconverge.so" -jar MyJava-jar-with-dependencies.jar
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
$ find /usr/local/intel-2016 -name libmkl_def.so
/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so
$ echo $LD_LIBRARY_PATH
/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin:/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin
$ java -Djni.library="/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so:/usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64_lin/libimf.so:/home/mayo/m082166/irl/libjniconverge.so" -jar MyJava-jar-with-dependencies.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so: /usr/local/intel-2016/compilers_and_libraries_2016.0.109/linux/mkl/lib/intel64_lin/libmkl_def.so: undefined symbol: mkl_dft_fft_fix_twiddle_table_32f
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at MyJava.<clinit>(MyJava.java:77)
Как мне получить эту ссылку и запустить?