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. MATLAB द्वारा प्रदान की गई BLAS लाइब्रेरी का उपयोग कैसे करूँ?
  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

यह R2012b (8.0) के बाद से ज्ञात MATLAB का 961964 बग नहीं है । MATLAB गतिशील रूप से स्थिर TLS (थ्रेड लोकल स्टोरेज, उदाहरण के लिए gcc कंपाइलर फ्लैग-मॉडल-मॉडल देखें) के साथ कुछ काम करता है। बहुत सारे ऐसे काम लोड हो रहे हैं => कोई जगह नहीं बची।

अब तक मैथवर्थ का एकमात्र काम है महत्वपूर्ण (?) कामों को पहले से लोड करके उनका जल्दी से जल्दी उपयोग करना (वे स्टार्टअप में) "10 (10) * वाले (10);" रखने का सुझाव देते हैं। मैं इस "समाधान रणनीति" पर बेहतर टिप्पणी नहीं करता।

चूंकि लिनक्स x86_64 के साथ R2013b (8.2.0.701) मेरा अनुभव है: "डॉक" (चित्रमय मदद प्रणाली) का उपयोग न करें! मुझे लगता है कि यह डॉक-यूटिलिटी (लिबक्सुल, इत्यादि) स्थिर टीएलएस मेमोरी का उपयोग कर रहा है।

यहाँ एक अद्यतन है (2013/12/31)

निम्नलिखित सभी परीक्षण फेडोरा 20 (glibc-2.18-11.fc20 के साथ) और Matlab 8.3.0.73043 (R2014a Prerelease) के साथ किए गए थे।

टीएलएस के बारे में अधिक जानकारी के लिए, अलरिक ड्रेपपर देखते हैं, ELF थ्रेड-स्थानीय संग्रह, संस्करण 0.21, 2013, वर्तमान में उपलब्ध के लिए से निपटने Akkadia और Redhat

वास्तव में क्या होता है?

MATLAB गतिशील रूप से (dlopen के साथ) कई पुस्तकालयों को लोड करता है जिन्हें tls आरंभीकरण की आवश्यकता होती है। उन सभी libs को dtv (डायनेमिक थ्रेड वेक्टर) में एक स्लॉट की आवश्यकता होती है। क्योंकि MATLAB ने इनमें से कई कामों को गतिशील रूप से संकलन / लिंक समय पर लिंकमर पर लोड किया है (लिंक पर मैथवर्क्स) को आवश्यक स्लॉट्स की गणना करने का कोई मौका नहीं मिला (यह महत्वपूर्ण हिस्सा है)। अब रनटाइम पर इस तरह के केस को हैंडल करना डायनेमिक लिब लोडर का काम है। लेकिन यह आसान नहीं है। Dl-open.c का हवाला देते हैं:

स्थैतिक TLS के लिए हमें यहाँ और अभी मेमोरी आवंटित करनी है। इसमें डीटीवी में मेमोरी आवंटित करना शामिल है। लेकिन हम अपने स्वयं के अलावा किसी भी DTV को नहीं बदल सकते। इसलिए, अगर हम यह गारंटी नहीं दे सकते हैं कि DTV में कोई जगह नहीं है, तो हम इसे करने की कोशिश भी नहीं करते हैं और लोड को विफल करते हैं।

एक संकलन समय स्थिर है (जिसे DTV_SURPLUS कहा जाता है, glibc-source / sysdeps / जेनेरिक / ldsodefs.h देखें) glibc के डायनेमिक लिब लोडर में इस तरह की गड़बड़ी के लिए कई अतिरिक्त स्लॉट जमा करने के लिए (डायनेमिक रूप से लोड हो रहे लिबास के साथ मल्टीथ्रेडिंग में मल्टीपल लोडिंग लिबास) कार्यक्रम)। फेडोरा 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 में कोई स्लॉट नहीं बचा। यही त्रुटि संदेश हमें और विशेषकर मैथवर्क्स को बताने की कोशिश करता है।

रिकॉर्ड के लिए: MATLAB के लाइसेंस का उल्लंघन न करने के लिए, मैंने MATLAB के साथ भेजे गए बायनेरिज़ के किसी भी हिस्से को डीबग, डिकम्पाइल या डिसेबल्ड नहीं किया। मैंने केवल फेडोरा 20 के मुक्त और खुले glibc-binaries को डिबग किया था जो MATLAB का उपयोग गतिशील रूप से लोड करने के लिए कर रहे थे।

इस समस्या को हल करने के लिए क्या किया जा सकता है?

3 विकल्प हैं:

(ए) MATLAB का पुनर्निर्माण करें और उन लिबास (प्रारंभिक-निष्पादन tls मॉडल के साथ) के बजाय उनके खिलाफ लिंक को लोड न करें (तब लिंकर आवश्यक स्लॉट्स की गणना कर सकता है!)

(b) उन परिवादों का पुनर्निर्माण करें और सुनिश्चित करें कि वे प्रारंभिक-निष्पादन tls मॉडल का उपयोग नहीं कर रहे हैं।

(c) ग्लिबैक का पुनर्निर्माण और ग्लिबैक / सिसडेप्स / जेनेरिक / ldsodefs.h में DTV_SURPLUS बढ़ाएं

स्पष्ट रूप से विकल्प (ए) और (बी) केवल गणित द्वारा किए जा सकते हैं।

विकल्प (सी) के लिए MATLAB के किसी भी स्रोत की आवश्यकता नहीं है और इस तरह से गणित के बिना किया जा सकता है।

मैथ्स पर क्या स्थिति है?

मैंने वास्तव में "मैथवर्क्स तकनीकी सहायता विभाग" को यह समझाने की कोशिश की। लेकिन मेरी धारणा है: वे मुझे नहीं समझते। उन्होंने जनवरी 2014 में एक तकनीकी सहायता प्रबंधक के साथ मेरा समर्थन टिकट बंद कर दिया और एक टेलीफोन (!) बातचीत का सुझाव दिया।

मैं इसे समझाने के लिए बहुत अच्छा करूँगा, लेकिन ईमानदार होने के लिए: मुझे बहुत विश्वास नहीं है।

अद्यतन (2014/01/10): वर्तमान में mathworks विकल्प (b) का प्रयास कर रहा है।

अद्यतन (2014/03/19): फ़ाइल libiomp5.so के लिए आप मैथवर्क्स में एक नया संकलित संस्करण (स्थिर टीएलएस के बिना) डाउनलोड कर सकते हैं, बग रिपोर्ट 961964 । और अन्य लिबास? वहां कोई सुधार नहीं हुआ। तो "dlopen:" doc के साथ स्थिर TLS के साथ किसी भी अधिक वस्तु को लोड नहीं किया जा सकता है, उदाहरण के लिए, बग रिपोर्ट 1003952 देखें


मैं इसकी पुष्टि कर सकता हूं, मेरे फेडोरा में 64 बिट खोलने का दस्तावेज़ीकरण बीएलएएस लोड करते समय एक त्रुटि का कारण होगा। यहां तक ​​कि जावा हीप मेमोरी को 1 जीबी तक बढ़ाने के बाद (जो मुझे लगता है कि काफी पर्याप्त है) वही बात होती है।
मेलोएमसीआर

मैं इस समस्या की खुलेआम 13.1 (64 बिट) और MATLAB R2013b पर पुष्टि कर सकता हूं, यहां देखें: mathworks.com/matlabcentral/newsreader/view_thread/332791 । अब तक, कोई व्यवहार्य समाधान !!!
Michal

11
लोगों के लिए धन्यवाद (10) * वाले (10); में। स्टार्टअप फ़ाइल: यह पल के लिए मेरी समस्या का हल। BTW यह बग बस अविश्वसनीय है ...
Danduk82

मुझे यह त्रुटि अपनी खुद की मेक्सिको फ़ाइलों (गफ़रन के साथ संकलित) के साथ मिल रही है। क्या कोई रास्ता है जिससे मैं इस मुद्दे से बचने के लिए उन्हें अलग तरह से बना सकता हूं? झंडे में -fPIC शामिल है जो डॉक्स का कहना है कि प्रारंभिक-निष्पादित टीएलएस के बजाय वैश्विक-गतिशील का उपयोग करना चाहिए।
रॉबिन

मैं Ubuntu 12.04 64bit पर इस समस्या की पुष्टि करता हूं। और बग रिपोर्ट में लाइब्रेरी को प्रतिस्थापित करने से समस्या हल हो गई। +1
NKN

27

मतलबी को बहाल करने से मेरे लिए समस्या हल हो गई।


मैंने ऐसा ही व्यवहार देखा है। पहली शुरुआत के बाद, matlab उपरोक्त त्रुटि संदेश का उत्सर्जन करता है। पुनरारंभ करने के बाद, त्रुटि फिर से प्रकट नहीं होती है। त्रुटि एक दूसरे पुनरारंभ के बाद फिर से प्रकट होती है , और इसे बार-बार दोहराया जा सकता है। यह रुक-रुक कर पहले, तीसरे, पांचवें, के बाद फिर से शुरू होता है ... मटलब की शुरुआत।
क्रिस्टोफ

1
मेरे लिए भी इसने मेरी समस्या हल कर दी। लेकिन उस सब को साझा करने के लिए user2898218 की सराहना करें।
डेसमंड 13

माटलाब R2016b के साथ ओपनस्यूज लीप 42.1 पर मेरे लिए काम नहीं किया
समीर

6

लंबी कहानी छोटी: निर्देशिका में है कि आप सामग्री के साथ एक फ़ाइल स्टार्टअप बनाने से matlab शुरू करते हैं ones(10)*ones(10);। मतलाब को फिर से शुरू करें और इसका ध्यान रखा जाएगा।


मेरे लिए ठीक काम करता है !! धन्यवाद!
user2230101

5

यह है, जैसा कि मैंने पाया, एक उम्र पुरानी समस्या अभी तक MathWorks द्वारा अनसुलझी है।

यहाँ मेरे दो सेंट हैं, जो मेरे लिए काम करते थे (जब मुझे आईटी ++ बाहरी पुस्तकालय चाहिए, एमईएक्स के साथ)।


लाइब्रेरी को जिसे आपने समस्या का कारण माना है उसे "libXYZ.so" होने दें, और यह कि आप जानते हैं कि यह आपके सिस्टम में कहां निहित है।

इसका समाधान MATLAB को अपने स्टार्टअप के शुरुआती समय में विशिष्ट पुस्तकालय को लोड करने के लिए सूचित करना है। इस त्रुटि का कारण स्पष्ट रूप से इस thread local storageउर्फ tlsउद्देश्य के लिए स्लॉट की कमी के कारण है (क्योंकि वे पहले से ही भरे हुए हैं)।

क्योंकि नवीनतम संकलनों को अचानक एक नए पुस्तकालय की आवश्यकता थी जो पहले अपने स्टार्टअप के दौरान लोड नहीं किया गया था, MATLAB इस त्रुटि को फेंकता है।

दया आती है कि MATLAB ने कभी भी इस समस्या को हल करने की परवाह नहीं की।

सौभाग्य से, समाधान एक एकल, बहुत सरल टर्मिनल कमांड है।


एक लाइन-मशीन पर विशिष्ट चरण निम्नानुसार होने चाहिए:

  1. ओपन कमांड प्रॉम्प्ट ( Ctrl+Alt+Tउबंटू में)
  2. निम्नलिखित आदेश जारी करें

    निर्यात LD_PRELOAD = <PATH-TO-libxyz.so>

उदाहरण के लिए: export LD_PRELOAD=/usr/local/lib/libitpp.so

  1. उसी टर्मिनल से मैटलैब शुरू करें

    Matlab &

अपना प्रोग्राम चलाना अब समस्या को हल करना चाहिए, क्योंकि यह मेरे मामले के लिए है।

सौभाग्य!


संदर्भ:

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


: यह एक पूरी तरह से अलग स्थापित करने में मेरे लिए एक समाधान था issues.dlang.org/show_bug.cgi?id=17061
timotheecour

धन्यवाद! एकमात्र समाधान जो मेरे लिए काम करता था (और सबसे सरल एक)। मैं स्रोत कोड के बिना कुछ बाहरी पुस्तकालयों का उपयोग कर रहा हूं। सबसे मजेदार बात यह है कि मतलाब 2016 में अभी भी समस्या मौजूद है ...
foxfireee

4

http://www.mathworks.de/support/bugreports/961964 को 30/01/2014 को अपडेट किया गया है। Libiomp5.so के साथ एक ज़िप फ़ाइल जुड़ी हुई है। मैंने इसका परीक्षण मटिया 4 x86_64 पर मतलाब R2013b के साथ किया। मैं अब किसी भी समस्या के बिना डेमो खोलने के लिए मतलाब के प्रलेखन का उपयोग कर सकता हूं।


1
pls समाधान भी पोस्ट करें क्योंकि लिंक कभी भी निष्क्रिय हो सकता है।
लक्ष्मी

समाधान MathWorks के लाइसेंस के लिए एक फ़ाइल सबटेक्ट है। हम इसे पुनर्वितरित नहीं कर सकते हैं और उन्होंने इसे स्वयं बनाया है, इसलिए "समाधान पोस्ट करने" का कोई तरीका नहीं है। इसके अलावा, यह मेरे लिए काम नहीं करता है: इसे R2014b के लिए तय किया जाना चाहिए, लेकिन मुझे अभी भी त्रुटि मिलती है।
उड़ान भेड़

3

मुझे भी यही समस्या थी और मुझे लगता है कि मैंने इसे हल कर दिया है।

Matlab स्थापित करते समय कस्टम इंस्टॉलेशन का उपयोग करें (मैंने पहली बार ऐसा नहीं किया था)। पूर्वनिर्धारित फ़ोल्डर (/ usr / स्थानीय / बिन) में matlab लिपियों के लिए प्रतीकात्मक लिंक बनाने के लिए चुनें। इसने मेरे लिए चाल चली!


क्या लिंक बनाता है? मैं वहाँ .sh विस्तार के बिना मैन्युअल रूप से सभी लिपियों से जुड़ा हुआ है और बग अभी भी मौजूद है।
उड़ान भेड़

3

मुझे Matlab 2013b और Matlab 2014a दोनों के साथ एक ही समस्या थी। Mathworks द्वारा libiomp5.so के लिए दिए गए फिक्स ने केवल LAPACK के काम न करने की समस्या को दूर किया। हालाँकि, मैं बाहरी पुस्तकालयों का उपयोग नहीं कर सका जो कि OpenMp (जैसे VL_FEAT) का उपयोग कर रहे हैं: मुझे अभी भी त्रुटि मिलती है "dlopen: स्थैतिक TLS के साथ कोई और ऑब्जेक्ट लोड नहीं कर सकता।"

केवल एक चीज जो मेरे लिए काम करती थी, वह मतलब 2012 बी में अपग्रेड हो रही थी।


Matlab 2014a में libmwosgserver.so लोड करने में समान समस्या है। लेकिन तब काम किया जब मैंने माटलैब 2013 बी को डाउनग्रेड किया।
तैमुक

2

एक सरणी के साथ "बार" (बार भूखंडों के लिए) के बाद मैं इस समस्या में आया था, मुझे एक एकल नीला ब्लॉक देता है, जिसमें कोई त्रुटि नहीं है। रिबूट ने पहले समस्या को हल किया। लेकिन एक मेमोरी एरर (बहुत बड़ी फाइल को प्रोसेस करने के बाद) के बाद, मैं अभी इस ब्लू ब्लॉक की समस्या से नहीं निकल सकता।

मैट्रिक्स इनपुट पर "हिस्ट" का उपयोग करने से मुझे "BLAS लोडिंग एरर" की समस्या होती है और मुझे इस धागे तक ले जाती है। Mathwork वर्कअराउंड ने हिस्ट और बार समस्याओं को ठीक किया।

बस इस बग के प्रभाव को पहचानना चाहता था।


0

मुझे वही समस्या थी और अपनी जावा हीप मेमोरी को बढ़ाकर इसे हल किया। वरीयताएँ> जनरल> जावा-हीप मेमोरी पर जाएं, और आवंटित मेमोरी बढ़ाएं।


0

जावा हीप मेमोरी (512 एमबी तक) बढ़ाना भी मेरे लिए R2013b / Ubuntu 12.04 पर काम किया। "BLAS लोडिंग त्रुटि" तब शुरू हुई जब मैंने एक 11 GB फ़ाइल (16 GB RAM के साथ) संसाधित की, और जावा हीप मेमोरी बढ़ाने और matlab को पुनः आरंभ करने के बाद पुनरावृत्ति नहीं की।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.