Intel MKL и JNI: Как добавить общую библиотеку, из которой ld выполняет поиск символов? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать общую библиотеку C ++, которую я создал (libmine.so) и использует библиотеку Intel MKL из Java с использованием JNI.

Я также создал libminejni.so и загрузил ее из кода Javaнапример:

System.loadLibrary("minejni")

Однако не удалось загрузить одну из библиотек MKL (libmkl_avx2.so)

<path_to_lib>/libmkl_avx2.so: <path_to_lib>/libmkl_avx2.so:
undefined symbol: mkl_sparse_optimize_bsr_trsm_i8

Символ определен в libmkl_gnu_thread.so

>nm <path_to_lib>/libmkl_gnu_thread.so | grep mkl_sparse_optimize_bsr_trsm_i8
00000000004fe240 T mkl_sparse_optimize_bsr_trsm_i8

Итак, я загрузил библиотеку, используя System.loadLibrary перед загрузкой проблемной библиотеки, но ошибка не была устранена.

Я выполнил ее с LD_DEBUG=bindings,symbols и обнаружил, что она не выполняет поиск libmkl_gnu_thread.so для символа.

     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/local/workspaces/JDK8-1.0/runtime/jdk1.8/bin/java [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libpthread.so.0 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib/amd64/jli/libjli.so [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libdl.so.2 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libc.so.6 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/jdk1.8/jre/lib/amd64/server/libjvm.so [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libm.so.6 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib/libmkl_avx2.so [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libdl.so.2 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/libc.so.6 [0]
     [java]      11275: symbol=mkl_sparse_optimize_bsr_trsm_i8;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
     [java]      11275: /lib/libmkl_avx2.so: error: symbol lookup error: undefined symbol: mkl_sparse_optimize_bsr_trsm_i8 (fatal)

Библиотека работает, если я создаю исполняемый файл с использованием C ++.Я хотел добавить libmkl_gnu_thread.so в список библиотек, в которых ld будет искать символы, кто-нибудь знает, как это сделать?

ПРИМЕЧАНИЕ. Если я добавлю все библиотеки, относящиеся к MKL, в LD_PRELOAD, это будет работать, но яищу менее хакерский путь.ПРИМЕЧАНИЕ 2. Некоторые пути в примере изменены, чтобы удалить личную информацию.

1 Ответ

0 голосов
/ 14 февраля 2019

Библиотека JNI загружает объекты с помощью вызова dlopen с RTLD_LOCAL (т. Е. По умолчанию).Это означает, что символы библиотеки не становятся доступными для других вызовов dlopen.Если вы вызовете dlopen для libmkl_gnu_thread.so с RTLD_GLOBAL только один раз внутри того же процесса, он попадет в глобальную область, где другие библиотеки (в том числе загруженные с использованием RTLD_LOCAL) смогут найти его символы.

В качестве альтернативы должна быть возможность связать minejni с libmkl_gnu_thread.so, чтобы он загружался в ту же область поиска.Обратите внимание, что в некоторых дистрибутивах вам придется связываться с -Wl,--no-as-neeeded, чтобы предотвратить оптимизацию этой зависимости, которая на данный момент кажется ненужной.

...