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

어떤 OS를 사용합니까? 소스 코드를 공유 할 수 있습니까?
ztik

답변 주셔서 감사합니다. 나는 예를 들어 위 참조, 우분투를 사용하고 있습니다
한스 마이어

답변:


105

이것은 R2012b (8.0) 이후로 알려진 MATLAB의 961964 버그 입니다. MATLAB은 정적 TLS (스레드 로컬 저장소, 예 : gcc 컴파일러 플래그 -ftls-model 참조)를 사용하여 일부 라이브러리를 동적으로로드합니다. 너무 많은 라이브러리로드 => 남은 공간이 없습니다.

지금까지 mathwork의 유일한 해결 방법은 중요한 (!) 라이브러리를 먼저 사용하여 먼저로드하는 것입니다 (startup.m에 "ones (10) * ones (10);"을 넣는 것이 좋습니다). 이 "솔루션 전략"에 대해서는 언급하지 않는 것이 좋습니다.

Linux x86_64에서 R2013b (8.2.0.701) 이후 내 경험은 다음과 같습니다. "doc"(그래픽 도움말 시스템)을 사용하지 마십시오! 이 문서 유틸리티 (libxul 등)가 많은 정적 TLS 메모리를 사용하고 있다고 생각합니다.

다음은 업데이트입니다 (2013/12/31).

다음 테스트는 모두 Fedora 20 (glibc-2.18-11.fc20 포함) 및 Matlab 8.3.0.73043 (R2014a 프리 릴리즈)에서 수행되었습니다.

TLS에 대한 자세한 내용은 Ulrich Drepper, ELF Handling For Thread-Local Storage, 버전 0.21, 2013 (현재 AkkadiaRedhat 에서 사용 가능)을 참조하십시오 .

정확히 어떻게 되나요?

MATLAB은 dlopen을 사용하여 TLS 초기화가 필요한 여러 라이브러리를 동적으로로드합니다. 이러한 모든 라이브러리에는 dtv (동적 스레드 벡터)에 슬롯이 필요합니다. MATLAB은 컴파일 / 링크 시간에 런타임에 이러한 라이브러리 중 일부를 동적으로로드하기 때문에 링커 (수학 작업에서)는 필요한 슬롯을 계산할 기회가 없었습니다 (이것이 중요한 부분입니다). 이제 런타임에 이러한 경우를 처리하는 것이 동적 lib 로더의 작업입니다. 그러나 이것은 쉽지 않습니다. dl-open.c를 인용하려면 :

정적 TLS의 경우 지금 여기에서 메모리를 할당해야합니다. 여기에는 DTV에 메모리 할당이 포함됩니다. 그러나 우리는 우리 자신이 아닌 다른 어떤 DTV도 바꿀 수 없습니다. 따라서 DTV에 공간이 있다는 것을 보장 할 수 없으면 시도도하지 않고로드에 실패합니다.

glibc의 동적 lib 로더에는 이러한 혼란을위한 추가 슬롯을 예약하기위한 컴파일 시간 상수 (DTV_SURPLUS라고 함, glibc-source / sysdeps / generic / ldsodefs.h 참조)가 있습니다 (멀티 스레딩에서 정적 TLS를 사용하여 동적으로 라이브러리로드 프로그램). Fedora 20의 glibc 버전에서이 값은 14입니다.

제 경우에는 dtv 슬롯이 필요한 첫 번째 libs (MATLAB 실행)가 있습니다.

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과 함께 제공되는 바이너리의 일부를 디버그, 디 컴파일 또는 디스 어셈블하지 않았습니다. 저는 MATLAB이 libs를 동적으로로드하는 데 사용하는 Fedora 20의 자유 개방형 glibc 바이너리 만 디버깅했습니다.

이 문제를 해결하기 위해 무엇을 할 수 있습니까?

3 가지 옵션이 있습니다.

(a) MATLAB을 다시 빌드하고 해당 libs (초기 실행 TLS 모델 사용)를 동적으로로드하지 않고 대신 링크합니다 (그러면 링커가 필요한 슬롯을 계산할 수 있습니다!).

(b) 해당 라이브러리를 다시 빌드하고 initial-exec tls 모델을 사용하지 않는지 확인하십시오.

(c) glibc를 다시 빌드하고 glibc / sysdeps / generic / ldsodefs.h에서 DTV_SURPLUS를 늘립니다.

분명히 옵션 (a)와 (b)는 mathworks에서만 수행 할 수 있습니다.

옵션 (c)의 경우 MATLAB 소스가 필요하지 않으므로 수학없이 수행 할 수 있습니다.

Mathworks의 상태는 어떻습니까?

나는 이것을 "MathWorks 기술 지원 부서"에 정말로 설명하려고 노력했습니다. 그러나 내 인상은 : 그들은 나를 이해하지 못한다. 그들은 내 지원 티켓을 닫고 2014 년 1 월 기술 지원 관리자와 전화 (!) 대화를 제안했습니다.

나는 이것을 설명하기 위해 최선을 다할 것이지만 솔직히 말해서 나는 그다지 자신이 없다.

업데이트 (2014/01/10) : 현재 mathworks에서 옵션 (b)를 시도하고 있습니다.

업데이트 (2014/03/19) : libiomp5.so 파일의 경우 mathworks, bug report 961964 에서 새로 컴파일 된 버전 (정적 TLS 제외)을 다운로드 할 수 있습니다 . 그리고 다른 libs? 거기에 개선이 없습니다. 따라서 "dlopen : cannot load any more object with static TLS"를 "doc"와 함께 가져 오는 것에 놀라지 마십시오 (예 : 버그 보고서 1003952 참조) .


내 Fedora 64 비트 문서에서 BLAS를로드 할 때 오류가 발생 함을 확인할 수 있습니다. Java 힙 메모리를 1Gb (내가 생각하기에 충분하다고 생각하는 것)로 늘린 후에도 동일한 일이 발생합니다.
MeloMCR 2013

내가 오픈 수세 13.1 (64 비트) 및 MATLAB R2013b에서이 문제를 확인하실 수 있습니다 여기를 참조 : mathworks.com/matlabcentral/newsreader/view_thread/332791를 . 지금까지 실행 가능한 솔루션이 없습니다 !!!
마이클

11
ones (10) * ones (10); 감사합니다. startup.m 파일에서 : 그것은 당분간 내 문제를 해결했습니다. BTW이 버그는 ... 단순히 믿을 수 없다
Danduk82

내 mex 파일 (gfortran으로 컴파일 됨)에서이 오류가 발생합니다. 이 문제를 피하기 위해 다르게 구축 할 수있는 방법이 있습니까? 플래그에는 문서가 초기 실행 TLS가 아닌 전역 동적을 사용해야한다고 말하는 -fPIC가 포함됩니다.
robince 2014-04-09

Ubuntu 12.04 64bit에서이 문제를 확인합니다. 그리고 라이브러리를 버그 보고서의 라이브러리로 교체하면 문제가 해결되었습니다. +1
NKN

27

Matlab을 다시 시작하면 문제가 해결되었습니다.


비슷한 행동을 보았습니다. 처음 시작한 후 matlab은 위의 오류 메시지를 표시합니다. 다시 시작한 후 오류가 다시 나타나지 않습니다. 두 번째 다시 시작하면 오류 다시 나타나며 반복해서 반복 할 수 있습니다. matlab의 첫 번째, 세 번째, 다섯 번째, ... 시작 후 간헐적으로 다시 나타납니다.
Christoph

1
나에게도 그것은 내 문제를 해결했습니다. 그러나 모든 것을 공유해 주신 user2898218에게 감사드립니다.
desmond13 2015-04-28

Matlab R2016b와 함께 OpenSuse Leap 42.1에서 저를 위해 작동하지 않았습니다
Sameer


5

내가 찾은 것처럼 이것은 MathWorks에서 아직 해결되지 않은 오래된 문제입니다.

다음은 저에게 도움이 된 2 센트입니다 (MEX와 함께 IT ++ 외부 라이브러리를 원할 때).


문제의 원인으로 확인 된 라이브러리를 "libXYZ.so"로 지정하고 시스템의 위치를 ​​알고 있음을 알려줍니다.

해결 방법은 시작 초기에 특정 라이브러리를로드하도록 MATLAB에 알리는 것입니다. 이 오류의 이유는이 슬롯의 부족으로 명백하게 thread local storage일명 tls(때문에 그들은 이미 작성 업되어까지) 목적.

최신 컴파일을 시작하는 동안 이전에로드되지 않은 새 라이브러리가 갑자기 필요했기 때문에 MATLAB은이 오류를 발생시킵니다.

MATLAB이이 문제를 오랫동안 해결하지 못한 것이 유감입니다.

다행히 솔루션은 매우 간단한 단일 터미널 명령입니다.


리눅스 머신의 일반적인 단계는 다음과 같습니다 :

  1. 명령 프롬프트 열기 ( Ctrl+Alt+TUbuntu에서)
  2. 다음 명령을 실행하십시오.

    export 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


이것은 완전히 다른 설정에서 나를위한 해결 방법이었습니다. issues.dlang.org/show_bug.cgi?id=17061
timotheecour

감사! 나를 위해 일한 유일한 솔루션 (그리고 가장 간단한 솔루션). 소스 코드없이 일부 외부 라이브러리를 사용하고 있습니다. 재미있는 일이 ... 문제가 계속 매트랩 2016b에 존재입니다
foxfireee

4

http://www.mathworks.de/support/bugreports/961964 는 2014 년 1 월 30 일에 업데이트되었습니다. libiomp5와 함께 첨부 된 zip 파일이 있으므로 Matlab R2013b를 사용하여 Mageia 4 x86_64에서 테스트했습니다. 이제 Matlab의 문서를 사용하여 문제없이 데모를 열 수 있습니다.


1
pls는 링크가 언제든지 비활성화 될 수 있으므로 솔루션을 게시합니다.
Lakshmi

솔루션은 MathWorks 라이선스에 종속 된 파일입니다. 우리는 그것을 재배포 할 수없고 그들이 스스로 구축했기 때문에“솔루션을 게시”할 방법이 없습니다. 그 외에는 작동하지 않습니다. R2014b에서는 수정되어야하지만 여전히 오류가 발생합니다.
플라잉 양

3

나는 같은 문제가 있었고 방금 해결했다고 생각합니다.

matlab을 설치할 때 사용자 정의 설치를 사용하십시오 (처음에는하지 않았습니다). 미리 정의 된 폴더 (/ usr / local / bin)에서 matlab 스크립트에 대한 심볼릭 링크를 생성하도록 선택합니다. 이것은 나를 위해 트릭을했습니다!


이것은 어떤 링크를 생성합니까? .sh 확장자가없는 모든 스크립트를 수동으로 연결했는데 버그가 여전히 존재합니다.
플라잉 양

3

Matlab 2013b와 Matlab 2014a에서 동일한 문제가 발생했습니다. libiomp5.so에 대해 mathworks에서 제공 한 수정은 LAPACK이 작동하지 않는 문제 만 제거했습니다. 그러나 OpenMp (예 : VL_FEAT)를 사용하는 외부 라이브러리를 사용할 수 없습니다. "dlopen : 정적 TLS로 더 이상 개체를로드 할 수 없습니다."라는 오류가 계속 발생합니다.

나를 위해 일한 유일한 것은 Matlab 2012b로 다운 그레이드하는 것입니다.


Matlab 2014a에서 libmwosgserver.so를로드하는 것과 동일한 문제가 있습니다. 하지만 Matlab 2013b로 다운 그레이드했을 때 일했습니다.
Temak 2015-10-27

2

배열이있는 "bar"(막대 플롯의 경우)가 오류없이 단일 파란색 블록 만 제공 한 후이 문제가 발생했습니다. 처음에 재부팅하면 문제가 해결되었습니다. 그러나 메모리 오류 (매우 큰 파일을 처리 한 후) 후에는이 파란색 블록 문제를 통과 할 수 없습니다.

매트릭스 입력에 "hist"를 사용하면 "BLAS 로딩 오류"문제가 발생하고이 스레드로 연결됩니다. Mathwork 해결 방법은 hist 및 bar 문제를 해결했습니다.

이 버그의 영향을 인식하고 싶었습니다.


0

나는 같은 문제가 있었고 Java 힙 메모리를 늘려서 해결했습니다. 환경 설정> 일반> Java- 힙 메모리로 이동하여 할당 된 메모리를 늘리십시오.


0

Java 힙 메모리 (512MB까지)를 늘리는 것도 R2013b / Ubuntu 12.04에서 저에게 효과적이었습니다. 11GB 파일 (16GB RAM 포함)을 처리 할 때 "BLAS로드 오류"가 시작되었으며 자바 힙 메모리를 늘리고 matlab을 다시 시작한 후에도 재발하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.