Помилка MatLab: не вдається відкрити за допомогою статичного TLS


82

З пару днів, я постійно отримувати ту ж помилку , в той час як з допомогою 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

Які ОС ви використовуєте? Чи можете ви поділитися вихідним кодом?
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 Prerelease).

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

Що саме відбувається?

MATLAB динамічно (з dlopen) завантажує кілька бібліотек, які потребують tls-ініціалізації. Для всіх цих бібліотек потрібен слот у dtv (динамічний вектор потоку). Оскільки MATLAB динамічно завантажує кілька цих бібліотек під час виконання під час компіляції / посилання, компонувальник (у mathworks) не мав шансів підрахувати потрібні слоти (це важлива частина). Тепер завдання динамічного навантажувача бібліотек вирішити такий випадок під час виконання. Але це непросто. Щоб процитувати dl-open.c:

Для статичного TLS ми повинні виділити пам'ять тут і зараз. Сюди входить виділення пам'яті в DTV. Але ми не можемо змінити будь-який DTV, крім нашого. Отже, якщо ми не можемо гарантувати, що в DTV є місце, ми навіть не пробуємо і не справляємо завантаження.

Існує константа часу компіляції (DTV_SURPLUS, див. Glibc-source / sysdeps / generic / ldsodefs.h) в динамічному навантажувачі бібліотек glibc для резервування ряду додаткових слотів для такого безладу (динамічне завантаження бібліотек із статичним 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 і не завантажуйте динамічно ці бібліотеки (з початковою-exec tls-моделлю) замість цього посилання на них (тоді компонувальник може порахувати необхідні слоти!)

(b) Відновіть ці бібліотеки та переконайтеся, що вони НЕ використовують модель початкового виконання.

(c) Відновіть glibc та збільште DTV_SURPLUS у glibc / sysdeps / generic / ldsodefs.h

Очевидно, що варіанти (а) та (b) можуть бути виконані лише математичними роботами.

Для варіанту (c) не потрібно жодне джерело MATLAB, і тому це можна зробити без математичних робіт.

Який статус на математичних роботах?

Я справді намагався пояснити це "Департаменту технічної підтримки MathWorks". Але моє враження таке: вони мене не розуміють. Вони закрили мій квиток на підтримку та запропонували телефонну (!) Розмову в січні 2014 року з менеджером технічної підтримки.

Я докладу максимум зусиль, щоб пояснити це, але чесно кажучи: я не дуже впевнений у собі.

Оновлення (2014/01/10): Наразі mathworks намагається вибрати варіант (b).

Оновлення (2014/03/19): Для файлу libiomp5. так що ви можете завантажити нещодавно скомпільовану версію (без статичного TLS) у mathworks, звіт про помилку 961964 . А інші кінцівки? Поліпшень там немає. Тож не дивуйтеся, щоб отримати "dlopen: не можна більше завантажувати жоден об'єкт із статичним TLS" з "doc", наприклад, див. Звіт про помилку 1003952 .


Я можу це підтвердити, у моїй 64-бітовій документації щодо відкриття Fedora буде виникати помилка під час завантаження BLAS. Навіть після збільшення пам'яті Java Heap до 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, який, як кажуть у документах, повинен використовувати глобально-динамічний, а не початковий-exec TLS.
robince

Я підтверджую цю проблему на Ubuntu 12.04 64bit. І заміна бібліотеки на бібліотеку у звіті про помилку вирішила проблему. +1
NKN

27

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


Я бачив подібну поведінку. Після першого запуску Matlab видає вищевказане повідомлення про помилку. Після перезапуску помилка не з’являється знову. Помилка робить знову після другої перезавантаження, і це може повторюватися знову і знову. Він періодично знову з’являється після першого, третього, п’ятого, ... запуску матлабу.
Крістоф

1
Для мене теж це вирішило мою проблему. Але вдячний користувачеві2898218 за те, що він поділився усім цим.
desmond13

Не працював у мене на OpenSuse Leap 42.1 з Matlab R2016b
Sameer

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


це було для мене обхідним
шляхом

Дякую! єдине рішення, яке працювало для мене (і найпростіше). Я використовую деякі зовнішні бібліотеки без вихідного коду. Найсмішніше, що проблема все ще існує у Matlab 2016b ...
foxfireee

4

http://www.mathworks.de/support/bugreports/961964 оновлено 30.01.2014. Існує zip-файл, прикріплений до libiomp5. тому я тестував його на Mageia 4 x86_64 за допомогою Matlab R2013b. Тепер я можу використовувати Документацію Matlab, щоб без проблем відкрити демонстраційну версію.


1
pls опублікуйте рішення, оскільки посилання може будь-коли стати неактивним.
Лакшмі

рішення - файл, що відповідає ліцензії 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.
Темак

2

Я зіткнувся з цією проблемою після того, як "bar" (для графіків барів) з масивом дає мені лише один синій блок, без помилок. Перезавантаження спочатку вирішило проблему. Але після помилки пам'яті (після обробки дуже великого файлу) я просто не можу обійти цю проблему синього блоку.

Використання "hist" на вході матриці дає мені проблему "Помилка завантаження BLAS" і приводить мене до цієї теми. Обхідний метод Mathwork виправив історію та проблеми.

Просто хотів донести визнання до ступеня впливу цієї помилки.


0

У мене була та ж проблема, і я вирішив її, збільшивши пам’ять Java Heap. Перейдіть до Налаштування> Загальне> Пам'ять Java-Heap і збільште виділену пам'ять.


0

Збільшення купі пам'яті Java (до 512 мб) також працювало для мене на R2013b / Ubuntu 12.04. "Помилка завантаження BLAS" почалася, коли я обробив файл розміром 11 ГБ (з 16 ГБ оперативної пам'яті), і не повторювався після збільшення пам'яті кучі Java та перезапуску MATLAB.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.