Ubuntu 16.04.3 上的 Matlab 硬件 OpenGL 失败-无法初始化共享资源

Ubuntu 16.04.3 上的 Matlab 硬件 OpenGL 失败-无法初始化共享资源

首先,我的系统信息:

  • 4.13.0-26-通用#29~16.04.2-Ubuntu SMP 2018 年 1 月 9 日星期二 22:00:44 UTC x86_64 x86_64 x86_64 GNU/Linux
  • Matlab R2016b(64 位)的全新安装
  • 显卡:AMD/ATI Pitcairn PRO (Radeon HD 7850)

Vanilla 安装问题

因此,我从命令行启动 Matlab,不使用任何参数。我设置了两个环境变量LIBGL_DEBUG=verboseMESA_DEBUG=1,以获取任何错误的详细打印输出。软件启动时没有错误。接下来,我发出一个简单的绘图命令:

plot(1,1, 'b*'); grid on;

Matlab 成功创建了绘图,但发出了一系列错误,提示存在低级图形错误。从命令行我看到以下消息:

libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: dlopen /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so failed (/opt/local/MATLAB/R2016b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so))

还有更多,但最终结果是一样的:链接器无法使用 Matlab 已加载的 libstdc++.so 文件加载图形驱动程序。为了解决这个问题,我重命名了 Matlab 附带的相关库,以强制它使用系统库(包括版本GLIBCXX_3.4.21):

cd /opt/local/MATLAB/R2016b/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak

修改安装的问题

重命名 C++ 库以强制 Matlab 链接到系统库后,我重新启动了 Matlab。环境变量仍处于设置状态,因此任何 libgl 或 mesa 错误都应报告给终端。程序启动后,我立即在 Matlab 中收到以下错误:

com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice[type .x11, connection :1, unitID 0, handle 0x0, owner false, ResourceToolkitLock[obj 0x7c1bc33e, isOwner false, <2af5b1a, 46860956>[count 0, qsz 0, owner <NULL>]]]
    at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:326)
at jogamp.opengl.SharedResourceRunner.run(SharedResourceRunner.java:297)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:688)
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:580)
at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:297)
... 2 more
Exception in thread "Startup Class Loader" java.lang.InternalError: XXX0 profile[1]: GL3bc -> profileImpl GL4bc !!! not mapped 
at com.jogamp.opengl.GLProfile.computeProfileMap(GLProfile.java:2047)
at com.jogamp.opengl.GLProfile.initProfilesForDeviceCritical(GLProfile.java:1917)
at com.jogamp.opengl.GLProfile.initProfilesForDevice(GLProfile.java:1866)
at com.jogamp.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1835)
at com.jogamp.opengl.GLProfile.access$000(GLProfile.java:79)
at com.jogamp.opengl.GLProfile$1.run(GLProfile.java:229)
at java.security.AccessController.doPrivileged(Native Method)
at com.jogamp.opengl.GLProfile.initSingleton(GLProfile.java:215)
at com.mathworks.hg.peer.JavaSceneServerPeer.initializeJOGL(JavaSceneServerPeer.java:147)
at com.mathworks.hg.peer.JavaSceneServerPeer.<clinit>(JavaSceneServerPeer.java:117)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.mathworks.mde.desk.StartupClassLoader.loadClass(StartupClassLoader.java:262)
at com.mathworks.mde.desk.StartupClassLoader.access$900(StartupClassLoader.java:25)
at com.mathworks.mde.desk.StartupClassLoader$2.run(StartupClassLoader.java:248)
at java.lang.Thread.run(Unknown Source)

此外,终端输出中还会显示以下消息:

libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: Using DRI3 for screen 0

这些消息并不表示有任何故障;看起来 radeonsi_dri 对象已成功加载。当我尝试与上述相同的绘图命令时,我在 Matlab 中收到以下消息:

Caught unexpected fl::except::IInternalException

图中显示的是空白图像;图尚未创建。

其他说明

  • 我也尝试重命名libgcc_s.so.1Matlab 目录中的库以便它使用系统版本,但这并没有改变任何东西。
  • 我的 Xorg.0.log 文件中没有错误(EE)
  • 我已经成功地对OpenGL和视频卡进行了基准测试glmark2,即OpenGL在我的计算机上通过硬件加速运行得非常好,但Matlab存在一些问题。
  • Matlab R2016b 附带libGL.so.1.6.0(在 中R2016b/sys/opengl/lib/glnxa64),但我的操作系统版本是libGL.so.1.2.0)。这会导致问题吗?我尝试重命名 Matlab 附带的 libGL 文件以强制它使用系统版本,但错误消息仍然相同。
  • 使用修改后的 libstdc++ 文件,我可以通过命令在软件 openGL 模式下运行 Matlab matlab -softwareopengl。绘图工作正常,尽管 Mesa 发出警告/错误,User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)

答案1

这个解决方案源自我的相同的帖子在 Matlab 论坛上。正如 Matlab 论坛中的其他人所发现的,这似乎是与jogl通过 glRenderer 字符串中的“Gallium”字符串匹配来检测 Mesa 驱动程序相关的错误。Mesa 人员显然最近对开源驱动程序/版本的报告方式进行了更改。

步骤 1(如下)只需完成一次,而步骤 2、3、4 必须为您机器上安装的每个版本的 Matlab 完成。

  1. 安装最新的 libjogl2 库:
#添加 Xenial-Proposed 存储库(自 2018 年 2 月起必需)
sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ \
xenial 提出的受限主多元宇宙' \
> /etc/apt/sources.list.d/xenial-proposed.list”

sudo apt 更新-y

# 仅从 xenial-proposed 安装以下内容!
#(你不想将所有软件包都升级到最新版)
sudo apt install -y libjogl2-java/xenial-proposed#包括 libjogl2-jni

# 删除 XENIAL-PROPOSED 以避免对其他软件包进行不必要的更新
sudo rm /etc/apt/sources.list.d/xenial-proposed.list
sudo apt 更新-y
  1. 重命名 C++ 标准库文件(重复上述问题)。这可确保图形驱动程序加载所需的相同标准库,而不是 Matlab 捆绑的标准库。
cd $matlabroot/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak
  1. 更改中的classpath.txt和文件。使用我原来的路径,此路径扩展为librarypath.txt$matlabroot/toolbox/local/opt/local/MATLAB/R2017b/toolbox/local

    • 在 中classpath.txt,找到并注释掉以下两行:
$matlabroot/java/jarext/gluegen-rt.jar
$matlabroot/java/jarext/jogl-all.jar

并将其替换为以下内容

/usr/share/java/jogl2.jar
/usr/share/java/gluegen2-rt.jar
  • librarypath.txt文件末尾添加一个新行
/usr/lib/jni
  1. 根据上面提供的原始脚本,Matlab 现在应该可以正常运行。但是,为了确保默认包含的库不会干扰,请在 中重命名以下库$matlabroot/bin/glnxa64
cd $matlabroot/bin/glnxa64
sudo mv libjogl_desktop.so libjogl_desktop.so.bak
sudo mv libgluegen-rt.so libgluegen-rt.so.bak
sudo mv libnativewindow_awt.so libnativewindow_awt.so.bak
sudo mv libnativewindow_x11.so libnativewindow_x11.so.bak

最后,重$matlabroot/toolbox/local/classpath命名3p_jogl文件:

cd $matlabroot/toolbox/local/classpath
sudo mv 3p_jogl.jcp 3p_jogl.jcp.bak

就这样!问题解决了!希望这些 Xenial-Proposed 软件包能在不久的将来推出到稳定分支。

相关内容