Résolution des problèmes d'accélération OpenGL matérielle avec MATLAB sur Linux

Symptôme d'erreur : MATLAB utilise le rendu OpenGL logiciel

Lors du lancement de MATLAB sur un système Linux, en particulier via la ligne de commande avec des options telles que matlab -nodesktop -nosplash, il est fréquent de rencontrer le message suivant, indiquant que l'accélération OpenGL matérielle n'est pas utilisée :

MATLAB is selecting SOFTWARE OPENGL rendering.

Ce message signifie que MATLAB ne parvient pas à utiliser l'accélération graphique matérielle de votre carte graphique et se rabat sur un rendu OpenGL logiciel, ce qui peut impacter les performances, surtout pour les tâches gourmandes en graphisme.

Diagnostic : Conflit de la bibliothèque libstdc++.so

La cause principale de ce comportement réside souvent dans un conflit de versions de la bibliothèque C++ standard, libstdc++.so. MATLAB est livré avec sa propre version de cette bibliothèque, qui peut être plus ancienne que celle installée sur votre système d'exploitation.

Par exemple, si MATLAB inclut une version comme libstdc++.so.6.0.25 :

ls -l $MATLAB_ROOT/sys/os/glnxa64/libstdc++*
# Exemple de sortie :
# -r-xr-xr-x 1 utilisateur utilisateur   45 Nov 15 2020 /chemin/vers/MATLAB_INSTALL/sys/os/glnxa64/libstdc++.so.6 -> libstdc++.so.6.0.25

Et que votre système utilise une version plus récente, comme libstdc++.so.6.0.28 :

ls -l /usr/lib/x86_64-linux-gnu/libstdc++*
# Exemple de sortie :
# lrwxrwxrwx 1 root root   19 Avr 17 10:00 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.28
# -rw-r--r-- 1 root root 1.8M Jan 10  2021 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28

MATLAB tentera d'utiliser sa propre bibliothèque, ce qui peut entraîner des incompatibilités avec les pilotes OpenGL du système, qui attendent la version système.

Solution : Remplacer la bibliothèque MATLAB par un lien symbolique

Pour résoudre ce problème, la méthode la plus efficace consiste à forcer MATLAB à utiliser la version de libstdc++.so fournie par votre système. Ceci peut être réalisé en créant un lien symbolique dans le répertoire de MATLAB, pointant vers la bibliothèque système.

Avant d'effectuer cette modification, il est recommandé de sauvegarder la bibliothèque originale de MATLAB (bien que la création d'un lien symbolique la remplacera simplement sans la supprimer si vous utilisez -f).

Exécutez la commande suivante, en ajustant les chemins en fonction de votre installation MATLAB et de la version de votre bibliothèque système :

sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28 /chemin/vers/MATLAB_INSTALL/sys/os/glnxa64/libstdc++.so.6

  • Remplacez /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28 par le chemin complet vers la version spécifique de votre libstdc++.so système (utilisez ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6 pour trouver le lien réel).
  • Remplacez /chemin/vers/MATLAB_INSTALL par le répertoire d'installation de MATLAB (par exemple, /opt/MATLAB/R2023a ou ~/MatlabR2021a).

Après cette modification, redémarrez MATLAB. Le message d'avertissement concernant le rendu OpenGL logiciel devrait disparaître, et MATLAB devrait utiliser l'accélération matérielle.

Activer l'OpenGL matériel par défaut dans MATLAB

Si le problème persiste ou si vous souhaitez vous assurer que MATLAB utilise toujours le rendu matériel, vous pouvez définir ce comportement par défaut directement depuis l'interface MATLAB :

opengl('save','hardware')

Cette commande enregistrera le paramètre pour qu'il soit appliqué lors des futurs démarrages de MATLAB.

Problème potentiel post-correction : Erreurs GUI avec Java JOGL

Après avoir appliqué la solution ci-dessus, certains utilisateurs peuvent rencontrer de nouvelles erreurs, particulièrement lors de l'ouverture de l'interface graphique (GUI) de MATLAB. Ces erreurs sont souvent liées à Java JOGL (Java OpenGL) et peuvent se manifester comme suit :

com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice[type .x11, connection :0, unitID 0, handle 0x0, owner false, ResourceToolkitLock[obj 0x76ddc7cd, isOwner false, <6876ff80, 5d5c50dc>[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(Thread.java:748)
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

Cette erreur indique un problème d'initialisation des ressources graphiques partagées via X11. Il s'agit souvent d'un problème de compatibilité plus profond entre les versions des pilotes graphiques, les bibliothèques du système et la manière dont MATLAB (via sa pile Java) interagit avec OpenGL. Les solutions pour ce type de problème varient et peuvent inclure des ajustements des variables d'environnement (par exemple, LD_PRELOAD), des mises à jour des pilotes graphiques ou la consultation de ressources communuataires spécifiques à votre distribution Linux et version de MATLAB.

Étiquettes: MATLAB OpenGL Linux libstdc++ Symlink

Publié le 8 juin à 01h31