Hi, I am running into a linking problem when running Torch with JNI. I am not sure if this is the right forum as it might not be directly related to torch but maybe someone might be able to help me:
I have a java program Main.java that has native functions declared which are implemented in torchJNI.cpp and defined in torchJNI.h. Of course, for this to work I also load torchJNI with System.loadLibrary("torchJNI");
This works when I create tensors in the native functions and print them etc. The problem comes, when I do more complex things (loss.backward() and optim.step()). In particular, functions that depend on the MKL shared library where the .so files are in /opt/intel/…/.
I implemented a main function in torchJNI.cpp which does training. When compiling and running the torchJNI.cpp file this all of this works perfectly fine. However, when I make a shared library out of torchJNI.cpp/torchJNI.h which gets loaded with JNI and4 I try to run the native method that “has the exact same code” as the main function I get the following error:
INTEL MKL ERROR: /opt/intel/mkl/lib/intel64/libmkl_vml_avx2.so: undefined symbol: mkl_lapack_dspevd.
Intel MKL FATAL ERROR: cannot load libmkl_vml_avx2.so or libmkl_vml_def.so.
now I though okay I have to do the same thing to load this shared library, so I added the following lines to the java file:
System.loadLibrary("mkl_vml_avx2");
System.loadLibrary("mkl_vml_def");
Now, when I try to run the java file I get:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/intel/mkl/lib/intel64/libmkl_vml_avx2.so: /opt/intel/mkl/lib/intel64/libmkl_vml_avx2.so: undefined symbol: mkl_lapack_dspevd ....
note, that I run Java with -Djava.library.path=:./path/to/torchJNI/:/opt/intel/mkl/lib/intel64
I looked, and both libmkl_vml_avx2.so and libmkl_vml_def.so are present in /opt/intel/mkl/lib/intel64.
To summarize:
-
Everything seems to work fine (compilation and runnning) as long as I stay completely in C++.
-
When I invoke a native function from java that only does simple Torch things that do not require mkl everything also works.
-
When I invoke a native function from java that uses the torch function backward (for example) I get an INTEL MKL ERROR … undefined symbol: mkl_lapack_dspevd
-
Trying to fix 3. I tried loading libmkl_vml_avx2.so or libmkl_vml_def.so. in Java manually then the error messages changes to a java exception.
Can anyone help me out or take a guess what the problem may be?