Matlab-Hardware-OpenGL-Fehler unter Ubuntu 16.04.3 - Gemeinsame Ressourcen können nicht initialisiert werden

1694
AndrewCox

Zuerst meine Systeminfo:

  • 4.13.0-26-generisch # 29 ~ 16.04.2-Ubuntu SMP Di Jan 9 22:00:44 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux
  • Saubere Installation von Matlab R2016b (64-Bit)
  • Grafikkarte: AMD / ATI Pitcairn PRO (Radeon HD 7850)

Probleme mit Vanilla Install

Also starte ich Matlab von der Kommandozeile aus ohne Argumente. Ich habe zwei Umgebungsvariablen gesetzt, LIBGL_DEBUG=verboseund MESA_DEBUG=1um ausführliche Fehlerberichte zu erhalten. Die Software startet fehlerfrei. Als Nächstes erteile ich einen einfachen Plotbefehl:

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

Matlab erstellt den Plot erfolgreich, gibt jedoch eine Reihe von Fehlern aus, die besagen, dass ein Grafikfehler auf niedriger Ebene aufgetreten ist. Von der Kommandozeile aus sehe ich folgende Meldungen:

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)) 

Es gibt noch viele weitere, aber das Endergebnis ist dasselbe: Der Linker kann die Grafiktreiber nicht mit libstdc ++ laden. Die Datei Matlab wurde geladen. Um dieses Problem zu beheben, benenne ich die relevanten Bibliotheken um, die mit Matlab geliefert werden, um die Verwendung der Systembibliotheken (einschließlich der Version GLIBCXX_3.4.21) zu erzwingen :

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 

Probleme mit der modifizierten Installation

Nachdem die C ++ - Bibliotheken umbenannt wurden, um Matlab zur Verknüpfung mit den Systembibliotheken zu zwingen, starte ich Matlab neu. Die Umgebungsvariablen sind noch festgelegt, daher sollten alle libgl- oder mesa-Fehler an das Terminal gemeldet werden. Unmittelbar nach dem Start des Programms erhalte ich in Matlab die folgende Fehlermeldung:

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) 

Darüber hinaus werden die folgenden Meldungen in der Terminal-Ausgabe angezeigt:

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 

Diese Meldungen weisen nicht auf Probleme hin. Es sieht so aus, als ob das radeonsi_dri-Objekt erfolgreich geladen wurde. Wenn ich denselben Plotbefehl wie oben ausprobiere, erhalte ich in Matlab die folgende Meldung:

Caught unexpected fl::except::IInternalException 

Die Abbildung zeigt ein leeres Bild; Das Diagramm wurde nicht erstellt.

Weitere Hinweise

  • Ich habe auch versucht, die libgcc_s.so.1Bibliothek im Matlab-Verzeichnis umzubenennen, so dass die Systemversion verwendet wird. Dies ändert jedoch nichts.
  • In meiner Xorg.0.log-Datei sind keine Fehler (EE) vorhanden
  • Ich habe mit OpenGL und der Grafikkarte erfolgreich Benchmarking durchgeführt glmark2, dh, OpenGL läuft sehr gut mit Hardware-Beschleunigung auf meinem Rechner, aber Matlab hat einige Probleme.
  • Matlab R2016b wird mit libGL.so.1.6.0(in R2016b/sys/opengl/lib/glnxa64) ausgeliefert, aber meine Betriebssystemversion ist libGL.so.1.2.0). Könnte dies ein Problem verursachen? Ich habe versucht, die mit Matlab gelieferten libGL-Dateien umzubenennen, um die Verwendung der Systemversionen zu erzwingen, aber die Fehlermeldungen sind immer noch gleich.
  • Mit den modifizierten libstdc ++ - Dateien kann ich Matlab über den Befehl im Software-OpenGL-Modus ausführen matlab -softwareopengl. Plotten funktioniert gut, obwohl Mesa die Warnung / den Fehler ausspuckt,User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)
0

1 Antwort auf die Frage

0
AndrewCox

Diese Lösung stammt aus meinem identischen Beitrag im Matlab-Forum. Wie andere im Matlab-Forum herausgefunden haben, scheint dies ein Fehler in joglBezug auf die Erkennung der Mesa-Treiber durch das Übereinstimmen von "Gallium" in der glRenderer-Zeichenfolge zu sein. Die Mesa-Leute haben anscheinend kürzlich eine Änderung in der Berichterstattung über den Open-Source-Treiber / die Version vorgenommen.

Schritt 1 (unten) muss nur einmal ausgeführt werden, während die Schritte 2, 3, 4 für jede auf Ihrem Computer installierte Version von Matlab ausgeführt werden müssen.

  1. Installieren Sie die libjogl2-Bibliothek mit bleeding-Rand:
#Add Xenial-Vorgeschlagenes Repository (erforderlich ab Feb. 2018) sudo sh -c "echo" deb http://archive.ubuntu.com/ubuntu/ \ Von Xenia vorgeschlagenes eingeschränktes Multiversum-Universum '\ > /etc/apt/sources.list.d/xenial-proposed.list "  sudo apt update -y  # INSTALLIEREN SIE NUR DIE FOLGENDEN von Xenia-vorgeschlagenen! # (Sie möchten nicht ALLE Pakete auf den neuesten Stand bringen) sudo apt install -y libjogl2-java / xenial-vorgeschlagene #includes libjogl2-jni  # ENTFERNEN SIE XENIAL-PROPOSED, um unerwünschte Aktualisierungen an anderen Paketen zu vermeiden sudo rm /etc/apt/sources.list.d/xenial-proposed.list sudo apt update -y 
  1. Umbenennen von C ++ - Standardbibliotheksdateien (wird oben in der Frage wiederholt). Dadurch wird sichergestellt, dass die Grafiktreiber mit der gleichen Standardbibliothek geladen werden, die sie benötigen, und nicht die, mit der Matlab geliefert wird.
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. Ändern Sie die classpath.txtund librarypath.txtDateien in $matlabroot/toolbox/local. Mit meinen ursprünglichen Pfaden erweitert sich dieser Pfad zu/opt/local/MATLAB/R2017b/toolbox/local

    • In classpath.txtfinden und die beiden folgenden Zeilen auf Kommentar:
$ matlabroot / java / jarext / gluegen-rt.jar $ matlabroot / java / jarext / jogl-all.jar 

Und ersetzen Sie sie durch Folgendes

/usr/share/java/jogl2.jar /usr/share/java/gluegen2-rt.jar 
  • In librarypath.txteine neue Zeile am Ende der Datei hinzufügen, mit
/ usr / lib / jni 
  1. Gemäß dem oben angegebenen Originalskript sollte Matlab jetzt fehlerfrei ausgeführt werden. Um sicherzustellen, dass die standardmäßig enthaltenen Bibliotheken nicht stören, benennen Sie die folgenden Bibliotheken in um $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 

Schließlich in $matlabroot/toolbox/local/classpathbenennen Sie die 3p_joglDatei:

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

Und das ist es! Problem gelöst! Hoffentlich werden diese von Xenial vorgeschlagenen Pakete in nicht allzu ferner Zukunft an den stabilen Zweig geliefert.