Ошибка MatLab: невозможно открыть со статическим TLS

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

 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 

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

До сих пор единственным способом обхода mathwork является загрузка важных (!) Libs с их ранним использованием (они предлагают поместить «одни» (10) * (10), «в startup.m». Лучше не комментировать эту «страtagsю решения».

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

Вот обновление (2013/12/31)

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

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

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

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

Для статического TLS мы должны выделить память здесь и сейчас. Сюда входит выделение памяти в DTV. Но мы не можем изменить ни одного DTV, кроме нашего. Итак, если мы не можем гарантировать, что в DTV есть место, мы даже не пытаемся это сделать и не нагрузка.

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

Вот первые libs (запущенные 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 использовал для динамической загрузки lib.

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

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

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

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

(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, создайте файл start.m. с содержимым ones(10)*ones(10); , Перезагрузите matlab, и об этом позаботятся.

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

Это, как я нахожу, старую проблему, еще не решенную MathWorks.

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


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

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

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

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

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


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

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

    export LD_PRELOAD =

например: 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

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

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

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

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

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

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

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

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

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

Interesting Posts

Целостность системных файлов Windows 7

Есть ли способ заставить Windows 7 установить .iso на USB-накопитель из OSX?

Использование подстановочных знаков с помощью команды rmdir или rd

Как определить, какая программа вызывает окно, из-за которого возникают проблемы при выходе из системы или завершении работы?

AngularJS: фильтр ng-repeat, когда значение больше, чем

Как я могу использовать Homebrew Python с Homebrew MacVim на Mountain Lion?

Программно создать веб-сайт в IIS с помощью C # и установить номер порта

Амперсанд против плюс для конкатенации строк в VB.NET

Удержание параметров командной строки (цвет, название)

Проверьте, жив ли сайт из приложения C #

Разрешения, восстанавливаемые с Time Machine – копия Finder vs "cp" copy

Запустите Sweave или knitr с объектами из существующей сессии R

Почему мой компьютер колеблется, чтобы включить?

Захват событий мыши / клавиатуры вне формы (приложение работает в фоновом режиме)

Повторно нарисовать на полупрозрачной раме / панели / компоненте.

Давайте будем гением компьютера.