2013-07-14 41 views
6

Tôi đang khám phá thư viện Armadillo C++ cho đại số tuyến tính tại thời điểm này. Theo tôi hiểu, nó sử dụng thư viện LAPACK/BLAS cho các phép toán ma trận cơ bản (ví dụ: nhân ma trận). Là người dùng Windows, tôi đã tải xuống LAPACK/BLAS từ đây: http://icl.cs.utk.edu/lapack-for-windows/lapack/#running. Vấn đề là phép nhân ma trận rất chậm so với Matlab hoặc thậm chí R. Ví dụ, Matlab nhân hai ma trận 1000x1000 trong ~ 0.15 giây trên máy tính của tôi, R cần ~ 1 giây, trong khi C++/Armadillo/LAPACK/BLAS cần nhiều hơn 10 giây cho điều đó.LAPACK nhanh/BLAS cho phép nhân ma trận

Vì vậy, Matlab dựa trên các thư viện được tối ưu hóa cao cho đại số tuyến tính. Câu hỏi của tôi là nếu có tồn tại LAPACK/BLAS nhanh hơn để sử dụng từ Armadillo? Ngoài ra, có cách nào để trích xuất các thư viện đại số tuyến tính Matlab bằng cách nào đó và sử dụng chúng trong C + +?

+2

Nếu bạn đặt -1, vui lòng cho tôi gợi ý về cách cải thiện câu hỏi của tôi. – Kasablanca

Trả lời

12

LAPACK không làm phép nhân ma trận. Đó là BLAS cung cấp phép nhân ma trận.

Nếu bạn có hệ điều hành 64 bit, tôi khuyên bạn trước tiên hãy thử phiên bản BLA 64 bit. Điều này sẽ giúp bạn tăng gấp đôi hiệu suất ngay lập tức.

Thứ hai, hãy xem triển khai BLAS hiệu suất cao, chẳng hạn như OpenBLAS. OpenBLAS sử dụng cả vectorisation và parallelisation (nghĩa là đa lõi). Đây là một dự án mã nguồn mở miễn phí (miễn phí).

Matlab sử dụng nội bộ thư viện Intel MKL mà bạn cũng có thể sử dụng với Armadillo library. Intel MKL là nguồn đóng, nhưng miễn phí cho mục đích phi thương mại. Lưu ý rằng OpenBLAS có thể nhận được hiệu suất nhân ma trận ngang bằng hoặc tốt hơn so với Intel MKL.

Lưu ý rằng đại số tuyến tính hiệu suất cao thường dễ thực hiện hơn trên Linux và Mac OS X so với trên Windows.

+0

Cảm ơn bạn đã trả lời toàn diện! – Kasablanca

+0

Tôi nghĩ câu cuối cùng của bạn là sai. Ví dụ, MATLAB nhanh hơn trên Windows so với trên Linux. Nói chung, Intel MKL nhanh hơn trên Windows. – Royi

+0

MKL dành cho Windows và Linux sử dụng cùng một mã cơ sở – mtall

1

là có một cách để trích xuất Matlab thư viện đại số tuyến tính bằng cách nào đó và sử dụng chúng trong C++ Vâng, cho chức năng gọi MATLAB C++, hãy tham khảo link này: How to Call Matlab Functions from C++

+0

Trình biên dịch Matlab tốn rất nhiều chi phí! – alexbuisson

+0

@alexbuisson Sau đó, tại sao MATLAB? Tôi biết một thư viện đại số tuyến tính nữa, BLAS, phù hợp cho tính toán hiệu suất cao. – lulyon

+0

Có đó là lý do tại sao tôi sử dụng Octave. Nó chỉ là một nhận xét cần lưu ý rằng Matlab IDE và Compiler là 2 thứ khác nhau. – alexbuisson

4

Thêm vào những gì đã được nói, bạn cũng nên sử dụng một mức độ cao về tối ưu hóa:

  1. Hãy chắc chắn để sử dụng một trong hai O2 hoặc O3 biên dịch cờ.

  2. Link to the nêu trên hiệu suất cao (và có thể đa luồng) BLAS thư viện. AFAIK MKL chỉ tự do có sẵn cho các nền tảng Unix, nếu bạn đang sử dụng một hộp Linux như Cygwin bên trong cửa sổ, điều này sẽ là OK sau đó tôi đoán. OpenBLAS cũng là đa luồng.

  3. Trong nhiều thư viện, đặt biểu tượng NDEBUG (ví dụ: chuyển cờ trình biên dịch -DNDEBUG) sẽ tắt kiểm tra và xác nhận phạm vi tốn kém.Armadillo có biểu tượng riêng của nó, được gọi là ARMA_NO_DEBUG, bạn có thể đặt thủ công hoặc bạn có thể chỉnh sửa tệp tiêu đề config.hpp (nằm trong thư mục armadillo bao gồm) và bỏ ghi chú dòng tương ứng. Tôi đoán kể từ khi bạn đã có thể bật sử dụng BLAS bên ngoài trong armadillo, bạn nên làm quen với tập tin cấu hình này anyways ...

Tôi đã làm một so sánh nhanh giữa armadillo/MKL_BLAS và Matlab trên lõi intel của tôi -i7 máy trạm. Đối với exe C++ tôi đã sử dụng -O3, MKL BLAS và đã định nghĩa ARMA_NO_DEBUG. Tôi nhân 1000x1000 ma trận ngẫu nhiên 100 lần và tính trung bình số lần nhân. Việc triển khai C++ nhanh hơn gấp 1,5 lần so với MATLAB.

Hy vọng điều này sẽ giúp

Các vấn đề liên quan