gpt4 book ai didi

java - 英特尔 MKL 和 JNI : How to add a shared library that ld searches symbols from?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:44 26 4
gpt4 key购买 nike

我正在尝试使用我构建的 C++ 共享库 (libmine.so),并使用 JNI 从 Java 中使用英特尔的 MKL 库。

我还创建了 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,它会起作用,但我正在寻找不那么棘手的方法。NOTE2:修改了示例中的部分路径,去除了个人信息。

最佳答案

JNI 库通过调用 dlopen with RTLD_LOCAL 加载对象(即默认值)。这意味着库的符号不可用于其他 dlopen 调用。如果您在同一进程中使用 RTLD_GLOBALlibmkl_gnu_thread.so 调用 dlopen 一次,它将被注入(inject)到全局范围,其他库(包括那些使用RTLD_LOCAL加载的)可以找到它的符号。

或者,应该可以将 minejni 链接到 libmkl_gnu_thread.so,以便将其加载到相同的搜索范围中。请注意,在某些发行版上,您必须使用 -Wl,--no-as-neeeded 进行链接,以防止优化掉这种依赖性,此时似乎不需要。

关于java - 英特尔 MKL 和 JNI : How to add a shared library that ld searches symbols from?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com