Ошибка MatLab: не удается открыть со статическим TLS

82

Через пару дней я постоянно получаю одну и ту же ошибку при использовании MATLAB, которая в какой-то момент случается с dlopen. Я новичок в MATLAB, и поэтому не знаю, что делать. Гугл мне тоже не помогает. Когда я пытаюсь создать собственный вектор, я получаю следующее:

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS

Я также получаю это при умножении:

Error using  * 
BLAS loading error:
dlopen: cannot load any more object with static TLS

Я, конечно, искал решения этой проблемы, но я не слишком много понимаю и не знаю, что делать. Я нашел следующие темы:

  1. Как мне использовать библиотеку BLAS, предоставленную MATLAB?
  2. http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html

Может кто-то мне помочь, пожалуйста?

Примеры вызовов функций, демонстрирующих эту ошибку

>> randn(3,3)

ans =

 2.7694    0.7254   -0.2050             
-1.3499   -0.0631   -0.1241             
 3.0349    0.7147    1.4897            

>> eig(ans)

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Ганс Мейер
источник
Какую ОС вы используете? Можете поделиться исходным кодом?
ztik
Спасибо за ваш ответ. Я использую ubuntu, пример см. Выше
Ханс Мейер

Ответы:

105

Это ошибка № 961964 MATLAB, известная с R2012b (8.0). MATLAB динамически загружает некоторые библиотеки со статическим TLS (локальное хранилище потока, например, см. Флаг компилятора gcc -ftls-model). Загрузка слишком большого количества таких библиотек => места не осталось.

До сих пор единственный обходной путь математической работы - сначала загрузить важные (!) Библиотеки, используя их на раннем этапе (они предлагают помещать «one (10) * ones (10);» в startup.m). Я лучше не буду комментировать эту «стратегию решения».

Начиная с R2013b (8.2.0.701) с Linux x86_64, мой опыт таков: не используйте «doc» (графическая справочная система)! Я думаю, что эта doc-утилита (libxul и т. Д.) Использует много статической памяти TLS.

Вот обновление (31.12.2013)

Все следующие тесты были выполнены с Fedora 20 (с glibc-2.18-11.fc20) и Matlab 8.3.0.73043 (предварительная версия R2014a).

Для получения дополнительной информации о TLS см. Ульрих Дреппер, Обработка ELF для локального хранилища потоков, версия 0.21, 2013 г., в настоящее время доступно в Akkadia и Redhat .

Что именно происходит?

MATLAB динамически (с dlopen) загружает несколько библиотек, которым требуется инициализация tls. Всем этим библиотекам нужен слот в dtv (вектор динамического потока). Поскольку MATLAB загружает несколько из этих библиотек динамически во время выполнения во время компиляции / компоновки, компоновщик (в mathworks) не имел возможности подсчитать необходимые слоты (это важная часть). Теперь задача динамического загрузчика библиотеки - обработать такой случай во время выполнения. Но это непросто. Чтобы процитировать dl-open.c:

Для статического TLS мы должны выделить память здесь и сейчас. Это включает выделение памяти в DTV. Но мы не можем изменить ни один ЦТВ, кроме своего собственного. Так что, если мы не можем гарантировать, что в DTV есть место, мы даже не пытаемся это сделать и не загружаем.

В динамическом загрузчике библиотек glibc есть постоянная времени компиляции (называемая DTV_SURPLUS, см. Glibc-source / sysdeps / generic / ldsodefs.h) для резервирования ряда дополнительных слотов для такого беспорядка (динамическая загрузка библиотек со статическим TLS в многопоточном режиме). программа). В glibc-версии Fedora 20 это значение равно 14.

Вот первые библиотеки (работающие с MATLAB), которым в моем случае потребовались слоты dtv:

matlabroot/bin/glnxa64/libut.so
/lib64/libstdc++.so.6
/lib64/libpthread.so.0
matlabroot/bin/glnxa64/libunwind.so.8
/lib64/libuuid.so.1
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/server/libjvm.so
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libfontmanager.so
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libt2k.so
matlabroot/bin/glnxa64/mkl.so
matlabroot/sys/os/glnxa64/libiomp5.so
/lib64/libasound.so.2
matlabroot/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so
/lib64/libselinux.so.1
/lib64/libpixman-1.so.0
/lib64/libEGL.so.1
/lib64/libGL.so.1
/lib64/libglapi.so.0

Да больше 14 => слишком много => в dtv не осталось слота. Это то, что нам пытается сообщить сообщение об ошибке, особенно mathworks.

Для записи: чтобы не нарушать лицензию MATLAB, я не отлаживал, не декомпилировал и не дизассемблировал какую-либо часть двоичных файлов, поставляемых с MATLAB. Я отлаживал только бесплатные и открытые двоичные файлы glibc Fedora 20, которые MATLAB использовал для динамической загрузки библиотек.

Что можно сделать, чтобы решить эту проблему?

Есть 3 варианта:

(a) Перестройте MATLAB и не загружайте эти библиотеки динамически (с tls-моделью initial-exec), а не связывайтесь с ними (тогда компоновщик может подсчитать необходимые слоты!)

(b) Перестройте эти библиотеки и убедитесь, что они НЕ используют модель tls initial-exec.

(c) Перестройте glibc и увеличьте DTV_SURPLUS в glibc / sysdeps / generic / ldsodefs.h

Очевидно, что варианты (a) и (b) могут быть выполнены только математическими вычислениями.

Для варианта (c) исходный код MATLAB не требуется, поэтому его можно выполнить без математических вычислений.

Какой статус у mathworks?

Я действительно пытался объяснить это «Отделу технической поддержки MathWorks». Но у меня такое впечатление: они меня не понимают. Они закрыли мою заявку в службу поддержки и предложили телефонный (!) Разговор в январе 2014 года с менеджером службы технической поддержки.

Я сделаю все возможное, чтобы объяснить это, но, честно говоря: я не очень уверен.

Обновление (2014/01/10): в настоящее время mathworks пробует вариант (b).

Обновление (2014/03/19): для файла libiomp5.so вы можете загрузить недавно скомпилированную версию (без статического TLS) на сайте mathworks, отчет об ошибке 961964 . А другие библиотеки? Никаких улучшений нет. Так что не удивляйтесь, если вы получите «dlopen: больше невозможно загрузить объект со статическим TLS» с помощью «doc», например, см. Отчет об ошибке 1003952 .

user2898218
источник
Я могу подтвердить это, в моей документации по открытию 64-битной Fedora появится ошибка при загрузке BLAS. То же самое происходит даже после увеличения Java Heap Memory до 1 ГБ (что, я думаю, вполне достаточно).
MeloMCR
Я могу подтвердить эту проблему на openSUSE 13.1 (64 бит) и MATLAB R2013b, см. Здесь: mathworks.com/matlabcentral/newsreader/view_thread/332791 . Пока нет жизнеспособного решения !!!
michal
11
Спасибо за те (10) * те (10); в файле startup.m: на данный момент это решило мою проблему. Кстати, этот баг просто невероятный ...
Danduk82
Я получаю эту ошибку с моими собственными файлами mex (скомпилированными с помощью gfortran). Есть ли способ построить их по-другому, чтобы избежать этой проблемы? Флаги включают -fPIC, который в документации должен использовать global-dynamic, а не initial-exec TLS.
Робинс
Я подтверждаю эту проблему на Ubuntu 12.04 64bit. И замена библиотеки той, что указана в отчете об ошибке, решила проблему. +1
NKN 01
27

Перезапуск Matlab решил проблему для меня.

Вок
источник
Я видел подобное поведение. После первого запуска Matlab выдает указанное выше сообщение об ошибке. После перезапуска ошибка больше не появляется. Ошибка делает снова после второй перезагрузки, и это может повторяться снова и снова. Он периодически появляется снова после первого, третьего, пятого, ... запуска Matlab.
Кристоф
1
Для меня это тоже решило мою проблему. Но спасибо user2898218 за то, что поделился всем этим.
desmond13
Не работал у меня на OpenSuse Leap 42.1 с Matlab R2016b
Самир
6

Короче говоря: в каталоге, из которого вы запускаете Matlab, создайте файл startup.m с содержимым ones(10)*ones(10);. Перезапустите Matlab, и об этом позаботятся.

Мортеза Шахриари Ниа
источник
У меня отлично работает !! Благодаря!
user2230101
5

Насколько я понимаю, это извечная проблема, которую MathWorks еще не решила.

Вот мои два цента, которые у меня сработали (когда я хотел внешние библиотеки IT ++ с MEX).


Пусть библиотека, которую вы нашли причиной проблемы, будет «libXYZ.so», и что вы знаете, где она находится в вашей системе.

Решение состоит в том, чтобы сообщить MATLAB о необходимости загрузки конкретной библиотеки при самом начале ее запуска. Причина этой ошибки, по-видимому, связана с отсутствием слотов для этого thread local storageакаtls цели (из - за них уже были заполнены вверх).

Поскольку последние компиляции внезапно потребовали новую библиотеку, которая не была загружена ранее во время ее запуска, MATLAB выдает эту ошибку.

Жалко, что MATLAB никогда не заботился о решении этой проблемы так долго.

К счастью, решение - это одна очень простая команда терминала.


Типичные шаги на Linux-машине должны быть следующими:

  1. Откройте командную строку (Ctrl+Alt+T в Ubuntu)
  2. Выполните следующую команду

    экспорт LD_PRELOAD = <PATH-TO-libxyz.so>

например: export LD_PRELOAD=/usr/local/lib/libitpp.so

  1. Запустите Matlab с того же терминала

    matlab &

Запуск вашей программы сейчас должен решить проблему, как и в моем случае.

Удачи!


Справка:

[1] http://au.mathworks.com/matlabcentral/answers/125117-openmp-mex-files-static-tls-problem

Любит вероятность
источник
это был обходной путь для меня в совершенно другой обстановке: issues.dlang.org/show_bug.cgi?id=17061
timotheecour
благодаря! единственное решение, которое сработало для меня (и самое простое). Я использую некоторые внешние библиотеки без исходного кода. Самое смешное, что проблема все еще существует в Matlab 2016b ...
foxfireee
4

http://www.mathworks.de/support/bugreports/961964 было обновлено 30.01.2014. К libiomp5. прилагается zip-файл, поэтому я протестировал его на Mageia 4 x86_64 с Matlab R2013b. Теперь я могу использовать документацию Matlab, чтобы открыть демонстрацию без каких-либо проблем.

user3283472
источник
1
Пожалуйста, опубликуйте решение, так как ссылка может в любой момент стать неактивной.
Лакшми
Решение - это файл, подпадающий под лицензию MathWorks. Мы не можем распространять его, и они построили его сами, поэтому нет возможности «опубликовать решение». Кроме этого, у меня это не работает: это должно быть исправлено для R2014b, но я все равно получаю ошибку.
летающая овца
3

У меня была такая же проблема, и я думаю, что просто решил ее.

При установке Matlab используйте выборочную установку (я делал это не в первый раз). Выберите создание символических ссылок на сценарии Matlab в предопределенной папке (/ usr / local / bin). Это помогло мне!

Анна
источник
какие ссылки это создает? Я вручную связал все скрипты без расширения .sh, и ошибка все еще присутствует.
летающая овца
3

У меня была такая же проблема с Matlab 2013b и Matlab 2014a. Исправление, предоставленное mathworks для libiomp5.so, только устранило проблему, когда LAPACK не работал. Однако я не мог использовать внешние библиотеки, использующие OpenMp (например, VL_FEAT): я все еще получаю сообщение об ошибке «dlopen: больше не может загрузить объект со статическим TLS».

Единственное, что у меня сработало, - это переход на Matlab 2012b.

Джаспер Уиджлингс
источник
У вас такая же проблема с загрузкой libmwosgserver.so в Matlab 2014a. Но работал, когда я перешел на Matlab 2013b.
Temak
2

Я столкнулся с этой проблемой после того, как «столбик» (для столбчатых графиков) с массивом дал мне только один синий блок без ошибок. Перезагрузка сначала решила проблему. Но после ошибки памяти (после обработки очень большого файла) я просто не могу обойти эту проблему с синим блоком.

Использование "hist" на входе матрицы вызывает у меня проблему "Ошибка загрузки BLAS" и привело меня к этой теме. Обходной путь Mathwork устранил проблемы с историей и полосой.

Просто хотел показать степень влияния этой ошибки.

Asy
источник
0

У меня была такая же проблема, и я решил ее, увеличив объем памяти Java Heap. Перейдите в «Настройки»> «Общие»> «Память Java-Heap» и увеличьте выделенную память.

Джастин
источник
0

Увеличение памяти кучи Java (до 512 МБ) также помогло мне на R2013b / Ubuntu 12.04. «Ошибка загрузки BLAS» началась, когда я обработал файл размером 11 ГБ (с 16 ГБ ОЗУ), и больше не повторялась после увеличения памяти кучи java и перезапуска Matlab.

Майкл Найт
источник