Аппаратный сбой Matlab OpenGL в Ubuntu 16.04.3 - не удается инициализировать общие ресурсы

1607
AndrewCox

Во-первых, моя системная информация:

  • 4.13.0-26-generic # 29 ~ 16.04.2-Ubuntu SMP Вт 9 января 22:00:44 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux
  • Чистая установка Matlab R2016b (64-битная)
  • Видеокарта: AMD / ATI Pitcairn PRO (Radeon HD 7850)

Проблемы с установкой Vanilla

Итак, я запускаю Matlab из командной строки без аргументов. Я установил две переменные среды, LIBGL_DEBUG=verboseи MESA_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)) 

Их намного больше, но конечный результат тот же: компоновщик не может загрузить графические драйверы с помощью libstdc ++., Поэтому файл Matlab уже загружен. Чтобы исправить эту проблему, я переименую соответствующие библиотеки, которые поставляются с 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.1библиотеку в каталоге Matlab, чтобы она использовала системную версию, но это ничего не меняет.
  • В моем файле Xorg.0.log нет ошибок (EE)
  • Я успешно провел тестирование OpenGL и видеокарты glmark2, то есть OpenGL работает очень хорошо с аппаратным ускорением на моей машине, но у Matlab есть некоторые проблемы.
  • Matlab R2016b поставляется с libGL.so.1.6.0R2016b/sys/opengl/lib/glnxa64), но моя версия ОС есть libGL.so.1.2.0). Может ли это вызвать проблемы? Я попытался переименовать файлы libGL, поставляемые с Matlab, чтобы заставить его использовать системные версии, но сообщения об ошибках все те же.
  • С измененными файлами libstdc ++ я могу запустить Matlab в программном режиме openGL с помощью команды matlab -softwareopengl. График работает нормально, хотя Mesa выдает предупреждение / ошибку,User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)
0

1 ответ на вопрос

0
AndrewCox

Это решение происходит из моего идентичного поста на форуме Matlab. Как выяснили другие на форуме Matlab, это, похоже, ошибка в joglобнаружении драйверов Mesa по совпадению строк для «Gallium» в строке glRenderer. Люди из Mesa, по-видимому, недавно внесли изменения в то, как сообщается о драйвере / версии с открытым исходным кодом.

Шаг 1 (ниже) необходимо выполнить только один раз, а шаги 2, 3, 4 - для каждой версии Matlab, установленной на вашем компьютере.

  1. Установите новейшую библиотеку libjogl2:
#Добавить Xenial-Proposed репозиторий (необходимо с февраля 2018 г.) sudo sh -c "echo" deb http://archive.ubuntu.com/ubuntu/ \ предложенная xenial ограниченная главная мультивселенная вселенная > /etc/apt/sources.list.d/xenial-proposed.list "  sudo apt update -y  # УСТАНАВЛИВАЙТЕ ТОЛЬКО СЛЕДУЮЩУЮ из предложенного xenial! # (вы не хотите обновлять ВСЕ ваши пакеты до совершенства) sudo apt install -y libjogl2-java / xenial-предлагаемый #includes libjogl2-jni  # REMOVE XENIAL-PROPOSED, чтобы избежать нежелательных обновлений других пакетов sudo rm /etc/apt/sources.list.d/xenial-proposed.list sudo apt update -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 / Библиотека / 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 появятся в стабильной ветке в недалеком будущем.