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

Через пару дней я постоянно получаю одну и ту же ошибку при использовании 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

person Hans Meyer    schedule 09.10.2013    source источник
comment
Какую ОС вы используете? Можете поделиться исходным кодом?   -  person ztik    schedule 09.10.2013
comment
Спасибо за ваш ответ. Я использую ubuntu, пример см. Выше   -  person Hans Meyer    schedule 09.10.2013


Ответы (10)


Это ошибка № 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. Но мы не можем изменить ни один ЦТВ, кроме своего собственного. Итак, если мы не можем гарантировать, что в ЦТВ есть место, мы даже не пытаемся это сделать и не загружаем.

В динамическом загрузчике библиотек 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-моделью начального выполнения), а не связывайтесь с ними (тогда компоновщик может подсчитать требуемые слоты!)

(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.

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

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

person Wok    schedule 13.01.2014
comment
Я видел подобное поведение. После первого запуска Matlab выдает указанное выше сообщение об ошибке. После перезапуска ошибка больше не появляется. Ошибка действительно появляется снова после второго перезапуска, и это может повторяться снова и снова. Он периодически появляется снова после первого, третьего, пятого, ... запуска Matlab. - person Christoph; 20.05.2014
comment
Для меня это тоже решило мою проблему. Но благодарю пользователя 2898218 за то, что поделился всем этим. - person desmond13; 28.04.2015
comment
Не работал у меня на OpenSuse Leap 42.1 с Matlab R2016b - person Sameer; 20.12.2016

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

person Morteza Shahriari Nia    schedule 02.07.2014
comment
У меня отлично работает !! Спасибо! - person user2230101; 17.08.2015

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

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


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

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

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

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

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


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

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

e.g.: export LD_PRELOAD=/usr/local/lib/libitpp.so

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

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

Удачи!


Ссылка:

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

person Loves Probability    schedule 21.04.2016
comment
это был обходной путь для меня в совершенно другой обстановке: issues.dlang.org/show_bug. cgi? id = 17061 - person timotheecour; 05.01.2017
comment
Благодарность! единственное решение, которое сработало для меня (и самое простое). Я использую некоторые внешние библиотеки без исходного кода. Самое смешное, что проблема все еще существует в Matlab 2016b ... - person foxfireee; 10.01.2017

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

person BertRAMAert    schedule 11.02.2014
comment
Пожалуйста, опубликуйте решение, так как ссылка может в любой момент стать неактивной. - person Lakshmi; 11.02.2014
comment
решение - это файл, подпадающий под лицензию MathWorks. Мы не можем распространять его, и они построили его сами, поэтому нет возможности «опубликовать решение». Кроме этого, у меня это не работает: это должно быть исправлено для R2014b, но я все равно получаю сообщение об ошибке. - person flying sheep; 11.02.2015

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

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

person Anna    schedule 16.10.2013
comment
какие ссылки это создает? Я вручную связал туда все скрипты без расширения .sh, и ошибка все еще присутствует. - person flying sheep; 12.12.2013

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

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

person Jasper Uijlings    schedule 24.04.2014
comment
У вас такая же проблема с загрузкой libmwosgserver.so в Matlab 2014a. Но сработало, когда я перешел на Matlab 2013b. - person Temak; 27.10.2015

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

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

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

person Asy    schedule 08.05.2014

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

person Justin    schedule 13.11.2013

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

person Michael Knight    schedule 22.05.2014