2009-07-01 35 views
14

Tôi đang viết một phần mềm cho phương trình vi phân từng phần hyperbol trong C++. Hầu như tất cả các ký hiệu là vector và ma trận. Trên hết, tôi cần bộ giải thuật đại số tuyến tính. Và có, kích thước của vectơ và ma trận có thể thay đổi đáng kể (từ 1000 đến kích cỡ có thể được giải quyết chỉ bằng tính toán bộ nhớ phân tán, ví dụ như cụm hoặc kiến ​​trúc tương tự). Nếu tôi đã sống trong không tưởng, tôi đã có bộ giải mã tuyến tính có quy mô lớn cho các cụm, GPU và đa lõi.ublas so với thư viện mẫu ma trận (MTL4)

Khi suy nghĩ về cấu trúc dữ liệu cần đại diện cho các biến, tôi đã truy cập boost.ublas và MTL4. Cả hai thư viện đều tương thích với cấp độ 3, MTL4 thực hiện giải quyết thưa thớt và nhanh hơn nhiều so với ublas. Cả hai đều không thực hiện hỗ trợ cho các bộ xử lý đa lõi, chưa kể đến sự song song cho các tính toán bộ nhớ phân tán. Mặt khác, sự phát triển của MTL4 phụ thuộc vào nỗ lực duy nhất của 2 nhà phát triển (ít nhất là tôi hiểu), và tôi chắc chắn rằng có một lý do mà ublas đang ở trong thư viện tăng cường. Hơn nữa, thư viện mkl của intel bao gồm ví dụ về ràng buộc cấu trúc của chúng với ublas. Tôi muốn kết hợp dữ liệu và phần mềm của mình với cấu trúc dữ liệu sẽ được đá vững chắc, được phát triển và duy trì trong một khoảng thời gian dài.

Cuối cùng, câu hỏi. Kinh nghiệm của bạn với việc sử dụng ublas và/hoặc mtl4 là gì và bạn sẽ đề xuất điều gì?

thanx, mightydodol

+0

than lớn cho câu trả lời ... – dodol

+0

@mightydodol: bạn được hoan nghênh. Tôi đã thêm một liên kết đến một bài báo mà tôi đang tìm kiếm cả ngày. Bạn có thể thấy nó hấp dẫn. Ngoài ra sửa chữa một lỗi thực tế liên quan đến ScaLAPACK. – stephan

+0

thanx để chỉ ra eigen. @stephan Vâng, giấy thật sự thú vị. Hầu như cùng một vấn đề như tôi. – dodol

Trả lời

11

Với yêu cầu của bạn, tôi có lẽ sẽ đi cho BOOST::uBLAS. Thật vậy, một triển khai tốt của uBLAS nên gần ngang bằng với MTL4 về tốc độ.

Lý do là có tồn tại bindings cho ATLAS (song song do đó chia sẻ bộ nhớ mà bạn có hiệu quả có thể tối ưu hóa cho máy tính của bạn), và cũng có thể triển khai như Intel Math Kernel Library hoặc HP MLIB nhà cung cấp điều chỉnh.

Với các ràng buộc này, uBLAS với thư viện ATLAS/BLAS được điều chỉnh tốt để thực hiện phép toán phải đủ nhanh. Nếu bạn liên kết với BLAS/ATLAS, bạn nên ngang bằng với MTL4 được liên kết với cùng BLAS/ATLAS bằng cờ biên dịch -DMTL_HAS_BLAS và có khả năng nhanh hơn MTL4 không có BLAS theo số observation của riêng họ (ví dụ: xem here, nơi GotoBLAS hoạt động tốt hơn MTL4).

Tóm lại, tốc độ không phải là yếu tố quyết định của bạn miễn là bạn sẵn sàng sử dụng một số thư viện BLAS. Khả năng sử dụng và hỗ trợ là quan trọng hơn. Bạn phải quyết định xem liệu MTL hay uBLAS có phù hợp hơn với bạn hay không. Tôi có xu hướng hướng tới uBLAS cho rằng nó là một phần của BOOST, và MTL4 hiện chỉ hỗ trợ BLAS selectively. Bạn cũng có thể tìm thấy điều này một chút ngày comparison of scientific C++ packages thú vị.

Một NHƯNG lớn: cho yêu cầu của bạn (ma trận cực lớn), tôi có thể bỏ qua "đường cú pháp" uBLAS hoặc MTL và gọi giao diện "kim loại" C của BLAS/LAPACK trực tiếp. Nhưng đó chỉ là tôi ... Một ưu điểm khác là dễ dàng hơn là chuyển sang ScaLAPACK (bộ nhớ phân phối LAPACK, chưa bao giờ sử dụng nó) cho các vấn đề lớn hơn. Chỉ cần được rõ ràng: cho vấn đề giữ nhà, tôi sẽ không đề nghị gọi một thư viện BLAS trực tiếp.

1

Bạn có thể thấy sự khác biệt hiệu suất trực tiếp ở đây: http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3

Cả hai đều là các thư viện hợp lý để sử dụng về giao diện của họ, tôi không nghĩ rằng vì uBLAS đột phá vòng vây quá trình xem xét BOOST nó nhất thiết phải cách mạnh mẽ hơn .Tôi đã chia sẻ những cơn ác mộng của tôi với những tác dụng phụ không rõ ràng và những hậu quả không mong muốn từ việc triển khai uBLAS. Đó là không nói uBLAS là xấu, nó thực sự tốt, nhưng tôi nghĩ rằng sự khác biệt đáng kể cho MTL biểu diễn những ngày này, nó có giá trị sử dụng nó thay vì uBLAS mặc dù nó được cho là một chút nguy hiểm hơn bởi vì nó "chỉ có 2 nhà phát triển "nhóm hỗ trợ.

Vào cuối ngày, đó là tốc độ với thư viện ma trận, đi với MTL4.

8

Nếu bạn đang lập trình vectơ, ma trận, và đại số tuyến tính trong C++, tôi muốn nhìn vào Eigen:

http://eigen.tuxfamily.org/

Đó là nhanh hơn so với uBLAS (không chắc chắn về MTL4) và cú pháp sạch hơn nhiều.

+0

Eigen là thư viện ma trận duy nhất bên cạnh ATLAS/LAPACK mà chúng tôi sử dụng. Nó là nhanh hơn đáng kể cho phép nhân ma trận cho ma trận nhỏ hơn (dưới 100 hàng) và so sánh hiệu suất với một BLAS ATLAS/không được điều chỉnh tiêu chuẩn cho các ma trận lớn hơn (miễn là bộ xử lý hỗ trợ các lệnh SSE). Tuy nhiên, nó chậm hơn đáng kể so với ATLAS/LAPACK đối với đại số tuyến tính nâng cao (ví dụ: phân tích LU) cho các ma trận lớn hơn và không hỗ trợ các bộ vi xử lý đa lõi. – stephan

+0

Tôi có sai, hoặc Eigen thiếu hỗ trợ cho các ma trận phức tạp? –

+0

@quant_dev: Tôi tin đó là chính xác, mặc dù tôi nghi ngờ các nhà phát triển sẽ sẵn lòng giúp đỡ điều đó. Tôi không phải là một trong những nhà phát triển. –

0

Có phiên bản MTL4 song song. Chỉ cần có một cái nhìn tại simunova

1

Từ kinh nghiệm của riêng tôi, MTL4 nhanh hơn nhiều so với uBLAS và nó cũng nhanh hơn Eigen.

2

Có một C++ thư viện còn thiếu trong danh sách này: FLENS

http://flens.sf.net

Disclaimer: Vâng, đây là con tôi

  • Đó là tiêu đề chỉ
  • Đi kèm với một đơn giản, không thực hiện, chung chung (tức là templated) C++ tham chiếu thực hiện BLAS.
  • Nếu có, bạn có thể sử dụng triển khai BLAS được tối ưu hóa làm phụ trợ. Trong trường hợp này, nó giống như sử dụng BLAS trực tiếp (some Benchmark I should update).
  • Bạn có thể sử dụng overloaded operators instead of calling BLAS functions.
  • Nó đi kèm với riêng, độc lập, thực hiện lại chung của một loạt các chức năng LAPACK. Chúng tôi gọi đây là cổng FLENS-LAPACK.
  • FLENS-LAPACK có độ chính xác và hiệu suất giống như LAPACK của Netlib. Và trong kinh nghiệm của tôi (FLENS-) LAPACK + ATLAS hoặc (FLENS-) LAPACK + OpenBLAS mang lại cho bạn hiệu suất tương tự như ACML hoặc MKL.
  • FLENS có chính sách khác liên quan đến việc tạo các vector/ma trận tạm thời trong việc đánh giá các biểu thức đại số tuyến tính. Chính sách FLENS là: Không bao giờ tạo chúng !!!. Tuy nhiên, trong một special debug-mode chúng tôi cho phép tạo ra các thời gian "khi cần thiết". Điều này "khi cần thiết" chính sách điều là mặc định trong các thư viện khác như Eigen hoặc Armadillo hoặc trong Matlab.
+0

Trang web của bạn sạch sẽ, nhưng tài liệu rất khó ... ví dụ: làm thế nào để làm phân hủy eigen trên một ma trận đối xứng? Bảng tham khảo ngắn (ví dụ: Eigen) sẽ thu hút nhiều người dùng hơn, IMHO. – zhanxw

+0

Tổng quan về các hàm đại số tuyến tính có thể được tìm thấy trong [FLENS-LAPACK] (http://apfel.mathematik.uni-ulm.de/~lehn/FLENS/flens/lapack/lapack.html). Tuy nhiên, bạn đã đúng, tài liệu ở đây chưa hoàn chỉnh. Nó tập trung vào chức năng thường xuyên cần thiết cũng như một chức năng mà tôi đã chuyển sang FLENS/C++. Nhưng hầu hết/nhiều thói quen LAPACK khác có thể được sử dụng nếu thực thi LAPACK có sẵn. ... Tôi sẽ cố gắng dành thêm thời gian để viết và mở rộng tài liệu thêm. –

5

Đối với các dự án mới, tốt nhất nên tránh xa uBlas của Boost. Câu hỏi thường gặp về uBlas thậm chí có cảnh báo này kể từ cuối năm 2012:

Q: Tôi có nên sử dụng uBLAS cho các dự án mới không? ... cải tiến lớn cuối cùng của uBLAS là vào năm 2008 và không có thay đổi đáng kể nào được cam kết kể từ năm 2009. ... Hiệu suất? Có lựa chọn thay thế nhanh hơn. Cắt cạnh? uBLAS đã hơn 10 tuổi và bỏ lỡ tất cả những thứ mới từ C++ 11.

+0

kể từ năm 2013, đây là thông tin có giá trị. Một cái gì đó hoàn toàn không liên quan đến chủ đề của bài đăng này: tôi nghĩ rằng từ "thay thế" bao gồm một hoặc tất cả các khả năng, về những thứ, mệnh đề hoặc các hành động (vì vậy không cần dạng số nhiều) tức là thư viện thay thế nhanh hơn. – dodol

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