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

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

  • 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 и видеокарту с glmark2OpenGL работает очень хорошо с аппаратным ускорением на моей машине, но у 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)

1 ответ

Решение

Это решение происходит из моего идентичного поста на форуме 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 пакеты появятся в стабильной ветке в не слишком отдаленном будущем.

Другие вопросы по тегам