며칠 이후로 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
물론이 문제에 대한 해결책을 찾았지만 너무 많이 이해하지 못하고 어떻게해야할지 모르겠습니다. 다음은 내가 찾은 스레드입니다.
- MATLAB에서 제공하는 BLAS 라이브러리를 어떻게 사용합니까?
- 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 (현재 Akkadia 및 Redhat 에서 사용 가능)을 참조하십시오 .
정확히 어떻게 되나요?
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이이 문제를 오랫동안 해결하지 못한 것이 유감입니다.
다행히 솔루션은 매우 간단한 단일 터미널 명령입니다.
리눅스 머신의 일반적인 단계는 다음과 같습니다 :
- 명령 프롬프트 열기 (
Ctrl+Alt+T
Ubuntu에서) - 다음 명령을 실행하십시오.
export LD_PRELOAD = <PATH-TO-libxyz.so>
예 : export LD_PRELOAD=/usr/local/lib/libitpp.so
- 동일한 터미널에서 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로 다운 그레이드하는 것입니다.