Helpex - Trao đổi & giúp đỡ Đăng nhập
76

Kể từ một vài ngày, tôi liên tục nhận được lỗi tương tự trong khi sử dụng MATLAB xảy ra tại một số điểm với dlopen. Tôi khá mới mẻ 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 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 trong khi thực hiện 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 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-fifts-from-mex-files.html

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

Ví dụ về các cuộc gọi chức năng chứng minh 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
76 hữu ích 2 bình luận 65k xem chia sẻ
103

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

Cho đến bây giờ cách giải quyết duy nhất của toán học là tải các lib quan trọng (!) Trước tiên bằng cách sử dụng chúng sớm (họ đề nghị đặt "cái (10) * cái (10);" trong startup.m). Tôi tốt hơn 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à: Đừ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 đây đã đượ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, xem Ulrich Drepper, xử lý ELF cho Lưu trữ cục bộ luồng , Phiên bản 0.21, 2013, hiện có sẵn tại AkkadiaRedhat .

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

MATLAB tự độ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 (vector luồng động). Bởi vì MATLAB tải một số lib này một cách linh hoạt khi chạy ở thời gian biên dịch / liên kết, trình liên kết (tại mathworks) 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 để 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 dễ dàng. Để trích dẫn dl-open.c:

Đối với TLS tĩnh, chúng ta phải phân bổ bộ nhớ ở đây và ngay bây giờ. Điều này bao gồm phân bổ 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 DTV 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ử 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 để đặt một số vị trí bổ sung cho một mớ hỗn độn đó (tải động libs với TLS tĩnh chương trình). Trong phiên bản glibc của Fedora 20, giá trị này là 14.

Dưới đây là các lib đầu tiên (chạy MATLAB) cần các 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ó nhiều hơn 14 => quá nhiều => không còn chỗ trống 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à mathworks.

Đố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 các tệp nhị phân được vận chuyển bằng MATLAB. Tôi chỉ gỡ lỗi các 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 vớ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) Xây dựng lại glibc và tăng DTV_SURPLUS trong glibc / sysdeps / generic / ldsodefs.h

Rõ ràng các tùy chọn (a) và (b) chỉ có thể được thực hiện bằng mathworks.

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

Tình trạng tại mathworks là gì?

Tôi thực sự đã cố gắng giải thích điều này với "Phòng 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 vé 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ẽ làm hết sức mình để 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.so 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 . Còn các lib 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 bằng TLS tĩnh" bằng "doc", ví dụ: xem báo cáo lỗi 1003952 .

103 hữu ích 5 bình luận chia sẻ
27

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

27 hữu ích 4 bình luận chia sẻ
6

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

6 hữu ích 1 bình luận chia sẻ
4

http://www.mathworks.de/support/orpreports/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.so tôi đã thử 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 vấn đề gì.

4 hữu ích 2 bình luận chia sẻ
4

Như 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, hoạt động cho tôi (khi tôi muốn các thư viện bên ngoài IT ++, với MEX).


Hãy để thư viện mà bạn thấy là nguyên nhân của vấn đề 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 các vị trí cho mục đích thread local storageaka này tls(do chúng đã được lấp đầy).

Bởi vì các phần tổng hợp mới nhất đột nhiên yêu cầu một thư viện mới không được tải trước đó trong quá trình khởi động, MATLAB đã khắc phục lỗi này.

Đáng tiếc là 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 tiêu biểu trên máy linux phải như sau:

  1. Mở dấu nhắc lệnh ( Ctrl+Alt+Ttrong Ubuntu)
  2. Ban 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

    chiếu &

Chạy chương trình của bạn bây giờ sẽ giải quyết vấn đề, vì đó là 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-probols

4 hữu ích 2 bình luận chia sẻ
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 (lần đầu tiên tôi không làm điều này). 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ừa tôi!

3 hữu ích 1 bình luận chia sẻ
3

Tôi gặp vấn đề tương tự với cả Matlab 2013b và Matlab 2014a. Bản sửa lỗi được cung cấp bởi mathworks cho libiomp5.so chỉ loại bỏ sự cố 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 làm việc cho tôi là hạ cấp xuống Matlab 2012b.

3 hữu ích 1 bình luận chia sẻ
2

Tôi đã gặp vấn đề này sau khi "thanh" (đối với các ô vạch) 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 đưa ra. Khởi động lại lúc đầu đã giải quyết 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 vấn đề khối màu xanh này.

Sử dụng "hist" trên đầu vào ma trận cho tôi vấn đề "lỗi tải BLAS" và đưa tôi đến chủ đề này. Cách giải quyết Mathwork đã sửa các vấn đề về lịch sử và thanh.

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

2 hữu ích 1 bình luận chia sẻ
0

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

0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ matlab libraries lapack blas dlopen , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading