Через пару дней я постоянно получаю одну и ту же ошибку при использовании 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
Я, конечно, искал решения этой проблемы, но я не слишком много понимаю и не знаю, что делать. Я нашел следующие темы:
- Как мне использовать библиотеку BLAS, предоставленную MATLAB?
- 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
Ответы:
Это ошибка № 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:
В динамическом загрузчике библиотек 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 .
источник
Перезапуск Matlab решил проблему для меня.
источник
Короче говоря: в каталоге, из которого вы запускаете Matlab, создайте файл startup.m с содержимым
ones(10)*ones(10);
. Перезапустите Matlab, и об этом позаботятся.источник
Насколько я понимаю, это извечная проблема, которую MathWorks еще не решила.
Вот мои два цента, которые у меня сработали (когда я хотел внешние библиотеки IT ++ с MEX).
Пусть библиотека, которую вы нашли причиной проблемы, будет «libXYZ.so», и что вы знаете, где она находится в вашей системе.
Решение состоит в том, чтобы сообщить MATLAB о необходимости загрузки конкретной библиотеки при самом начале ее запуска. Причина этой ошибки, по-видимому, связана с отсутствием слотов для этого
thread local storage
акаtls
цели (из - за них уже были заполнены вверх).Поскольку последние компиляции внезапно потребовали новую библиотеку, которая не была загружена ранее во время ее запуска, MATLAB выдает эту ошибку.
Жалко, что MATLAB никогда не заботился о решении этой проблемы так долго.
К счастью, решение - это одна очень простая команда терминала.
Типичные шаги на Linux-машине должны быть следующими:
Ctrl+Alt+T
в Ubuntu)например:
export LD_PRELOAD=/usr/local/lib/libitpp.so
Запуск вашей программы сейчас должен решить проблему, как и в моем случае.
Удачи!
Справка:
[1] http://au.mathworks.com/matlabcentral/answers/125117-openmp-mex-files-static-tls-problem
источник
http://www.mathworks.de/support/bugreports/961964 было обновлено 30.01.2014. К libiomp5. прилагается zip-файл, поэтому я протестировал его на Mageia 4 x86_64 с Matlab R2013b. Теперь я могу использовать документацию Matlab, чтобы открыть демонстрацию без каких-либо проблем.
источник
У меня была такая же проблема, и я думаю, что просто решил ее.
При установке Matlab используйте выборочную установку (я делал это не в первый раз). Выберите создание символических ссылок на сценарии Matlab в предопределенной папке (/ usr / local / bin). Это помогло мне!
источник
У меня была такая же проблема с Matlab 2013b и Matlab 2014a. Исправление, предоставленное mathworks для libiomp5.so, только устранило проблему, когда LAPACK не работал. Однако я не мог использовать внешние библиотеки, использующие OpenMp (например, VL_FEAT): я все еще получаю сообщение об ошибке «dlopen: больше не может загрузить объект со статическим TLS».
Единственное, что у меня сработало, - это переход на Matlab 2012b.
источник
Я столкнулся с этой проблемой после того, как «столбик» (для столбчатых графиков) с массивом дал мне только один синий блок без ошибок. Перезагрузка сначала решила проблему. Но после ошибки памяти (после обработки очень большого файла) я просто не могу обойти эту проблему с синим блоком.
Использование "hist" на входе матрицы вызывает у меня проблему "Ошибка загрузки BLAS" и привело меня к этой теме. Обходной путь Mathwork устранил проблемы с историей и полосой.
Просто хотел показать степень влияния этой ошибки.
источник
У меня была такая же проблема, и я решил ее, увеличив объем памяти Java Heap. Перейдите в «Настройки»> «Общие»> «Память Java-Heap» и увеличьте выделенную память.
источник
Увеличение памяти кучи Java (до 512 МБ) также помогло мне на R2013b / Ubuntu 12.04. «Ошибка загрузки BLAS» началась, когда я обработал файл размером 11 ГБ (с 16 ГБ ОЗУ), и больше не повторялась после увеличения памяти кучи java и перезапуска Matlab.
источник