[matlab] 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. 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



답변

이것은 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 참조) .


답변

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


답변

긴 이야기 짧게 : matlab을 시작한 디렉토리에 내용이있는 startup.m 파일을 만듭니다 ones(10)*ones(10);. matlab을 다시 시작하면 처리됩니다.


답변

내가 찾은 것처럼 이것은 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


답변

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


답변

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

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


답변

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

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