MatLab hatası: statik TLS ile açılamıyor


82

Birkaç günden beri, MATLAB'ı kullanırken bir noktada meydana gelen aynı hatayı sürekli alıyorum dlopen. MATLAB'da oldukça yeniyim ve bu yüzden ne yapacağımı bilmiyorum. Google da bana yardım etmiyor gibi görünüyor. Bir özvektör yapmaya çalıştığımda, şunu alıyorum:

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS

Bunu çarpma yaparken de alıyorum:

Error using  * 
BLAS loading error:
dlopen: cannot load any more object with static TLS

Elbette bu sorunun çözümlerini aradım ama çok anlamıyorum ve ne yapacağımı bilmiyorum. Bunlar bulduğum konular:

  1. MATLAB tarafından sağlanan BLAS kitaplığını nasıl kullanırım?
  2. http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html

Biri bana yardım edebilir mi lütfen?

Bu hatayı gösteren işlev çağrılarına örnekler

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

Hangi işletim sistemini kullanıyorsunuz? Biraz kaynak kodu paylaşabilir misin?
ztik

Cevabınız için teşekkür ederim. Ubuntu kullanıyorum, bir örnek için yukarıya bakın
Hans Meyer 9'13

Yanıtlar:


105

Olduğunu böcek hiçbir 961964 R2012b (8.0) beri bilinen MATLABin. MATLAB, statik TLS ile bazı kitaplıkları dinamik olarak yükler (iş parçacığı yerel depolaması, örneğin bkz. Gcc derleyici bayrağı -ftls-modeli). Çok fazla sayıda kitap yüklemek => boşluk kalmadı.

Şimdiye kadar mathwork'ün tek çözümü, önemli (!) Kitaplıkları önce onları erken kullanarak yüklemektir (startup.m'ye "ones (10) * one (10);" koymanızı önerirler). Bu "çözüm stratejisi" hakkında yorum yapmasam iyi olur.

Linux x86_64 ile R2013b'den (8.2.0.701) bu yana benim deneyimim: "doc" (grafik yardım sistemi) kullanmayın! Bu doc ​​yardımcı programının (libxul, vb.) Çok fazla statik TLS belleği kullandığını düşünüyorum.

İşte bir güncelleme (2013/12/31)

Aşağıdaki testlerin tümü, Fedora 20 (glibc-2.18-11.fc20 ile) ve Matlab 8.3.0.73043 (R2014a Ön Sürüm) ile yapılmıştır.

TLS hakkında daha fazla bilgi için, ELF şu anda mevcut Konu-Yerel Depolama, Version 0.21, 2013 için taşıma Ulrich Drepper bkz Akkadia ve Redhat .

Tam olarak ne olur?

MATLAB dinamik olarak (dlopen ile) tls başlatması gereken birkaç kitaplığı yükler. Tüm bu kitapların dtv'de (dinamik iş parçacığı vektörü) bir yuvaya ihtiyacı vardır. MATLAB bu kitaplıkların birçoğunu derleme / bağlama zamanında çalışma zamanında dinamik olarak yüklediğinden, bağlayıcının (mathworks'te) ihtiyaç duyulan yuvaları sayma şansı yoktu (önemli olan budur). Artık dinamik kitap yükleyicinin görevi, çalışma zamanında böyle bir durumu ele almaktır. Ancak bu kolay değil. Dl-open.c'den alıntı yapmak için:

Statik TLS için belleği burada ve şimdi ayırmalıyız. Bu, DTV'de bellek ayırmayı içerir. Ancak kendi DTV'yi değiştiremeyiz. Bu nedenle, DTV'de yer olduğunu garanti edemezsek, denemeyiz ve yükü bırakmayız bile.

Glibc'nin dinamik lib yükleyicisinde, böyle bir karmaşa için bir dizi ek yuva ayırmak için bir derleme süresi sabiti (DTV_SURPLUS olarak adlandırılır, bkz. programı). Fedora 20'nin glibc-Sürümünde bu değer 14'tür.

Benim durumumda dtv yuvalarına ihtiyaç duyan ilk kütüphaneler (MATLAB çalıştıran):

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

Evet 14'ten fazla => çok fazla => dtv'de hiç boşluk kalmadı. Hata mesajının bize ve özellikle de matematik işlerini anlatmaya çalıştığı şey budur.

Kayıt için: MATLAB'ın lisansını ihlal etmemek için, MATLAB ile birlikte gönderilen ikili dosyaların herhangi bir kısmının hatalarını ayıklamadım, kaynak koda dönüştürmedim veya parçalarına ayırmadım. Yalnızca MATLAB'ın kitaplıkları dinamik olarak yüklemek için kullandığı Fedora 20'nin ücretsiz ve açık glibc ikili dosyalarının hatalarını ayıkladım.

Bu sorunu çözmek için ne yapılabilir?

3 seçenek vardır:

(a) MATLAB'ı yeniden oluşturun ve bu kitaplıkları dinamik olarak yüklemeyin (ilk exec tls modeli ile) bunun yerine onlara bağlanın (daha sonra bağlayıcı gerekli yuvaları sayabilir!)

(b) Bu kitaplıkları yeniden oluşturun ve ilk exec tls modelini kullanmadıklarından emin olun.

(c) glibc'yi yeniden oluşturun ve glibc / sysdeps / generic / ldsodefs.h'de DTV_SURPLUS'ı artırın

Açıkçası (a) ve (b) seçenekleri yalnızca matematik çalışmaları tarafından yapılabilir.

(C) seçeneği için hiçbir MATLAB kaynağına ihtiyaç yoktur ve bu nedenle matematik çalışmaları olmadan yapılabilir.

Mathworks'teki durum nedir?

Bunu gerçekten "MathWorks Teknik Destek Departmanı" na anlatmaya çalıştım. Ama izlenimim şu: beni anlamıyorlar. Destek talebimi kapattılar ve Ocak 2014'te bir teknik destek yöneticisi ile bir telefon (!) Görüşmesi önerdiler.

Bunu açıklamak için elimden gelenin en iyisini yapacağım, ama dürüst olmak gerekirse: Kendime pek güvenmiyorum.

Güncelleme (2014/01/10): Şu anda mathworks (b) seçeneğini deniyor.

Güncelleme (2014/03/19): libiomp5.so dosyası için yeni derlenmiş bir sürümü (statik TLS'siz) mathworks, 961964 hata raporunda indirebilirsiniz . Ve diğer libler? Orada gelişme yok. Bu yüzden "dlopen: statik TLS ile daha fazla nesne yükleyemiyorum" ve "doc" ile şaşırmayın , örn . 1003952 hata raporuna bakın .


Bunu onaylayabilirim, Fedora 64bit açılış belgelerimde BLAS yüklenirken bir hataya neden olacak. Java Heap Memory'yi 1Gb'ye yükselttikten sonra bile (bence oldukça yeterli) aynı şey oluyor.
MeloMCR

Bu sorunu openSUSE 13.1 (64 bit) ve MATLAB R2013b'de doğrulayabilirim, buraya bakın: mathworks.com/matlabcentral/newsreader/view_thread/332791 . Şimdiye kadar geçerli bir çözüm yok !!!
michal

11
Olanlar (10) * olanlar (10) için teşekkürler; startup.m dosyasında: şu an için sorunumu çözdü. BTW bu hata tek kelimeyle inanılmaz ...
Danduk82

Bu hatayı kendi mex dosyalarımla alıyorum (gfortran ile derlenmiş). Bu sorunu önlemek için onları farklı şekilde oluşturmanın bir yolu var mı? Bayraklar, dokümanların ilk yürütme TLS'si yerine global-dinamik kullanması gerektiğini söylediği -fPIC'yi içerir.
2014

Bu sorunu Ubuntu 12.04 64bit'te onaylıyorum. Ve kitaplığı hata raporundakiyle değiştirmek sorunu çözdü. +1
NKN

27

Matlab'ı yeniden başlatmak sorunu benim için çözdü.


Ben de benzer davranışlar gördüm. İlk çalıştırmadan sonra matlab yukarıdaki hata mesajını verir. Yeniden başlattıktan sonra hata yeniden görünmez. Hata , ikinci bir yeniden başlatmadan sonra yeniden belirir ve bu defalarca tekrarlanabilir. Matlab'ın birinci, üçüncü, beşinci ... başlangıcından sonra aralıklı olarak yeniden belirir.
Christoph

1
Benim için de sorunumu çözdü. Ancak tüm bunları paylaştığı için user2898218'e teşekkür ederiz.
desmond13

Matlab R2016b ile OpenSuse Leap 42.1'de benim için işe yaramadı
Sameer

6

uzun lafın kısası: matlab'ı başlattığınız dizinde, içerikli startup.m dosyası oluşturun ones(10)*ones(10);. Matlab'ı yeniden başlatın ve ilgilenilecektir.


Benim için iyi çalışıyor !! Teşekkürler!
user2230101

5

Bu, bulduğum gibi, MathWorks tarafından çözülmemiş çok eski bir problem.

İşte benim için işe yarayan iki sentim (MEX ile IT ++ harici kütüphaneler istediğimde).


Sorunun nedenini bulduğunuz kitaplığın "libXYZ.so" olmasına ve bunun sisteminizin neresinde olduğunu bildiğinize izin verin.

Çözüm, MATLAB'a belirli kitaplığı başlangıcından en erken zamanda yüklemesini bildirmektir. Bu hatanın nedeni görünüşe göre bu thread local storagediğer tlsamaç için yuvaların bulunmamasından kaynaklanıyor (zaten doldurulmuş olmaları nedeniyle).

En son derlemeler, başlangıçta daha önce yüklenmemiş olan yeni bir kitaplık gerektirdiğinden, MATLAB bu hatayı atar.

MATLAB'ın bu sorunu bu kadar uzun süre çözmeyi umursamaması üzücü.

Neyse ki, çözüm tek ve çok basit bir terminal komutudur.


Bir linux makinesindeki tipik adımlar aşağıdaki gibi olmalıdır:

  1. Komut istemini açın ( Ctrl+Alt+TUbuntu'da)
  2. Aşağıdaki komutu verin

    LD_PRELOAD = <PATH-TO-libxyz.so> dışa aktar

Örneğin: export LD_PRELOAD=/usr/local/lib/libitpp.so

  1. Matlab'i aynı terminalden başlatın

    matlab ve

Benim durumumda olduğu gibi programınızı şimdi çalıştırmak sorunu çözecektir.

İyi şanslar!


Referans:

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


bu, benim için tamamen farklı bir ortamda geçici bir çözümdü
timotheecour

Teşekkürler! benim için çalışan tek çözüm (ve en basit olanı). Bazı harici kitaplıkları kaynak kodu olmadan kullanıyorum. En komik şey, sorun hala Matlab 2016b'de var ...
foxfireee

4

http://www.mathworks.de/support/bugreports/961964 30/01/2014 tarihinde güncellenmiştir. Libiomp5 ile eklenmiş bir zip dosyası var bu yüzden onu Mageia 4 x86_64 üzerinde Matlab R2013b ile test ettim. Artık herhangi bir sorun yaşamadan bir demo açmak için Matlab Dokümantasyonunu kullanabilirim.


1
Bağlantı herhangi bir zamanda devre dışı kalabileceğinden lütfen çözümü de yayınlayın.
Lakshmi

çözüm, MathWorks lisansının bir dosya alt başlığıdır. Yeniden dağıtamayız ve onlar bunu kendileri yaptılar, bu yüzden "çözümü yayınlamanın" bir yolu yok. Bunun dışında benim için çalışmıyor: R2014b için düzeltilmesi gerekiyor, ancak yine de hatayı alıyorum.
uçan koyun

3

Ben de aynı sorunu yaşadım ve sanırım çözdüm.

Matlab'ı kurarken özel kurulumu kullanın (bunu ilk seferde yapmadım). Önceden tanımlanmış klasördeki (/ usr / local / bin) matlab betiklerine sembolik bağlantılar oluşturmayı seçin. Bu benim için hile yaptı!


bu hangi bağlantıları oluşturur? Burada .sh uzantısı olmayan tüm komut dosyalarını manuel olarak bağladım ve hata hala mevcut.
uçan koyun

3

Hem Matlab 2013b hem de Matlab 2014a ile aynı sorunu yaşadım. Mathworks tarafından libiomp5.so için sağlanan düzeltme yalnızca LAPACK'in çalışmaması sorununu ortadan kaldırdı. Ancak, OpenMp kullanan harici kitaplıkları (VL_FEAT gibi) kullanamadım: Hala "dlopen: statik TLS ile daha fazla nesne yükleyemiyorum" hatasını alıyorum.

Benim için işe yarayan tek şey Matlab 2012b'ye geçmek oldu.


Matlab 2014a'da libmwosgserver.so yüklerken aynı sorunu yaşayın. Ancak Matlab 2013b'ye düşürdüğümde çalıştı.
Temak

2

Bir dizi ile "bar" (çubuk grafikleri için) bana hata atılmadan sadece tek bir mavi blok verdikten sonra bu problemle karşılaştım. İlk başta yeniden başlatmak sorunu çözdü. Ancak bir bellek hatasından sonra (çok büyük bir dosyayı işledikten sonra), bu mavi blok problemini geçemiyorum.

Bir matris girişinde "hist" kullanmak bana "BLAS yükleme hatası" sorununu veriyor ve beni bu konuya yönlendirdi. Mathwork geçici çözümü geçmiş ve çubuk sorunlarını düzeltti.

Sadece bu böceğin etkisi ölçüsünde tanınırlık getirmek istedim.


0

Aynı sorunu yaşadım ve Java Heap belleğimi artırarak çözdüm. Tercihler> Genel> Java-Heap Memory'ye gidin ve ayrılan belleği artırın.


0

Java yığın belleğini (512 mb'ye) artırmak da benim için R2013b / Ubuntu 12.04'te çalıştı. "BLAS yükleme hatası" 11 GB'lik bir dosyayı (16 GB RAM ile) işlediğimde başladı ve java yığın belleğini artırıp matlab'ı yeniden başlattıktan sonra tekrarlamadı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.