Lỗi MatLab: không thể mở bằng TLS tĩnh


82

Kể từ một vài ngày, tôi liên tục nhận được lỗi tương tự khi sử dụng MATLAB, điều này xảy ra tại một số thời điểm dlopen. Tôi còn khá mới đối với MATLAB, và đó là lý do tại sao tôi không biết phải làm gì. Google dường như cũng không giúp được gì cho tôi. Khi tôi cố gắng tạo một eigenvector, tôi nhận được điều này:

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

Tôi cũng nhận được điều này khi thực hiện một phép nhân:

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

Tất nhiên tôi đã tìm kiếm giải pháp cho vấn đề này, nhưng tôi không hiểu quá nhiều và không biết phải làm gì. Đây là những chủ đề tôi tìm thấy:

  1. Làm cách nào để sử dụng thư viện BLAS do MATLAB cung cấp?
  2. http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html

Ai đó có thể giúp tôi xin vui lòng?

Ví dụ về các lệnh gọi hàm thể hiện lỗi này

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

Bạn sử dụng hệ điều hành nào? Bạn có thể chia sẻ một số mã nguồn?
ztik

Cảm ơn về câu trả lời của bạn. Tôi đang sử dụng Ubuntu, cho một ví dụ xem ở trên
Hans Meyer

Câu trả lời:


105

Đó là lỗi số 961964 của MATLAB được biết đến từ phiên bản R2012b (8.0). MATLAB tải động một số lib với TLS tĩnh (lưu trữ cục bộ luồng, ví dụ: xem cờ trình biên dịch gcc -ftls-model). Đang tải quá nhiều lib như vậy => không còn chỗ trống.

Cách giải quyết duy nhất cho đến nay của mathwork là tải các lib quan trọng (!) Trước bằng cách sử dụng chúng sớm (họ đề nghị đặt "ones (10) * ones (10);" trong startup.m). Tốt hơn là tôi không bình luận về "chiến lược giải pháp" này.

Kể từ R2013b (8.2.0.701) với Linux x86_64, kinh nghiệm của tôi là: Không sử dụng "doc" (hệ thống trợ giúp đồ họa)! Tôi nghĩ rằng tiện ích doc này (libxul, v.v.) đang sử dụng rất nhiều bộ nhớ TLS tĩnh.

Đây là bản cập nhật (2013/12/31)

Tất cả các thử nghiệm sau được thực hiện với Fedora 20 (với glibc-2.18-11.fc20) và Matlab 8.3.0.73043 (R2014a Prerelease).

Để biết thêm thông tin về TLS, hãy xem Ulrich Drepper, xử lý ELF Đối với Bộ nhớ Cục bộ- Luồng , Phiên bản 0.21, 2013, hiện có tại AkkadiaRedhat .

Điều gì xảy ra chính xác?

MATLAB động (với dlopen) tải một số thư viện cần khởi tạo tls. Tất cả các lib đó cần một khe trong dtv (vectơ chủ đề động). Vì MATLAB tải động một số lib này trong thời gian chạy ở thời gian biên dịch / liên kết nên trình liên kết (tại các công trình toán học) không có cơ hội để đếm các vị trí cần thiết (đó là phần quan trọng). Bây giờ, nhiệm vụ của trình tải lib động là xử lý một trường hợp như vậy trong thời gian chạy. Nhưng điều này không hề dễ dàng. Để trích dẫn dl-open.c:

Đối với TLS tĩnh, chúng ta phải cấp phát bộ nhớ ở đây và bây giờ. Điều này bao gồm cấp phát bộ nhớ trong DTV. Nhưng chúng tôi không thể thay đổi bất kỳ DTV nào khác ngoài người của chúng tôi. Vì vậy, nếu chúng tôi không thể đảm bảo rằng có chỗ trong DTV, chúng tôi thậm chí không thử nó và không tải được.

Có một hằng số thời gian biên dịch (được gọi là DTV_SURPLUS, xem glibc-source / sysdeps / generic / ldsodefs.h) trong trình tải lib động của glibc để dành một số vị trí bổ sung cho một mớ hỗn độn như vậy (tải động các lib với TLS tĩnh trong đa luồng chương trình). Trong phiên bản glibc của Fedora 20, giá trị này là 14.

Đây là libs đầu tiên (chạy MATLAB) cần khe dtv trong trường hợp của tôi:

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

Có hơn 14 => quá nhiều => không còn khe trong dtv. Đó là những gì thông báo lỗi cố gắng nói với chúng tôi và đặc biệt là các công việc toán học.

Đối với hồ sơ: Để không vi phạm giấy phép của MATLAB, tôi đã không gỡ lỗi, dịch ngược hoặc tháo rời bất kỳ phần nào của tệp nhị phân được vận chuyển với MATLAB. Tôi chỉ gỡ lỗi các mã nhị phân glibc miễn phí và mở của Fedora 20 mà MATLAB đang sử dụng để tải động các lib.

Có thể làm gì, để giải quyết vấn đề này?

Có 3 lựa chọn:

(a) Xây dựng lại MATLAB và không tải động các lib đó (với mô hình tls ban đầu) thay vào đó liên kết chống lại chúng (sau đó trình liên kết có thể đếm các vị trí cần thiết!)

(b) Xây dựng lại các lib đó và đảm bảo chúng KHÔNG sử dụng mô hình tls ban đầu.

(c) Tạo lại glibc và tăng DTV_SURPLUS trong glibc / sysdeps / generic / ldsodefs.h

Rõ ràng là các phương án (a) và (b) chỉ có thể được thực hiện bởi các công việc toán học.

Đối với tùy chọn (c) không cần nguồn MATLAB và do đó có thể được thực hiện mà không cần các công việc toán học.

Tình trạng tại các công việc toán học là gì?

Tôi thực sự đã cố gắng giải thích điều này với "Bộ phận hỗ trợ kỹ thuật MathWorks". Nhưng ấn tượng của tôi là: họ không hiểu tôi. Họ đã đóng phiếu hỗ trợ của tôi và đề xuất một cuộc trò chuyện qua điện thoại (!) Vào tháng 1 năm 2014 với người quản lý hỗ trợ kỹ thuật.

Tôi sẽ cố gắng hết sức để giải thích điều này, nhưng thành thật mà nói: Tôi không tự tin lắm.

Cập nhật (2014/01/10): Hiện tại mathworks đang thử tùy chọn (b).

Cập nhật (2014/03/19): Đối với tệp libiomp5. nên bạn có thể tải xuống phiên bản mới được biên dịch (không có TLS tĩnh) tại mathworks, báo cáo lỗi 961964 . Và những người khác? Không có cải thiện ở đó. Vì vậy, đừng ngạc nhiên khi nhận được "dlopen: không thể tải thêm bất kỳ đối tượng nào có TLS tĩnh" với "doc", ví dụ: xem báo cáo lỗi 1003952 .


Tôi có thể xác nhận điều này, trong tài liệu mở Fedora 64bit của tôi sẽ gây ra lỗi khi tải BLAS. Ngay cả sau khi tăng Bộ nhớ đống Java lên 1Gb (tôi nghĩ là khá đủ) thì điều tương tự cũng xảy ra.
MeloMCR

Tôi có thể xác nhận sự cố này trên openSUSE 13.1 (64 bit) và MATLAB R2013b, xem tại đây: mathworks.com/matlabcentral/newsreader/view_thread/332791 . Cho đến nay, không có giải pháp khả thi !!!
michal

11
Cảm ơn những cái (10) * cái (10); trong tệp startup.m: nó đã giải quyết được vấn đề của tôi vào lúc này. BTW lỗi này chỉ đơn giản là không thể tin được ...
Danduk82

Tôi gặp lỗi này với các tệp mex của riêng mình (được biên dịch bằng gfortran). Có cách nào tôi có thể xây dựng chúng khác nhau để tránh vấn đề này không? Các cờ bao gồm -fPIC mà tài liệu cho rằng nên sử dụng toàn cục-động thay vì TLS thực thi ban đầu.
robince

Tôi xác nhận sự cố này trên Ubuntu 12.04 64bit. Và việc thay thế thư viện bằng thư viện trong báo cáo lỗi đã giải quyết được vấn đề. +1
NKN

27

Khởi động lại Matlab đã giải quyết được vấn đề cho tôi.


Tôi đã thấy hành vi tương tự. Sau lần khởi động đầu tiên, matlab phát ra thông báo lỗi ở trên. Sau khi khởi động lại, lỗi không xuất hiện lại. Lỗi không xuất hiện trở lại sau khi khởi động lại thứ hai, và điều này có thể được lặp đi lặp lại. Nó liên tục xuất hiện lại sau lần khởi động đầu tiên, thứ ba, thứ năm, ... của matlab.
Christoph

1
Đối với tôi nó cũng giải quyết được vấn đề của tôi. Nhưng đánh giá cao người dùng2898218 vì đã chia sẻ tất cả những điều đó.
desmond 13

Không làm việc cho tôi trên OpenSuse 42.1 Leap với Matlab R2016b
Sameer

6

câu chuyện ngắn: trong thư mục mà bạn khởi động matlab từ tạo một tệp startup.m có nội dung ones(10)*ones(10);. Khởi động lại matlab và nó sẽ được chăm sóc.


Hoạt động tốt cho tôi !! Cảm ơn!
dùng2230101

5

Theo tôi thấy, đây là một vấn đề lâu đời chưa được MathWorks giải quyết.

Đây là hai xu của tôi, phù hợp với tôi (khi tôi muốn có các thư viện bên ngoài IT ++, với MEX).


Hãy để thư viện mà bạn tìm thấy là nguyên nhân của sự cố là "libXYZ.so" và bạn biết nó nằm ở đâu trên hệ thống của bạn.

Giải pháp là thông báo cho MATLAB tải thư viện cụ thể sớm nhất khi khởi động. Lý do cho lỗi này rõ ràng là do thiếu khe cắm cho mục đích thread local storagecòn gọi là này tls(do chúng đã được lấp đầy).

Vì các bản tổng hợp mới nhất đột nhiên yêu cầu một thư viện mới chưa được tải trước đó trong quá trình khởi động, MATLAB sẽ phát sinh lỗi này.

Đáng tiếc rằng MATLAB không bao giờ quan tâm để giải quyết vấn đề này quá lâu.

May mắn thay, giải pháp là một lệnh đầu cuối duy nhất, rất đơn giản.


Các bước điển hình trên máy linux phải như sau:

  1. Mở dấu nhắc lệnh ( Ctrl+Alt+Ttrong Ubuntu)
  2. Phát hành lệnh sau

    xuất LD_PRELOAD = <PATH-TO-libxyz.so>

ví dụ: export LD_PRELOAD=/usr/local/lib/libitpp.so

  1. Bắt đầu matlab từ cùng một thiết bị đầu cuối

    matlab &

Chạy chương trình của bạn ngay bây giờ sẽ giải quyết được vấn đề, như trường hợp của tôi.

Chúc may mắn!


Tài liệu tham khảo:

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


đây là một giải pháp cho tôi trong một cài đặt hoàn toàn khác: Problem.dlang.org/show_bug.cgi?id=17061
timotheecour

cảm ơn! giải pháp duy nhất phù hợp với tôi (và giải pháp đơn giản nhất). Tôi đang sử dụng một số thư viện bên ngoài mà không có mã nguồn. Điều hài hước là vấn đề vẫn còn tồn tại trong Matlab 2016b ...
foxfireee

4

http://www.mathworks.de/support/bugreports/961964 đã được cập nhật vào ngày 30/01/2014. Có một tệp zip được đính kèm với libiomp5. Vì vậy, tôi đã thử nghiệm nó trên Mageia 4 x86_64 với Matlab R2013b. Bây giờ tôi có thể sử dụng Tài liệu của Matlab để mở bản demo mà không gặp bất kỳ vấn đề gì.


1
Xin vui lòng đăng giải pháp cũng vì liên kết có thể không hoạt động bất cứ lúc nào.
Lakshmi

giải pháp là một tệp phụ cho giấy phép của MathWorks. Chúng tôi không thể phân phối lại nó và họ tự xây dựng nó, vì vậy không có cách nào để "đăng giải pháp". Ngoài ra, nó không hoạt động đối với tôi: Nó phải được sửa cho R2014b, nhưng tôi vẫn gặp lỗi.
bay cừu

3

Tôi đã có cùng một vấn đề và tôi nghĩ rằng tôi chỉ cần giải quyết nó.

Khi cài đặt matlab, hãy sử dụng cài đặt tùy chỉnh (tôi đã không làm điều này lần đầu tiên). Chọn để tạo các liên kết tượng trưng đến các tập lệnh matlab trong thư mục được xác định trước (/ usr / local / bin). Điều này đã làm các mẹo cho tôi!


những liên kết này tạo ra? Tôi đã liên kết thủ công tất cả các tập lệnh mà không có phần mở rộng .sh ở đó và lỗi vẫn còn.
bay cừu

3

Tôi đã gặp vấn đề tương tự với cả Matlab 2013b và Matlab 2014a. Bản sửa lỗi do mathworks cung cấp cho libiomp5.so chỉ loại bỏ vấn đề LAPACK không hoạt động. Tuy nhiên, tôi không thể sử dụng các thư viện bên ngoài đang sử dụng OpenMp (chẳng hạn như VL_FEAT): Tôi vẫn gặp lỗi "dlopen: không thể tải thêm bất kỳ đối tượng nào bằng TLS tĩnh."

Điều duy nhất phù hợp với tôi là hạ cấp xuống Matlab 2012b.


Gặp sự cố tương tự khi tải libmwosgserver.so trong Matlab 2014a. Nhưng đã hoạt động khi tôi hạ cấp xuống Matlab 2013b.
Temak

2

Tôi đã gặp vấn đề này sau khi "bar" (đối với các ô thanh) với một mảng chỉ cho tôi một khối màu xanh duy nhất, không có lỗi nào được ném ra. Khởi động lại lúc đầu đã giải quyết được vấn đề. Nhưng sau một lỗi bộ nhớ (sau khi xử lý một tệp rất lớn), tôi không thể vượt qua sự cố khối màu xanh này.

Sử dụng "lịch sử" trên đầu vào ma trận mang lại cho tôi vấn đề "lỗi tải BLAS" và dẫn tôi đến chủ đề này. Giải pháp Mathwork đã khắc phục các vấn đề về lịch sử và thanh.

Chỉ muốn mang lại sự công nhận về mức độ ảnh hưởng của con bọ này.


0

Tôi đã gặp vấn đề tương tự và đã giải quyết nó bằng cách tăng bộ nhớ Java Heap của mình. Đi tới Tùy chọn> Chung> Bộ nhớ Java-Heap và tăng bộ nhớ được cấp phát.


0

Tăng bộ nhớ heap Java (lên 512 mb) cũng hoạt động đối với tôi trên R2013b / Ubuntu 12.04. "Lỗi tải BLAS" bắt đầu khi tôi xử lý tệp 11 GB (với RAM 16 GB) và không tái diễn sau khi tăng bộ nhớ heap java và khởi động lại matlab.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.